rt-thread创建动态线程失败
来源:互联网 发布:2016淘宝开店步骤 编辑:程序博客网 时间:2024/06/08 08:45
采用rt_thread_create在动态堆内存中创建一个线程,此动态线程创建任务是初始化两个静态线程,创建失败,而用直接初始化静态线程却可以,过程如下:
一个动态线程初始化两个静态线程,不OK:
int rt_application_init(void){ rt_thread_t init_thread= RT_NULL;#if (RT_THREAD_PRIORITY_MAX == 32) init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 8, 20);#else init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 80, 20);#endif if (init_thread != RT_NULL) rt_thread_startup(init_thread); else return -1; return RT_EOK;}
直接初始化两个静态线程,OK:
int rt_application_init(void){ rt_err_t result; /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */ result = rt_thread_init(&thread_test1, "test1", test1_thread_entry, RT_NULL, (rt_uint8_t*)&thread1_stack[0], sizeof(thread1_stack),15, 2); if (result == RT_EOK) { rt_thread_startup(&thread_test1); } /* 创建静态线程 : 优先级 16 ,时间片 1个系统滴答 */ result = rt_thread_init(&thread_test2, "test2", test2_thread_entry, RT_NULL, (rt_uint8_t*)&thread2_stack[0], sizeof(thread2_stack), 16,1); if (result == RT_EOK) { rt_thread_startup(&thread_test2); } }动态线程代码:
void rt_init_thread_entry(void* parameter){ rt_err_t result; /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */ result = rt_thread_init(&thread_test1, "test1", test1_thread_entry, RT_NULL, (rt_uint8_t*)&thread1_stack[0], sizeof(thread1_stack),15, 2); if (result == RT_EOK) { rt_thread_startup(&thread_test1); } /* 创建静态线程 : 优先级 16 ,时间片 1个系统滴答 */ result = rt_thread_init(&thread_test2, "test2", test2_thread_entry, RT_NULL, (rt_uint8_t*)&thread2_stack[0], sizeof(thread2_stack), 16,1); if (result == RT_EOK) { rt_thread_startup(&thread_test2); } }
出现问题可能原因:
1.栈空间开得奇小
2.rtconfig.h中有没有打开动态内存管理?
/* Using Dynamic Heap Management*/
#define RT_USING_HEAP
3.剩余内存是否被 rt_system_heap_init() 正确初始化?
startup.c中 void rtthread_startup(void){......}有问题
rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);
最后发现是第三个原因。
void rtthread_startup(void){ /* init board */ rt_hw_board_init(); /* show version */ rt_show_version(); /* init tick */ rt_system_tick_init(); /* init kernel object */ rt_system_object_init(); /* init timer system */ rt_system_timer_init(); rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);//遗漏此处 /* init scheduler system */ rt_system_scheduler_init(); /* init application */ rt_application_init(); /* init idle thread */ rt_thread_idle_init(); /* start scheduler */ rt_system_scheduler_start(); /* never reach here */ return ;}
网贴有其他情况创建动态线程失败的解决过程如下:
原帖打不开,百度缓存地址:
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed19fa950d100b92235c4380146f888d452f958448e435061e5a20b9fb70714613d3b37d6c05a54a57ede73604341420c198df883d87fdcd763bcd7a742613c01b52844af9dc4654d650964d99a90e97cce74199b9d2a2c82457dd20716df1819c297103cb1fe76545f4d0ed5f655e07cb9c27658e4e065a885045a137fbf7441f&p=c27ed616d9c12dfe03bd9b7e0d108c&newp=92759a45d6c517eb01be9b7c57568e231610db2151d6d4156b82c825d7331b001c3bbfb423241407d3c67c6d0aa94f58e8f43071370923a3dda5c91d9fb4c57479de636d&user=baidu&fm=sc&query=thread+%B4%B4%BD%A8+%B6%AF%CC%AC%CF%DF%B3%CC+%CA%A7%B0%DC&qid=a5283500000057e7&p1=6
问题描述:
采用rt_thread_create在动态堆内存中创建一个线程,程序运行到rt_hw_stack_init出现ARM取数据异常处理,调试跟踪程序看到可以正确从内存堆里面分配空间,不知为何总是运行到rt_hw_stack_init就出现取数据异常,同样的线程如果采用rt_thread_init静态初始化,在目标板上能够运行成功,问题大致出在哪个地方呢?
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的画面,运行下一句就出出现取数据异常——
有做初始化动作:
rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);
最后发现原因是:
系统硬件配置是NOR FLASH 4M,SDRAM 16M,增大rt需要的堆空间起始地址,避免与编译器设定的SP地址重叠 。
阅读全文
0 0
- rt-thread创建动态线程失败
- RT-Thread创建静态、动态线程
- rt-thread线程源码分析
- rt-thread线程源码分析
- RT-Thread 学习笔记(二)---线程创建及任务间通信之中断锁
- rt-thread线程调度器源码分析
- rt-thread的空闲线程源码分析
- RT-Thread操作系统之一线程总结
- RT-Thread内核之线程调度(二)
- RT-Thread内核之线程调度(三)
- RT-Thread内核之线程调度(四)
- RT-Thread内核之线程调度(五)
- RT-Thread内核之线程调度(六)
- RT-thread内核之线程内核对象
- RT-thread内核之线程调度器
- RT-thread内核之线程调度算法
- RT-thread内核之空闲线程
- RT-Thread的线程间同步
- 易语言静态变量和全局变量的区别
- HDU 1420Prepared for New Acmer(快速幂裸题)
- java中序列化与反序列化
- Hive学习笔记
- ASP.Net Core WebApi几种版本控制对比
- rt-thread创建动态线程失败
- [k8s]docker entrypoint图解
- getBackground().setAlpha和setAlpha有什么区别
- PPT设计笔记
- 用户需求浅谈
- Hibernate之关联映射(上)
- HDU 1905Pseudoprime numbers(快速幂)
- 2017开学训练第二周周中总结
- Apache-ab安装使用