RTEMS4.11 / newlib / gcc issue on Sparc / LEON3

Hoefle Marco Marco.Hoefle at nanotronic.ch
Tue Oct 14 15:07:40 UTC 2014


Hello again,
I had this memory aligned failure and I thought it is fixed with the new
newlib version.
We have now a new strange phenomena: A local variable is overwritten in
a thread when the command "ls" is executed in the rtems shell:


Starting 1 threads...
started thread 0: id: 0x0b010002, prio: 10
 =========================
 starting shell
 =========================

RTEMS SHELL (Ver.1.0-FRC):/dev/console. Oct 14 2014. 'help' to list
commands.
[/] # hello dude, this is tick nr: 1
hello dude, this is tick nr: 2
hello dude, this is tick nr: 3
hello dude, this is tick nr: 4
hello dude, this is tick nr: 5
hello dude, this is tick nr: 6

[/] # 
[/] # 
[/] # ls
dev
hello dude, this is tick nr: 0
hello dude, this is tick nr: 1
hello dude, this is tick nr: 2
hello dude, this is tick nr: 3

[/] # ls
dev
hello dude, this is tick nr: 0

[/] # 
hello dude, this is tick nr: 1
hello dude, this is tick nr: 2
hello dude, this is tick nr: 3
hello dude, this is tick nr: 4
hello dude, this is tick nr: 5
hello dude, this is tick nr: 6
hello dude, this is tick nr: 7


This will be the simple rtems4.11 test app:


#include <bsp.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include <rtems/shell.h>
#include <errno.h>

#include "rtems_config.h"


void *tsk_core(void *unused);
void *tsk_dummy(void *unused);


struct {
	int prio;
	void *(*func)(void *arg);
	pthread_t id;
}static threads[] = {
		{ .prio = 10, .func = tsk_core },
//		{ .prio = 3, .func = tsk_shell }, /* minimum prio */
//		{ .prio = 10, .func =tsk_spw0 },
//		{ .prio = 10, .func = tsk_spw1 },
//		{ .prio = 2, .func = tsk_script },
//		{ .prio = 3, .func = tsk_shell }, /* minimum prio */
//		{ .prio = 3, .func = tsk_dummy }, /* minimum prio */
};

static uint8_t nr_threads = sizeof(threads) / sizeof(threads[0]);


void start_shell(void)
{
	rtems_status_code sc = RTEMS_SUCCESSFUL;
	printf(" =========================\n\r");
	printf(" starting shell\n\r");
	printf(" =========================\n\r");


	sc = rtems_shell_init(
		"SHLL", /* task name */
		0, /* task stack size */
		100, /* task priority */
		"/dev/console", /* device name */
		true, /* run forever */
		true, /* wait for shell to terminate */
		NULL /* login check function,
		use NULL to disable a login check */
	);

	printf("sc: %d, errno: %s\n\r", sc, strerror(errno));
}


void hello_dude(int ticks)
{
	printf("hello dude, this is tick nr: %d\n\r", ticks);
}


void *tsk_core(void *unsued)
{
	int ticks = 1;
	while (1) {
		sleep(10);
		hello_dude(ticks++);
	}

	return NULL;
}

static int initUart( const char *devname)
{
    int fd = open( devname, O_RDWR);
    if (fd < 0) {
        return -errno;
    }

    struct termios settings;
    tcgetattr( fd, &settings);
    settings.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
                    | INLCR | IGNCR | ICRNL | IXON);
    settings.c_oflag &= ~OPOST;
    settings.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
    settings.c_cflag &= ~(CSIZE | PARENB);
    settings.c_cflag |= CS8;
    settings.c_cc[VMIN]  = 1;
    settings.c_cc[VTIME] = 0;

    if(cfsetispeed(&settings, B115200) < 0 || cfsetospeed(&settings,
B115200) < 0) {
        return -1;
    }

    int err = tcsetattr( fd, TCSADRAIN, &settings);
    if (err) return -err;

    return fd;
}

void *POSIX_Init(void *argument)
{
	pthread_attr_t attr;
	struct sched_param schedparam;
	int retVal;


	initUart("/dev/console");

	retVal = pthread_attr_init(&attr);
	retVal |= pthread_attr_getschedparam(&attr, &schedparam);
	retVal |= pthread_attr_setinheritsched(&attr,
PTHREAD_EXPLICIT_SCHED);
	retVal |= pthread_attr_setschedpolicy(&attr, SCHED_RR);
	if (retVal) {
		printf("thread setup failed!\n\r");
	}

	if(retVal == 0) {
		/* starting threads */
		printf( "Starting %d threads...\n\r", nr_threads);

		for (uint8_t i = 0; i < nr_threads; i++) {
			schedparam.sched_priority = threads[i].prio;
			retVal |= pthread_attr_setschedparam(&attr,
&schedparam);
			retVal |= pthread_create(&threads[i].id, &attr,
threads[i].func, NULL);

			if (retVal)
			{
				printf("thread creation failed!\n\r");

				// cancel loop
				i = nr_threads;
			}
			printf( "started thread %d: id: 0x%08x, prio:
%d\n\r", i, threads[i].id, threads[i].prio);
		}
	}

	start_shell();

	return NULL;
}

I'll be happy to provide the c files, retms config and Makefile as an
email attachment if somebody is interested.

Marco







More information about the users mailing list