rt-thread创建动态线程失败

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值