10 【已解决】bootloader跳转后,内存申请函数失败

发布于 2020-07-21 19:23:09

使用官方网站生成的stm32l4的bootloader,下载到stm32l476RE上之后,正常打印。
基于bsp使用env生成一个stm32l476的工程,在没有使用bootloader的情况下,验证程序代码没有问题。

然后,修改链接脚本,将启始地址设置为0x08008000。
sct.png

在main.c中添加向量表重定向代码,基本上都是按网上流程来的。
vtor.png

将bootloader下载到0x08000000位置,在mdk下使用下载将App下载到0x08008000开始的位置,自动复位运行,bootloader正常运行,跳转到app上执行代码,但是发生了错误。rt_application_init
bl.png

为了调试代码,将MDK进行设置,起始地址设置为0x08008000。
mdkx.png

跟代码,发现rt_malloc失败了。
rt_application_init-->rt_thread_create-->rt_object_allocate-->rt_malloc
mall.png
在这里失败了。
请求大神指点一下。谢谢。

-----------------------答案来了---------------

用以下代码对Heap的起始地址进行修改,我直接放在board.h文件中了

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; 
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END                       STM32_SRAM1_END
#endif

查看更多

关注者
0
被浏览
233
2 个回答
whj467467222
whj467467222 2020-07-21

你的IORM1的起始地址已经偏移了0x8000,Size是不是要减少0x8000

wlof
wlof 2020-07-22

找了很多资料,东搞西搞,5花8门,又是调vtor的,又是设置mdk的,改sct文件的,其实都没有搞对地方,浪费了很多时间,怎么调都不成,干脆自己找找吧。

(tid != RT_NULL) assertion failed at function:rt_application_init, line number:200

对这个代码进行跟踪时,分配内存的时候出现问题,即rt_application_init-->rt_thread_create-->rt_object_allocate-->rt_malloc,这里出错,内存管理发现没有可用内存了,OMG,怎么可能呢,刚启动呀。

于是怀疑肯定是,heap实始化出现问题了,导致里面的内存被误认为是全部用光啦。

rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);

再看一下这两是什么鬼,乖乖,就是它的问题,老的BSP中可能没有对HEAP_BEGIN进行处理,原始的值是直接写死的,乖乖,中断向量还要偏移呢,这个写死了,是不是会出问题?太高深的东西俺可不知道,反正一想,觉得这里有问题。
记得Nano版本的heap是数组搞的,后来在哪个教程中看到,它没有数组,用的是以下方式:

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; 
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END                       STM32_SRAM1_END
#endif

就这段代码,搞进去,内存分配正常。

APP设置

带bootloader的App设置,我是直接在mdk上完成设置的,实测试,可以运行。
mdk1.png
注意了,这里的设置,网上很多资料都说用要sct文件来搞,我也不知道为什么,刚开始也是仿着去搞的,可以执行。后来干脆MDK设置界面上完成的就得了,因为我发现,界面设置,和自己写的差不多。这里的--kepp指令是老版本中的rtt中搞过来的,实际上可以不要。
mdk2.png
这个代码就是重点,没有这个代码,程序跑到heapinit之后,一申请内存就挂掉。
mdk3.png
其中

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; 
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END                       STM32_SRAM1_END
#endif

这段代码很重要!!!

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览