潮声隔雨深 · 2020年03月08日

keil编译stm32程序,将函数放到RAM中不能跳转执行。请指点一下。

请教大家两个问题,将一个函数复制到一个数组然后跳转到数组地址去执行那个函数,gcc编译器编译x86可执行程序没有问题,IAR编译430可执行程序也没有问题,但是Keil编译stm32 程序执行的时候不能跳转,进一步发现是LSB置1了并且发现跳转的地址是个偶数(猜测可能与这个有关系,因为好像是CM3规定跳转分支需要是奇数地址)?进而又准备将那个函数绑定在某个地址编译,绑定在ROM可以通过(因为时间关系没有来得及执行),发现绑定在RAM编译不通过,这是为什么?求大神指点一下。最终目的也就是需要将这个函数放到RAM中执行,不知道有没有一些更好的方案设计?

1 个回答 得票排序 · 时间排序
一知半解 · 2020年03月08日

首先备份工程,再为要指定的函数定义一个section名字(如 void FunctionName(void) __attribute__((section("SectionName")));,前一个Name与函数有关,后一个Name为section名字(自定义))。然后在工程设置里面,点击Linker选项卡,第一步去掉Use Memory Layout from Target Dialog选项,第二步,点击Scatter File后面的Edit选项(此时工程会打开一个.sct的文件),再点击OK(关闭工程设置窗口,一定不要忘记点击OK)。最后在.sct文件中RAM区域加上一行“* (SectionName)”(section名字)。保存重新编译即可。参考设置如下:

LR_IROM1 0x08000000 0x00004000 { ; load region size_region
ER_IROM1 0x08000000 0x00004000 { ; load address = execution address

*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)

}
RW_IRAM1 0x20000000 0x00001000 { ; RW data

.ANY (+RW +ZI)
* (SectionName)

}
}

你的回答