踩坑日记 CUBEMX生成的STM32H743默认工程 将关键函数定义到ITCM导致程序跑分排故分享

CUBEMX生成的STM32H743默认工程
其ld链接文件默认内存分布如下

MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K /*ITCMRAM 在此处 */
}

当我们在这个工程下 尝试将函数定义到ITCMRAM
比如:

捕获

此时编译过后Hall_Point_DeCode函数的刚好排在第一个

捕获1

地址 0x0000000
一旦调用Hall_Point_DeCode函数 程序直接跑飞
原因是 0x00000000 在C语言标准中被定义为空指针(NULL)。许多库函数和操作系统内核会用“指针是否等于NULL”来判断其有效性。

将任何有效的代码或数据放在这个地址,都可能导致这些检查逻辑出错,比如误判一个有效指针为NULL而拒绝访问

最简单的一个修改是在ld文件中 将ITCMRAM 起始地址往后推8字节

/* Specify the memory areas /
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000008, LENGTH = 64K- 0x8 /
ITCMRAM 在此处 */
}

修改后编译 Hall_Point_DeCode函数地址如下

捕获2

此时程序运行正常

posted @ 2026-07-21 14:03  baiyang80  阅读(0)  评论(0)    收藏  举报