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地址重叠 。

原创粉丝点击