同事在S32K144上的UsageFault_Handler去保存NVM的时候发现, 如果申明一个局部变量, 同时调用nvm处理函数的时候引用这个变量的指针, IAR会报Error[Ta080]: Function "UsageFault_Handler" with attribute "__naked" cannot be compiled without allocated auto area的错误(头文件中申明为__attribute__((naked))).

首先, 什么是naked function呢? 先了解一下函数的prologue or epilogue, 可以参考https://gcc.gnu.org/ml/gcc/2000-05/msg00293.html.

如果将UsageFault_Handler的naked属性去掉的话, 编译产生的汇编代码会在函数刚进去的时候多PUSH     {R3-R7,LR}, 在函数退出的时候多一个POP      {R0,R4-R7,PC}, (这就是正常的函数调用和返回).

根据armv7的手册, 在中断产生的时候, 已经自动做了push的动作, 压栈内容如下.

void getStackFrame(uint32_t stackFrame[]){
    R0  = stackFrame[0];
    R1  = stackFrame[1];
    R2  = stackFrame[2];
    R3  = stackFrame[3];
    R12 = stackFrame[4];
    LR  = stackFrame[5];
    PC  = stackFrame[6];  // Program counter holds the address of the instruction that has caused the exception (except for Imprecise Bus Fault)
    PSR = stackFrame[7];
    asm("BKPT");
}

如果将naked属性去掉的话, 自动压栈的部分就被PUSH     {R3-R7,LR}, 但是根据arm的手册, 进usagefault exception的话, lr是特殊的, 返回地址其实是保存在stackFrame[6]里面, 这个和普通函数调用不一样.

JTAG调试发现naked属性去掉的话, stackFrame[5]里面的LR却是被篡改了, 不再是上面的3个值中的任何一个.

因此正确的做法是将要处理的nvm的逻辑部分写成一个函数, 然后再UsageFault_Handler (naked属性保留)里面去调用这个函数.

https://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc 里面也有相关的信息.

attribute __naked cannot be compiled without allocated auto area相关推荐

  1. 在C++中使用LLVM的JIT功能进行代码优化:Optimization passes--PassManagerBuilder

    今天找了一天的在LLVM中如何进行代码优化的方法. 一开始在谷歌搜索LLVM JIT,看到了LLVM的官方教程: 1. Building a JIT: Starting out with Kaleid ...

  2. 关于Oracle数据库19c中的关键字和保留字的说明

    关于Oracle数据库中的关键字和保留字的说明 官方文档节选: ​ You cannot use Oracle SQL reserved words as nonquoted identifiers. ...

  3. [The Java8 Virtual Machine Specification述]Chapter2

    Chapter 2. The Structure of the Java Virtual Machine This document specifies an abstract machine. It ...

  4. 并发编程02-什么是线程安全以及Java虚拟机中哪些数据是线程共享的,那些是线程私有的

    线程安全的本质 什么是线程安全 要说什么是线程安全,那么我们看看生活中例子吧. 场景1:王菲要来西安体育场开演唱会,这个体育场规模不是很大,能容纳1000个人,于是准备了1000张票,后天中午12点在 ...

  5. Jasperreports的XSD翻译

    介绍 本文是jasperreports的xsd的翻译. [codesyntax lang="xml"] <?xml version="1.0" encod ...

  6. css实现列表下拉菜单_逐行:点击打开下拉列表和菜单的高级CSS技巧

    css实现列表下拉菜单 by David Piepgrass 由David Piepgrass 逐行:点击打开下拉列表和菜单的高级CSS技巧 (Line-by-line: advanced CSS t ...

  7. 【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----程序化生成地形算法设计

    2 程序化生成地形算法设计 Input: Output: 2.1 地形的生成 程序化生成地形算法是一种在计算机中生成地形的方法,通常用于游戏开发和虚拟现实应用.下面是几种常见的程序化生成地形算法: D ...

  8. mysql数据库的关键字_数据库 关键字

    介绍 为了避免在数据库表结构设计过程中使用系统保留关键字我们必须知道数据库存在哪些关键字,接下来会列出mysql.oracle.sqlserver三个数据库各自的保留关键字. Mysql ACCESS ...

  9. showimg.php,layer弹出图片

    layer弹出层非常之好用,用户体验非常好,有这样一个需求,当点击指定文字或是缩略图后,使用layer弹出原图片,并且弹出层的宽和高根据图片大小自动变化.下面是实现这一功能的代码.function s ...

最新文章

  1. python3安装pip3-python3及pip3安装
  2. MySQL8小时连接超时断开问题
  3. 面向对象三大特性之一:多态(C++)
  4. [MATLAB调试笔记]Update the electric field in one step
  5. 【转】Dynamics CRM 365零基础入门学习(四)Dynamics 使用profiler插件调试流程
  6. C11新特性(部分)
  7. yuv420转yuv422(yuyv)
  8. python主函数_Python main() 函数
  9. 测试之CR规范及错误列表
  10. AB PLC Modbus TCP通讯测试
  11. 免费搜题网课答案微信公众号系统
  12. Linux VPS 免费管理面板推荐
  13. unity 老版本 离线下载
  14. 腾讯会议的各种使用办法
  15. 寻找漂流瓶上人快老板
  16. 来说一下!线雕的副作用和危害有哪些?妈耶
  17. Vs2005中操作WORD
  18. Java版飞机订票系统
  19. Gitblit服务器搭建及Git使用
  20. 22下半年软考集成广东卷(中项)真题在线估分

热门文章

  1. 马化腾:搜索、电子商务硬仗一定要坚持打
  2. mac python2.7升级到3.7_Mac下python2.7 升级到3.7
  3. Get请求,参数为@RequestBody的http请求
  4. C++标准库笔记-多线程-shared_future-future的补充扩展
  5. echarts字变大_EChart 文字大小调整 饼状图为例
  6. 接口规范-API接口
  7. Windows DPC详解
  8. codeforces 295B B. Greg and Graph(floyd+dp)
  9. crc16 ccitt的详细标准及其出处
  10. 关于屏幕尺寸引起的问题