fsmcu 发表于 2010-4-10 16:06:50

请教采用rt_thread_create创建线程失败

采用rt_thread_create在动态堆内存中创建一个线程,程序运行到rt_hw_stack_init出现ARM取数据异常处理,调试跟踪程序看到可以正确从内存堆里面分配空间,不知为何总是运行到rt_hw_stack_init就出现取数据异常,同样的线程如果采用rt_thread_init静态初始化,在目标板上能够运行成功,问题大致出在哪个地方呢?

ffxz 发表于 2010-4-10 16:13:25

你的栈空间开得奇小?

fsmcu 发表于 2010-4-10 16:30:48

intrt_application_init(void)
{
/*
        rt_thread_init(&led,
                "led",
                led_thread_entry, RT_NULL,
                &led_thread_stack, sizeof(led_thread_stack),
                8, 20);
       
        rt_thread_startup(&led);
*/
       
//*
        rt_thread_t init_thread;

        init_thread = rt_thread_create("led",
                                     led_thread_entry, RT_NULL,
                                     2048, 8, 20);

        if (init_thread != RT_NULL) rt_thread_startup(init_thread);
//*/

        return 0;
}

线程栈空间为2048,为何用rt_thread_init就可以运行正常,是同样的线程,并且初始化参数都一样

下面截图是用JLINK仿真调试运行到rt_hw_stack_init的画面,运行下一句就出出现取数据异常了,再帮我看看问题出在哪里呢?

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_545353.JPG
(原文件名:error.JPG)

aozima 发表于 2010-4-10 16:34:04

rtconfig.h中有没有打开动态内存管理?
/* Using Dynamic Heap Management*/
#define RT_USING_HEAP

你的剩余内存是否被 rt_system_heap_init() 正确初始化?

fsmcu 发表于 2010-4-10 16:38:03

有打开,
也有做初始化动作:rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);

ffxz 发表于 2010-4-10 16:51:55

你的是什么平台?怎么看上面这句怪怪的。

fsmcu 发表于 2010-4-10 16:55:29

用的是新塘的ARM7 W90P710,现在有个项目准备用RT-Thread,现在就是这个动态创建线程还不行,如果用静态方式就可以正确运行程序,还在查不知道问题出在哪里

ffxz 发表于 2010-4-10 17:47:49

原来是W90P710,这个还真不太好说,不知道你移植情况是如何的,你还是先仔细检查你的移植吧,是否某些参数设置得不对。

cyxavr 发表于 2010-4-10 18:09:57

我今天在IARARM中就是遇到这样的问题,rt_thread_create(),就出现堆栈溢出。
用初始化时就无问题!
现在都未搞明白!

zchong 发表于 2010-4-11 18:41:28

rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);
首先要搞清楚这个函数的几个参数的含义。
0x1000000是什么地址?

ffxz 发表于 2010-4-12 07:49:41

目前这个状况不是太好查,如果有能够仿真的,把代码传上来就好了。IAR用得少,或许确实遗漏了些问题,但IAR的软仿是个问题。

fsmcu 发表于 2010-4-12 09:56:03

问题已经解决了,系统硬件配置是NOR FLASH 4M,SDRAM 16M,增大rt需要的堆空间起始地址,避免与编译器设定的SP地址重叠

对rt_kprintf还有点疑惑,函数里面没有采用共享资源互斥条件,如果有多个线程同时操作rt_kprintf从串口输出数据那不是会出现问题,这是如何做到的呢?

ffxz 发表于 2010-4-12 10:01:34

回复【11楼】fsmcu
对rt_kprintf还有点疑惑,函数里面没有采用共享资源互斥条件,如果有多个线程同时操作rt_kprintf从串口输出数据那不是会出现问题,这是如何做到的呢?
-----------------------------------------------------------------------

会有问题,所以rt_kprintf是一个不安全的信息输出方式。但这个也是设计的初衷,因为如果这个过程任何地方加了锁,对系统性能都会有影响。

fsmcu 发表于 2010-4-12 11:27:02

刚测试了一下finsh命令:list_thread(),怎么输出的是Null node,没有显示出手册里面提到的系统线程当前状态,是哪里没有配置正确吗?

aozima 发表于 2010-4-12 11:31:06

使用list() 看看有没有这条命令.
如果没有,在链接选项里面加入 " --keep __fsym_* --keep __vsym_* "

fsmcu 发表于 2010-4-12 11:36:33

哦,按照上面的操作OK了,谢谢
页: [1]
查看完整版本: 请教采用rt_thread_create创建线程失败