6、 IAP 函数绝对地址编译及指针调用
6.1 实现原理
在 Option 中设置相关的 IAP 擦写保护,使能用户程序所在扇区保护位后, 使用绝对地址编译将
IAP 操作函数放到未设置 IAP 保护的区域, 并使用函数指针的方式调用函数, 保证 MCU 不会误擦除用
户代码。
6.2 操作说明
以 HC89S003F4 的“Flash 做类 EEPROM 读写”范例为例,
1、 打开 Flash 做类 EEPROM 读写, 在主函数里分别找到 FLASH 擦除(Flash_EraseBlock)和写
(FLASH_WriteData)的函数, 打开 Project -> Options for Target 菜单, 选中 BL51 Locate 选项卡, 在
Code: 中输入: ?PR?_Flash_EraseBlock?MAIN(0X2000),?PR?_FLASH_WriteData?MAIN(0X2080)。
格式为: ?PR?_函数名?MAIN(要编译的地址), 注意, 输入的文本(包括标点符号) 必须是英文格
式, 否则编译器会报错, 然后点击 OK, 程序编译后, 在 M51 文件中可以找到相关信息,如 图 6-3
所示程序已经被编译在相关地址处。
2、 使用函数指针调用绝对地址处的函数,详情请参考例程
(1) 定义函数原型: void Flash_EraseBlock(unsigned int fui_Address);
(2) 定义相应的函数指针变量: void (*CALL_FLASH_ERASE)(unsigned int i);
(3) 函数指针变量赋值, 指向我们定位的绝对地址的函数: CALL_FLASH_ERASE=Flash_EraseBlock;
(4) 函数指针的调用: (*CALL_FLASH_ERASE)(0x2B00);
|