请选择 进入手机版 | 继续访问电脑版

芯虎论坛

 找回密码
 立即注册
查看: 1444|回复: 0

keil mdk中如何确保某一段程序不被优化掉

[复制链接]

19

主题

19

帖子

211

积分

虎背熊腰

Rank: 3Rank: 3

积分
211
发表于 2020-6-18 13:51:51 | 显示全部楼层 |阅读模式

使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM.


比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:


void (*UserProgram)();        //函数指针

UserProgram = (void (*)()) (0x00002000);  //定位到指定的入口地址0x00002000

(*UserProgram)();               //调用test()函数



这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.


能否让编译器不自动优化test这个函数?


当然有,就是使用链接器命令:--keep=section_id 此选项指定删除未使用节时不能删除的输入节。


其中 section_id 是以下项之一:

symbol 指定在删除未使用节时保留定义 symbol 的输入节。 如果 symbol 存在多个定义,则 armlink 将生成一则错误消息。

例如,您可能使用 --keep=int_handler。若要保留定义以 _handler 结尾的符号的所有节,请使用--keep=*_handler。

object(section)指定在删除未使用节时保留 object 中的 section。 例如,若要保留vectors.o 对象的 vect 节,请使用: -- keep=vectors.o(vect)若要保留 vectors.o 对象中节名称的前三个字母是 vec 的所有节,请使用:--keep=vectors.o(vec*)




由于我的程序test()函数是单独放在一个文件里(entry.c)的,所以我在linker标签栏下的Misc controls编辑框中输入--keep=entry.o



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|芯虎论坛 ( 辽ICP备18019618号 )

GMT+8, 2020-11-27 07:42 , Processed in 0.094239 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表