MCU在线调试功能正常而离线工作异常原因探究

在嵌入式MCU软件开发过程中,通常我们需要先通过调试器(Debugger,带程序下载(Flash/EEPROM擦除、编程和校验)功能)或者仿真器(Simulator,不带目标MCU编程功能)对所写代码的功能进行在线调试(online-debug),验证确认其功能符号设计需求后,在发布编程文件--S19/HEX/BIN给生成部门通过离线编程器(Offline/Stand-aloneFlashProgrammer)进行批量编程。批量(MassProduction,简称MP)的产品正常工作时是不需要/也不能连接调试器或者仿真器的(一方面,调试器和仿真器价格高昂,成本不允许,另一方面,无法满足系统设计的产品重量和空间要求),因此,我们开发的嵌入式MCU应用软件/程序必须保证其在拔掉调试器和编程器或仿真器后依然能够功能运行正常,即离线工作(Offline,也称作脱机工作)正常。

在实际工作中,大家常常会遇到,开发阶段在线调试工作正常的代码,离线工作时却无法正常工作,这是为什么呢?

本文就基于NXP的汽车级MCU(S32K1xx/KEA,S12(X),MaginiVS12Z和QorivvaMPC56/57xx系列)为例,给大家介绍这类问题的可能原因和具体解决办法,希望对大家有所帮助。

1.应用工程的编译目标为debug_RAM,将代码编译链接到SARM而非Flash

在嵌入式MCU的软件开发集成环境(IDE)中创建应用工程时,通常都会创建至少两个编译目标(buildtarget)和调试目标(debugtarget),使用不同的连接文件,将编译结果分别编译链接到SRAM和Flash中。

比如,在NXP的S32DSIDE中,创建S32K1xx系列MCU的应用工程时,就会自动创建Debug、Debug_RAM和Release三个编译目标,其差异和用途如下:

Tips:a.由于S32DS是基于GNU的工具链,编译器(gcc)优化这一块目前还不是很完善,建议量产时还是使用Debug的编译目标,以保证编译结果能够正常运行;

b.编译目标中工具链的调试信息等级(debuglevel)配置,只影响elf文件中包含调试信息的多少,不会影响最终生成的编程文件(S19/HEX/BIN)大小,因为编程文件中不包含任何调试信息;

c.一个S32DS工程可以有多个编译目标,用户可以通过工程属性创建、配置不同的编译目标实现应用工程的个性化编译;

因此,若选择使用Debug_RAM作为在线调试时的编译目标,并通过Debug_RAM调试目标下载,则编译结果未被下载到Flash中,因此,拔掉调试器,无法正常工作。

解决办法:切换应用工程的编译目标和调试目标为debug/release,将应用程序编译链接并下载到掉电不丢失的Flash中。

2.启动代码(startupcode)未对使用的SRAM进行ECC初始化

为了保证嵌入式MCU应用程序的正常运行,提高系统的抗干扰能力,越来越多的MCU在其存储器中加入了单比特自动纠错,多比特检错的ECC功能。

对于此类MCU,由于调试器的下载脚本(在线调试时会被自动调用和执行)会对其SRAM进行初始化,若应用工程的启动代码(startupcode)未对其SRAM进行就去访问(读)SRAM,则会导致ECC错误,从而进入内核异常:

Tips:通常若MCU的SRAM带有ECC功能,在新建应用工程的启动代码中都会添加相应的ECC初始化代码,比如S32K1xx系列MCU的startup启动流程如下,在startup的第③步即对SRAM进行了初始化:

Notes:需要注意的是,对RAM初始化时使用的起始地址和长度信息来自应用工程的链接文件定义,若在SRAMsize小的MCUpartnumber(比如S32K144,SRAM为60KB,起始地址为:0x1FFF_8000~0x2000_6FFF)的应用工程上移植SRAMsize大的MCUpartnumber(比如S32K146,SRAM为120KB,起始地址为:0x1FFF_0000~0x2000_EFFF)应用程序,若不替换使用相应partnumberMCU的链接文件,则会出现SRAMECC未初始化即使的情况。

解决办法:Doublecheck应用工程的启动代码(startupcodes),确保CPU内核在访问(读取)SRAM之前有对其使用的全部地址空间进行了ECC初始化。

3.FlexNVM(EEE--EmulatedEEPROM)分区失败

