STM32F7 上rt_thread_create失败应该怎么排查问题

发布于 2017-02-12 21:09:41
买了个STM32F767的阿波罗开发板,正点原子的。用BSP下stm32f7-disco模板建立IAR和MDK工程,
MDK编译效率实在太低,用的IAR。现在的问题是程序报错
(tid != RT_NULL) assertion failed at function:rt_application_init, line number:203
发现实在这里出的错:
#ifdef RT_USING_HEAP
tid = rt_thread_create("main", main_thread_entry, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX / 3, 20);
RT_ASSERT(tid != RT_NULL);
#else

于是查找RAM相关文件,发现rtthread-stm32f7xx.icf中是用的SRAM,程序改了向量表还是不对。
"P2", part 3 of 3:                          0x2a60
.bss zero 0x200107b8 0x1000 idle.o [1]
.bss zero 0x200117b8 0x1000 shell.o [1]
.bss zero 0x200127b8 0x140 finsh_node.o [1]


改成下载到flash也不对,不用SDRAM的话,rt_application_init能过,但是死在
补充一下,发现调度失败是因为线程列表名称全是#号
rt_system_scheduler_start函数中rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
串口无信息输出。学艺不精,请大侠指点下一步方向。
error01.png

查看更多

关注者
0
被浏览
2.9k
5 个回答
jeffwei
jeffwei 2017-02-13
开了一天会,晚上再看了下,发现STM32F103运行到rt_current_thread = to_thread;后,
线程是init,上一个idle+12,下一个是led+12。
而STM32F767上的下一个是rt_object_container+4
aozima
aozima 2017-02-14
拒绝白嫖,拒绝键盘侠!
检查确认一下heap注册时的起始地址。
看f7的icf文件,heap声明前没有加last,检查检查map文件确认一下其是否分配在最后。
jeffwei
jeffwei 2017-02-14
从map文件看,heap按照icf文件分配的

"P2", part 2 of 3:                           0x600
CSTACK 0x200001b8 0x400
CSTACK uninit 0x200001b8 0x400
HEAP 0x200005b8 0x200
HEAP uninit 0x200005b8 0x200
- 0x200007b8 0x600

HEAP$$Base 0x200005b8 -- Gb - Linker created -
HEAP$$Limit 0x200007b8 -- Gb - Linker created -
jeffwei
jeffwei 2017-02-15
led终于闪烁了
之前为了配合rtt的ICF文件,IAR里面加了VECT_TAB_SRAM。
后来为了找问题,用了stm32cubemx的icf文件,忘了删除VECT_TAB_SRAM。
然后单步死机,发现死在RCC初始化,因为定义了RT_USING_USER_MAIN,
components.c里面调用了rtthread_startup();
mai.c里面有来一次,第二次初始化RCC就死了。
修改main.c后好了
int main(void)
{
led_hw_init();
led_init();
//rt_hw_interrupt_disable();
//rtthread_startup();
while(1)
{
rt_thread_delay(RT_TICK_PER_SECOND/4);
}
/* put user application code here */
return 0;
}

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览