采用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;
}
有做初始化动作:
rt_system_heap_init((void*)&Image$$RW_RAM1$$Limit, (void*)0x1000000);
系统硬件配置是NOR FLASH 4M,SDRAM 16M,增大rt需要的堆空间起始地址,避免与编译器设定的SP地址重叠 。