在NXP的S12XE系列MCU和S32K1xx系列MCU中都使用了EEE(EmulatedEEPROM,硬件状态机模拟EEPROM),在访问之前,必须对其进行分区(partion),而能够成功分区的前提是EEE所使用的D-Flash/FlexNVM和分区信息储存区域(FIR)为擦除状态。在CodeWarrior和S32DSIDE的下载脚本中,通常都会有相应的擦除命令(eraseallblock或者masserase)完成这些操作,从而在线调试时,其分区一定能够成功,而量产时,没有调试器连接下载的过程,若在应用程序中未做相应的容错处理,在EEE分区失败的情况下,继续使用EEE,则会到MCU工作异常。

4.RAM初始化时未关闭看门狗,导致看门狗超时复位

离线工作时,这些下载脚本和Flash算法将不会被执行,若应用工程的启动代码(startupcode)在进行RAM初始化(.data段和.bss段初始化)之前未关闭片上看门狗,而且应用工程中使用的全局变量又比较多的情况下,就极容易出现看门狗超时复位,从而无法正常执行应用程序。

解决办法:Doublecheck应用工程的启动代码(startupcodes),确保在进行RAM初始化之前,MCU的片上看门狗已经被关闭(disabled)。

5.内部参考时钟(IRC)没有校准(trim),导致系统和外设时钟误差过大

通常为了降低系统成本和提高时钟的稳定性,在嵌入式MCU中都集成了一定数量的内部参考时钟(IRC-InternalReferenceClock)。但是,有工艺设计的限制,这些IRC时钟源的频率误差都比较大,必须经过校准(trim)才能够提高MCUdatasheet中所规范的时钟精度。

在MCU的调试器下载脚本或者Flash算法中,往往会提供MCU片内IRCtrim的功能,从而保证,在线调试时,MCU能够使用比较稳定的IRC参考时钟。若在MCU的启动代码中缺少IRCtrim的功能代码,则会导致脱机运行时,依赖IRC时钟的内核和外设模块工作异常。

解决办法:若使用IRC时钟作为参考时钟的外设模块对时钟精度要求比较高,请务必在应用工程的启动代码中添加IRC时钟的trim代码。

6.bootloader跳转导致APP程序启动或者时钟、外设初始化失败

在带有bootloader功能的嵌入式MCU产品(比如汽车ECU)开发中,bootloader也是一个完整的应用工程,它也会对目标MCU的系统时钟和外设模块(至少bootloader获取更新firmware需要的通信外设模块(比如CAN或者UAR)T和定时器(比如看门狗或者用于通信超时的timeout硬件定时器模块)以及GPIO模块)进行初始化,这些时钟资源和外设模块,若在跳转在应用程序(APP)之前未复位,则会影响APP功能代码再次初始化系统时钟和外设模块,从而导致产品功能异常。

APP工程单独下载在线调试时,不存在bootloader的影响,因此工作正常,而加入bootloader后,则必须考虑以上影响。

解决办法:在bootloader初始化MCU系统时钟和外设模块之前(越早越好,可能的话在bootloader的复位函数中通过汇编指令实现最好),就读取并判断APP更新状态,跳转到APP。若有APP更新需求,在运行bootloader功能代码完成APPfirmware更新之后,通过看门狗或者软件复位重新运行bootloader再跳转,而不是更新完成后立即跳转到APP。

7.使用调试器的半主机(semi-host)模式重定向printf()到debugconsole输出调试信息

通过调试器的半主机(semi-host)模式重定向printf()到debugconsole输出调试信息,从而可以调用printf()函数格式化打印调试信息,将在线调试时关心的寄存器和变量数据等输出到debugconsole,从而提高调试效率。

8.外设模块冻结模式配置影响其功能配置失败

除了以上列出的可能原因,为了在线调试时的减少CPU内核的中断或者方便量产时产生生产,嵌入式MCU的很多外设模块和存储器控制器有冻结模式(Freezemode,也就是调试模式)控制位,从而可能会导致外设模块在调试模式和离线工作的正常模式下功能有所差异。

总结

本文以NXP的汽车级MCU(S32K1xx/KEA,S12(X),MaginiVS12Z和QorivvaMPC56/57xx系列)为例,给大家介绍MCU在线调试正常,但离线工作异常这类问题的可能原因和相应的解决办法。

