曲阿子期 发表于 2018-8-13 18:13:42

一个星期了全网没打到答案,一个关于在RAM中运行的问题

我要做一个IAP的程序,因为这段程序还要做解密的功能,所以官方的BOOT不能用。我用的分环境是STM8 + STVD + COSMIC。

其实功能我已经实现了,但有个问题,我的BOOT放在FLASH最后面,做过IAP的都知道编程FLASH的动作要在RAM中执行。
假如我写FLASH的函数是:FlashProgram(); 写完要调用 FunctionA();
那么必然有:
#pragma section(FLASH_CODE)
FlashProgram() {
...
}
#pragma section()
FunctionA() {
...
}
...
main() {
...
_fctcpy('F');
...
}
现在问题来了,如果 FlashProgram()的地址超过 0x10000, 那调用FlashProgram()是能正常进入的,但返回时就不对了;
如果FlashProgram()的地址在0xFFFF以内,程序就一切正常;
如果不去调RAM中的FlashProgram(),而是调FLASH中的任意函数,不管地址多大也都是正常的。只要一调RAM中的函数再返回就不对了。

是我在STVD中哪个设置项不对引起的吗?
有没有高手可以指点一下,是不是RAM中最多只能以2BYTE编址引起的,RAM中函数返回后是要跳到3BYTE地址去运行的,所以就出错了?

cloudcn 发表于 2018-8-14 15:15:28

上电以后RAM是空的,你不干涉根本没法执行 怎么你也得在FLASH 开始处 0x800 0000处写些代码, 其实你在FLASH前面留出一个固定大小BOOT区就行了,BOOT区的代码不烧录BOOT区地址就行 ,没必要在费事把FLASH代码搬到RAM里执行

feixiang20 发表于 2018-8-13 23:35:17

之前没遇到同类问题,只能猜测,说到IAP,RAM是以每2Byte来编址的。地址空间的大小一般取决于地址总线,32位机的地址总线一般是32bit的,2^32=4294967296。看看编程前先擦写有没有用。同时查看擦除函数,看着函数说明,正确的传参数。

zhao.zhao 发表于 2018-8-14 11:09:16

中断向量表要映射到RAM区的吧。可能问题还不止这一个。

曲阿子期 发表于 2018-8-16 16:24:55

cloudcn 发表于 2018-8-14 15:15
上电以后RAM是空的,你不干涉根本没法执行 怎么你也得在FLASH 开始处 0x800 0000处写些代码, 其实你在FLASH ...

0x8000处不一定要有代码的,只要在LINK INPUT中设置断向量表起始地址就可以了。我之后以把BOOT放到最后,是为了APP程序可以用默认设置。还有DATA SHEET中好像有说要对FLASH擦写操作必须在RAM中进行。实际我也试过,不把擦写动用放到RAM,直接去做,但是操作的块和BOOT不重叠,实际并不成功

曲阿子期 发表于 2018-8-16 16:28:30

zhao.zhao 发表于 2018-8-14 11:09
中断向量表要映射到RAM区的吧。可能问题还不止这一个。

不需要映射到RAM的,当我整个程序不超过32K (也就是地址不超过 0XFFFF)一切都是正常的。只有当程序超过32K,并且擦写FLASH的函数地址在 0xFFFF 以外时才会有问题
页: [1]
查看完整版本: 一个星期了全网没打到答案,一个关于在RAM中运行的问题