找回密码
 注册
关于网站域名变更的通知
查看: 377|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-25 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
keil mdk中如何确保某一段程序不被优化掉
5 r. G3 ^( \0 p8 }

2 N4 w) _4 {- d9 O/ s0 w. b: k/ I
使用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 是以下项之一:
9 R4 d# H/ u8 _/ S& t% w2 m& Gsymbol 指定在删除未使用节时保留定义 symbol 的输入节。 如果 symbol 存在多个定义,则 ARMlink 将生成一则错误消息。
; X% L9 ~9 P1 C1 D: c% w) Z9 _           例如,您可能使用 --keep=int_handler。若要保留定义以 _handler 结尾的符号的所有节,请使用--keep=*_handler。. ~( n8 @1 e8 l7 h
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

+ R; G0 ?1 M, ]3 Y8 }
+ v$ ]3 F* I( X- Y4 h4 I
0 T- _  d4 c. e9 L/ M& m  C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-21 14:17 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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