THE END
1.上传模式与实时模式详解,操作与应用指南(适用于初学者与进阶用户)亲爱的读者们,本文将为您详细解释什么是上传模式和实时模式,并引导初学者和进阶用户如何操作这两种模式,无论您是刚开始接触这一领域的萌新,还是已经有一定基础的用户,本文都将助您一臂之力,请跟随我们的步骤,轻松掌握这一技能https://www.shuguo168.com/post/11417.html
2.离线编程操作,优势应用与未来离线编程技术,离线编程操作,优势在数字化和智能化的时代,编程技术已经渗透到各个领域,无论是软件开发、机器人控制还是自动化生产等,都离不开编程的影子,离线编程操作作为一种新兴的编程方式,逐渐在各个领域中崭露头角,本文将详细介绍离线编程操作的概念、优势、应用场景以及未来发展趋势。 http://www.skypure.com.cn/post/35344.html
3.免费PDF转Word工具推荐:在线与离线工具的优缺点及注意事项详解pdf在线工具最大的优点就是方便,creativelyours.com,。你不需要下载任何软件,只需要一个浏览器就能操作。而且,大多数在线工具都是免费的,适合偶尔使用的用户。此外,在线工具通常会定期更新,用户可以享受新的功能和更好的性能。 离线工具的优势 (Advantages of Offline Tools) https://www.163.com/dy/article/JJQ34BGP0556A727.html
4.案例9:使用计算—离线和在线使用的主要区别案例9:使用计算—离线和在线使用的主要区别 (\Program Files\ShellGlobalSolutions\PCTP\Tutorial\SMOCPro\Tutorial9_CalculationsRecursive.wsp) 在离线仿真与在线仿真中递归计算(计算中某个输出位号作为自身的函数)的行为是不一样的。行为的不同是因为嵌入离线仿真和嵌入在线系统的设计差异导致的。本教程的目的是着重介https://www.jianshu.com/p/28da66d9eafb
5.常见问题·国产操作系统麒麟操作系统——麒麟软件官方网站③ 离线安装(获取到相关的软件包):sudo dpkg -i 软件包名8) 银河系统都能安装安卓模拟器么? A: 现在只有飞腾和鲲鹏版本的系统能安装安卓模拟器。9) 可以安装apk应用软件吗? A: 不可以安装,只能使用软件商店已有的“手机APP”的应用。10) deb和rpm有什么区别? https://www.kylinos.cn/support/problem.html
6.什么是保存?分解基础知识Lenovo台灣市場虽然大多数程序不支持将文件同时保存到多个位置,但你可以使用 "另存为 "或 "保存副本 "命令,手动将文件副本保存到不同位置。或者,你也可以使用可在多台设备上同步文件的云存储服务。 能否保存网页以供离线查看? 是的,大多数浏览器都允许您保存网页以便离线浏览。例如,在 Chrome 浏览器中,你可以点击三点菜单 >https://www.lenovo.com/tw/zh/glossary/what-is-save/
7.第五次全国经济普查专项试点数据处理问题解答(一)8.本次试点建筑物信息作为独立阶段进行采集,与以往有什么区别? 答:将建筑物作为一个独立阶段试点采集的,在清查调查员程序里,地图里的建筑物都将作为预置建筑物直接呈现在地图上,预置建筑物清查调查员程序里不能修改。 9.核查情况更新功能一般在什么情况使用? https://www.yueyang.gov.cn/tjj/22746/22753/67182/67186/content_2080266.html
8.SMTXOS社区版安装使用中常见问题合集–SmartX问题:SMTX OS 集群部署选择分层和不分层有什么区别? 回答:社区版仅支持分层部署。 分层: 使用高速介质(SSD)做缓存,低速介质做容量(HDD),对于混闪(SSD+HDD)集群,必须使用分层部署。 不分层: 不设置缓存盘。除了含有系统分区的物理盘,剩余的所有物理盘都作为数据盘使用。对其全闪集群(SATA/SAS SSD、Nvme SSD)可https://www.smartx.com/blog/2022/02/smtx-os-faqs/
9.常见问题和群组有什么区别? 一个聊天室支持100万人。聊天室和群组最大的区别在于,聊天室的消息没有推送通知和离线保存,也没有常驻成员的概念,只要进入聊天室即可接收消息,开始聊天, 一旦退出聊天室,不再会接收到任何消息、通知和提醒。注意:进入聊天室会自动获取最近50条消息,客户端目前不支持创建聊天室 实时音视频怎么收费?https://docs.jiguang.cn/jmessage/guideline/faq
10.玻璃知识概要房扬州装饰扬州家装扬州装修设计对大部分普通植物没有什么不利影响,对特殊的稀有植物的影响可请教有关的花卉专家。 12、LOW-E玻璃是否可以单片使用? 离线LOW-E玻璃不可单片使用,需要合成中空玻璃使用。在线LOW-E玻璃可单片使用,但会大大损 失LOW-E玻璃的节能性。 13、LOW-E膜层的寿命有多久? https://www.yzzs.cn/zhuangxiu/fang/a/436e142784d251e09be7798f826e606b.html
11.机器学习:在线学习和离线学习区别文章浏览阅读4.1k次,点赞4次,收藏20次。机器学习中的在线学习(Online Learning)和离线学习(Offline Learning)是两种不同的学习方式,它们在数据处理和模型更新方面有着明显的区别。以下是它们的主要区别:使用了SGDClassifier作为在线学习模型,模拟了一个不断更新的https://blog.csdn.net/weixin_41194129/article/details/132998721
12.人工智能语音朗读在线掌阅在线语音朗读总是切到离线声音?一、掌阅书城在线语音朗读和离线语音朗读有什么区别? 1. 在线语音朗读和离线语音朗读有区别。 2. 在线语音朗读是指通过网络实时获取语音朗读服务,需要保持网络连接才能使用。离线语音朗读是指将语音朗读功能嵌入到设备或应用程序中,不需要网络连接即可使用。 https://tool.a5.cn/article/show/73205.html
13.理解iOS消息推送一文就够:史上最全iOSPush技术详解因为本地push原理和作使用相对于在线push和离线push都更为简单明了,下文主要详情在线push和离线push。 4、本地push实现 4.1 iOS10以前本地push弹出方式 实验过iOS10以前的本地push方法在iOS10+的系统也能用,不过可能有些参数不生效。 1)立即展现( iOS10以前) https://www.songma.com/news/txtlist_i2865v.html
14.蚂蚁金服新计算实践:基于Ray的融合计算引擎架构蔡芳芳InfoQ:前面提到了实时数据阶段和在线数据阶段,二者关键的不同是什么? 周家英:实时数据阶段是从离线数据阶段发展过来的,虽然比以前更快,但是它所面临的问题也很直观。比如数据计算从 T+1 变成 T+分钟或 T+秒,这就是从离线到实时了,但是到底是秒还是分钟,是可以在一个很大的区间里切换的,这并不会对线上场景有https://www.infoq.cn/article/ualTzk5OwDb1crVHg7c1
15.离线和在线有什么区别1玩法不同。双人成行离线的玩法为线下#双人成行 #双人游戏 #童心未泯所遇皆甜 #分享游戏快乐 #steam游戏 离线和在线有什么区别 1、玩法不同。双人成行离线的玩法为线下玩法,需要玩家在线下相聚才可以一起游戏。双人成行在线可以通过网络直接游戏,不需要线下相聚。 2、网络要 - 边逛边播( ?https://www.douyin.com/video/7153240494477249825
16.封阳台有必要用LowE玻璃吗?lowe玻璃选购终极指南上面是理论数值,在实际生活中,高透Low-E中空玻璃,和普通中空玻璃肉眼看上去区别不大。如果是中透,肉眼看上去就会有明显区别。 楼层低、采光不好的肯定采光第一,高透就是首选;楼层高、光线足、玻璃面积大的,可以选择低透的,遮阳效果更好。 在线Low-E可以单片使用,离线Low-E不可以。 https://www.yoojia.com/ask/17-12099920930262481916.html
17.ESP32的开发环境SDK4.3.1版本和编译环境搭建51CTO博客在这分为两种:在线安装和离线安装: 在线安装与离线安装的区别 在线安装程序非常小,可以安装 ESP-IDF 的所有版本。在安装过程中,安装程序只下载必要的依赖文件,包括 Git For Windows 安装器。在线安装程序会将下载的文件存储在缓存目录 %userprofile%/espressif 中。 https://blog.51cto.com/u_15427821/4581207
18.电子税务局怎么交社保电子税务局部分申报表采用电子表单技术实现。电子表单具有两个特点:一是操作界面更友好,可以任意放大、缩小和打印;二是支持在线和离线申报,并能够对申报表进行加密,保证申报过程的安全性。纳税人使用电子表单需安装Adobe Reader。 4、电子表单的在线申报和离线申报有什么区别? https://www.yjbys.com/banshizhinan/shebao/23738.html
19.艾尔登法环在线和离线区别是什么艾尔登法环在线和离线区别是什么 玩家还可以看到其他玩家留下的随处可见的血迹这实际上是来自其他玩家在此之前的失败经历。从中玩家可以获得前人的经验观看他们的操作从而避免自身相同的错误增强生存的可能性。玩家还可以留言在地面上为后来人指明方向或留下警示这在艾尔登法环的世界让玩家们形成了一种独特的互助文化https://www.52xz.com/information07/418002.html