搜索
bottom↓
回复: 15

请教采用rt_thread_create创建线程失败

[复制链接]

出0入0汤圆

发表于 2010-4-10 16:06:50 | 显示全部楼层 |阅读模式
采用rt_thread_create在动态堆内存中创建一个线程,程序运行到rt_hw_stack_init出现ARM取数据异常处理,调试跟踪程序看到可以正确从内存堆里面分配空间,不知为何总是运行到rt_hw_stack_init就出现取数据异常,同样的线程如果采用rt_thread_init静态初始化,在目标板上能够运行成功,问题大致出在哪个地方呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-4-10 16:13:25 | 显示全部楼层
你的栈空间开得奇小?

出0入0汤圆

 楼主| 发表于 2010-4-10 16:30:48 | 显示全部楼层
int  rt_application_init(void)
{
/*
        rt_thread_init(&led,
                "led",
                led_thread_entry, RT_NULL,
                &led_thread_stack[0], 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的画面,运行下一句就出出现取数据异常了,再帮我看看问题出在哪里呢?


(原文件名:error.JPG)

出0入0汤圆

发表于 2010-4-10 16:34:04 | 显示全部楼层
rtconfig.h中有没有打开动态内存管理?
/* Using Dynamic Heap Management*/
#define RT_USING_HEAP

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

出0入0汤圆

 楼主| 发表于 2010-4-10 16:38:03 | 显示全部楼层
有打开,
也有做初始化动作:rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);

出0入0汤圆

发表于 2010-4-10 16:51:55 | 显示全部楼层
你的是什么平台?怎么看上面这句怪怪的。

出0入0汤圆

 楼主| 发表于 2010-4-10 16:55:29 | 显示全部楼层
用的是新塘的ARM7 W90P710,现在有个项目准备用RT-Thread,现在就是这个动态创建线程还不行,如果用静态方式就可以正确运行程序,还在查不知道问题出在哪里

出0入0汤圆

发表于 2010-4-10 17:47:49 | 显示全部楼层
原来是W90P710,这个还真不太好说,不知道你移植情况是如何的,你还是先仔细检查你的移植吧,是否某些参数设置得不对。

出0入0汤圆

发表于 2010-4-10 18:09:57 | 显示全部楼层
我今天在IARARM中就是遇到这样的问题,rt_thread_create(),就出现堆栈溢出。
用初始化时就无问题!
现在都未搞明白!

出0入31汤圆

发表于 2010-4-11 18:41:28 | 显示全部楼层
rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);
首先要搞清楚这个函数的几个参数的含义。
0x1000000是什么地址?

出0入0汤圆

发表于 2010-4-12 07:49:41 | 显示全部楼层
目前这个状况不是太好查,如果有能够仿真的,把代码传上来就好了。IAR用得少,或许确实遗漏了些问题,但IAR的软仿是个问题。

出0入0汤圆

 楼主| 发表于 2010-4-12 09:56:03 | 显示全部楼层
问题已经解决了,系统硬件配置是NOR FLASH 4M,SDRAM 16M,增大rt需要的堆空间起始地址,避免与编译器设定的SP地址重叠

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

出0入0汤圆

发表于 2010-4-12 10:01:34 | 显示全部楼层
回复【11楼】fsmcu  
对rt_kprintf还有点疑惑,函数里面没有采用共享资源互斥条件,如果有多个线程同时操作rt_kprintf从串口输出数据那不是会出现问题,这是如何做到的呢?
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2010-4-12 11:27:02 | 显示全部楼层
刚测试了一下finsh命令:list_thread(),怎么输出的是Null node,没有显示出手册里面提到的系统线程当前状态,是哪里没有配置正确吗?

出0入0汤圆

发表于 2010-4-12 11:31:06 | 显示全部楼层
使用list() 看看有没有这条命令.
如果没有,在链接选项里面加入 " --keep __fsym_* --keep __vsym_* "

出0入0汤圆

 楼主| 发表于 2010-4-12 11:36:33 | 显示全部楼层
哦,按照上面的操作OK了,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-1 03:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表