小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误

  • 1 背景
  • 2 场景描述
  • 3 分析原因
  • 4 解决方案

1 背景

芯片型号:MKW36A512VFT4(NXP)
操作系统:FreeRTOS
应用类型:将KW36的内部FLASH分区,取出一半模拟EEPROM进行读写。
错误现象:对模拟EEPROM进行读写时总是发生硬件错误中断,单步执行时发生错误中断的概率变低。

2 场景描述

在应用中,K36的内部Flash的大小是512K,将其分成A(256KB)+B(256KB)两个Bank,其中取Bank B的后128KB作为模拟EEPROM进行数据读写。理想情况下,程序存储在Bank A中XIP运行,K36在进行模拟EEPROM写操作时,首先将数据写在RAM中,然后交给协处理器去进行具体写入操作,所以在对Bank B进行读写操作时应该不会被CPU的其他操作影响,但是却时常发生硬件错误中断。

3 分析原因

网上查阅大牛文章,可总结一般情况下发生硬件错误中断的原因如下:
1、非法存储器访问

这也是最常见的问题是访问非法的存储器区域。

2、非对齐数据访问

如果我们直接操作一个指针,或者使用汇编代码,就会生成试图执行非对齐访问的代码,如果错误指令为存储器访问指令,就应该确定传输用的地制止是否是对齐的。

3、从总线返回错误

如果外设没有被初始化,或者时钟没有被使能,那么该外设可能会返回错误的响应,在有些不大常见的情况下,外设只能接收32位的传输,对字节或半字传输会返回错误响应。

4、异常处理中的桟被破坏

如果程序在中断处理执行后崩溃,还可能会引起桟帧被破坏,由于局部变量存储在桟空间中,如果异常处理中定义的数组在使用时超过了数组的大小,异常桟帧可能就会被破坏了,结果就是,异常退出后程序可能崩溃。

5、程序在某些C函数中崩溃

请检查是否为桟和堆预留了足够的空间,如:Keil中NXP LPC111X的堆空间默认为0字节,如果程序中使用了malloc、printf等C函数,那么就需要修改堆的大小了。

这个问题的另一个可能的原因是,连接器没有使用正确的C库函数,连接器通常会详细的告知用户使用了哪些库函数,有些情况下,可以检查这些信息。

6、意外的试图切换至ARM状态

进入硬件错误后,如果压入栈的XPSR的T位为0,那么这个错误就是由于切换至ARM状态引起的,引起这个错误的可能原因有很多,如非法函数指针,向量表中向量的最低位不为1,异常处理时桟帧被破坏或者连接器没有使用正确的C库等。

7、在错误的优先级上执行SVC

如果SVC指令的执行发生在SVC处理中,或者其他和SVC异常优先级相同或更高的异常处理中,就会引起错误,如果在NMI处理和硬件错误处理中使用SVC,则会导致锁定。
(原创链接:嵌入式程序设计中进入硬件故障错误的原因分析)

综合我们使用场景来判断,最终将错误锁定在了地址访问冲突的原因上。

4 解决方案

在模拟EEPROM写入操作加入FreeRTOS的临界保护就没有发生问题,但是由于写入数据量大(2K),导致整个操作耗费时间较长(因为一般来说底层操作函数在进行flash相关学操作时,为了避免错误以及写入成功率都会设置等待保护机制),对于操作系统的运行稳定性来说是非常不友好的,所以最终解决方案为更改NXP官方的SDK库,在写操作底层函数中操作地址那一段关闭全局中断,最后将时间缩短为可接受范围。

问题解决了,最后来分析原因,后来经过细致查找问题,最终发现,由于代码量相对比较庞大,导致代码没有完全处于Bank A,溢出至了Bank B导致代码在中断发生时,在进行写操作时,CPU也访问了Bank B,导致地址访问冲突这才发生硬件错误中断。

END

