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