关于嵌入式:keil开发如何让所需函数不被优化

58次阅读

共计 861 个字符,预计需要花费 3 分钟才能阅读完成。

前言

当咱们不论是应用 gcc 还是 keil 自带的 armcc 或者 armclang 进行开发的时候,会遇到一个问题,就是:编译器有时会把我想要用到的函数给优化掉,导致运行时的谬误,或者不失常执行。

为什么会这样呢?则是因为,编译器认为,咱们的程序没有调用该接口,因而在链接阶段,就不会把该函数链接进去。但,这会产生问题。

实例

比方:

oid (*vtable)();          // 函数指针

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

(*vtable)();// 如果地址 0x08000000 放的是 entry 函数,则调用 entry()函数

这样编写代码的目标是为了在 (*vtable)(); 处调用 entry() 函数,但编译器并不知道开发者的用意,仍会依照本人的逻辑把 entry() 优化掉,因为它认为该函数并未被调用,则在链接阶段,就不会把该函数链接进去。

因而,当执行 (*vtable)(); 时,外面的内容则不是 entry() 的代码了,可能产生不可预知的谬误。

那,咱们能够通知编译器不要去优化 entry() 这个函数吗?能够的,这时咱们能够应用链接器命令:--keep=section_id 此选项保障在删除未应用节时,不能删除指定的输出节。

链接参数

如何让所需函数不被优化?应用:--keep=section_id!怎么应用?举例说明:

  • 咱们能够应用 --keep=int_handler,来保留int_handler 这个节
  • 如果须要保留定义以 _handler 结尾的所有节,能够应用通配符,--keep=*_handler
  • 如果须要放大范畴,只保留某一个指标文件里的section,则能够这样:--keep=vectors.o(*_handler)
  • 如果须要保留所有的节信息,则能够:--keep=*

最初,这个链接参数放在哪里呢?见下图:

关注 && 分割

开源轻量操作系统:https://gitee.com/cmcc-oneos/OneOS-Lite

docs 文档核心:https://oneos-lite.com/

正文完
 0