小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误相关推荐

  1. 小猫爪:这些年遇过的Bug2-STM32 UART输出乱码

    小猫爪:这些年遇过的Bug2-STM32 UART输出乱码 1 背景 2 场景描述 3 分析原因 4 解决方案 1 背景 芯片型号:STM32F103C8T6 应用类型:普通UART应用 错误现象:配 ...

  2. 小猫爪:嵌入式小知识01-存储器

    小猫爪:嵌入式小知识01-存储器 1 前言 2 存储器的种类 2.1 易失性存储器 2.1.1 SRAM 2.1.2 DRAM 2.1.3 SRAM和DRAM的对比 2.2 非易失性存储器 2.2.1 ...

  3. 小猫爪:i.MX RT1050学习笔记3-CCM

    小猫爪:i.MX RT1050学习笔记3-CCM 1 前言 2 RT时钟的管理 3 CCM的结构 4 CCM的时钟树 5 时钟模块的具体功能 5.1 生成时钟 5.1.1 时钟源 5.1.2 7个PL ...

  4. 小猫爪:PMSM之FOC控制07-有传感器的速度环

    小猫爪:PMSM之FOC控制07-有传感器的速度环 1 前言 2 加入速度环 3 传感器获取转子位置的思路 3.1 编码器 3.2 霍尔位置传感器 4 移植 END 1 前言   前面已经实现了电流闭 ...

  5. 小猫爪:嵌入式小知识10-I2S,TDM,PCM等音频格式详解

    小猫爪:嵌入式小知识10-I2S,TDM,PCM等音频格式详解 1 前言 2 I2S 3 Codec模式(左/右对齐) 3.1 左对齐(MSB对齐) 3.2 右对齐(LSB对齐) 4 DSP模式 5 ...

  6. 小猫爪:汽车电子小知识02- ISO14229-1(UDS)简介

    小猫爪:汽车电子小知识02- ISO14229-1(UDS服务)简介 1 前言 2 服务数据格式 2.1 无子功能的格式 2.2 有子功能的格式 3 物理寻址和功能寻址 4 服务简介 4.1 诊断会话 ...

  7. 小猫爪:汽车电子小知识01- ISO15765(UDS on CAN)详解

    小猫爪:汽车电子小知识01- ISO15765(UDS on CAN)简介 1 前言 2 ISO15765和OSI的联系 3 ISO15765-2 网络层定义 3.1 拆包和组包(SDU和PDU) 3 ...

  8. 小猫爪:S32K3学习笔记09-S32K3之Safety简介

    小猫爪:S32K3学习笔记09-S32K3之Safety简介 1 前言 2 Safety相关硬件介绍 3 Safety相关软件介绍 4 Safety文章目录 END 1 前言   接下来,就要开始进学 ...

  9. 小猫爪:S32K3学习笔记05-S32K3之ADC

    小猫爪:S32K3学习笔记05-S32K3之ADC 1 前言 2 资源简介 3 ADC功能详解 3.1 ADC mux-mode channels 3.2 ADC内部框架 3.3 时钟源 3.4 通道 ...

最新文章

  1. Java中getResourceAsStream的用法
  2. AI来了,服务器市场要变天?
  3. Linux Shell 只列出目录的方法
  4. 修改hosts文件不需要重启的方法
  5. 一起谈.NET技术,Silverlight实例教程 - Out of Browser的Debug和Notifications窗口
  6. python中颜色空间直方图_OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图
  7. [经典控件]按钮和菜单
  8. ethereum(以太坊)(二)--合约中属性和行为的访问权限
  9. 冒泡排序c语言标准代码,C语言实现冒泡排序法和选择排序法代码参考
  10. 快商通AI智能客服机器人,荣获中国科学院《互联网周刊》重磅荣誉!
  11. 修改idea64.exe.vmoptions导致双击打不开idea的解决办法
  12. 中国传统的节日(端午节)
  13. 大数据下的用户画像标签去重
  14. Win10安装WSL-Ubuntu18.04
  15. java:布局方法(网格布局)
  16. audio 静音标签
  17. N32926 usb gadget 加 adb驱动, 插入USB线一点反应都没有。
  18. 圈铁发音,动感与无噪强强出彩,魔浪HIFIair蓝牙耳机测评
  19. 编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值。
  20. 超级服装分床省料软件

热门文章

  1. UDP打洞(成功打洞)
  2. 大数据时代的精准推送限制了我们的视野
  3. 管网管理GIS服务平台有何功能?
  4. 你见过哪些炫酷的 Java 代码技巧?
  5. .NET Word 文件格式转换
  6. 淮阴工学院计算机科学与技术宿舍,淮阴工学院宿舍条件,宿舍环境图片(10篇)
  7. 微信公众号简单开发(8)视频消息 和 小视频消息
  8. Qt学习之路之获取本机IP
  9. 爬取Google Scholar论文列表,如何利用公开数据进行合著作者分析?
  10. Lucene构架全文搜索引擎