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.机器学习:在线学习和离线学习区别机器学习中的在线学习(Online Learning)和离线学习(Offline Learning)是两种不同的学习方式,它们在数据处理和模型更新方面有着明显的区别。以下是它们的主要区别: 数据获取方式: 在线学习:在在线学习中,模型是不断地从数据流中接收新的样本并进行学习。这意味着模型会随着时间的推移不断更新,以适应新的数据。 https://blog.csdn.net/weixin_41194129/article/details/132998721
2.由于当前在线组态数据与离线组态数据不同,因此无诊断数据可用新建的程序文件,里面没程序的,正在组态,用的博图V15的,除了主CPU1511正常的,其他的所有模块包括PS模块都显示由于当前在线组态数据与离线组态数据不同,因此无诊断数据可用,请教一下什么原因 【方案】服务智能物流,华北工控RPC-610M整机支持自动分拣系统应用 只看该作者 | 赞[0] | 踩[1] | 引用 | 回复 | http://bbs.gkong.com/archive.aspx?id=477495
3.离线与在线LowE玻璃的区别?昨天,小鹰为大家介绍了什么是离线和在线Low-E玻璃,而这两个玻璃既有在线和离线之分,便一定是有区别的,那么他们区别又是什么呢? 根据两种Low-E玻璃膜层和工艺的不同,我们可以这样理解他们的区别: ①离线Low-E玻璃 离线Low-E是银膜,而我们日常常听说的单银、双银、三银Low-E玻璃,一般都是离线Low-E玻璃。 https://m.zhuxiaobang.com/weitoutiao/1749702716089347?channel_source=baidu_biji
4.案例9:使用计算—离线和在线使用的主要区别在离线仿真与在线仿真中递归计算(计算中某个输出位号作为自身的函数)的行为是不一样的。行为的不同是因为嵌入离线仿真和嵌入在线系统的设计差异导致的。本教程的目的是着重介绍这一差异。 ?在离线仿真器中,k时刻的值被用于初始化k+1时刻的仿真。如果你有计算[A] =[A]+1且[A]=0,那么开始时产生的顺序是1https://www.jianshu.com/p/28da66d9eafb
5.在对齐AI时,为什么在线方法总是优于离线方法?澎湃号·湃客该团队采用了与 Gao et al. (2023) 类似的设置,基于一组开源数据集进行了实验,结果表明:在同等的优化预算(相对于 SFT 策略的 KL 散度)下,在线算法的性能表现通常优于离线算法。 图1 给出了在线和离线算法在四个不同的开源数据集上表现出的 KL 散度与策略性能之间的权衡。图中的每个数据点代表了在训练过程https://www.thepaper.cn/newsDetail_forward_27434433
6.微信在线不在线的区别是什么?有什么方法知道好友是否在线?几年前,我们常用的聊天软件是qq,而现在,微信的风头几乎已经改过了qq。微信在很多功能方面和qq类似,不过,也有些不一样的功能。比如,微信在线与不在线,很多人都不知道这两者有什么区别,下面,我们来看看具体的情况。 其实微信是不能看好友在不在线的,这是微信的一个特点,就是没有在线与离线。也就是说,在线与不https://www.kaitao.cn/article/20180906115708.htm
7.在线设备与离线设备的区别在线设备与离线设备的区别 04月22日 一、设备状态 在线设备指的是能够在任何时刻通过网络进行连接的设备,它通常需要依赖网络进行设备的控制和管理。而离线设备则指那些不能随时进行网络连接的设备,通常是一些独立应用的设备,如手机、电脑等。 二、数据处理 在线设备具有实时性,能够实时处理和传输数https://b2b.baidu.com/q/aland?q=1D130616002178711A2209220616002178717C0D0E317839&id=qid50cf7396802e9c034832fe078d066429&answer=2521268275454283123&utype=2
8.《诛仙鬼王传》离线在线经验哪家强?诛仙鬼王传再来是在线和离线挂机经验的计算方式不一样。官方的解释是:在线是根据你实时的所得计算。而离线则是按照理论杀怪数值计算。 PK结果,在官方的一些数据帮助下,得出的结论是。 如果你杀怪的时间在5秒以下,那在线挂机所获得的经验会更多。反之如果高于5秒,那离线获得的经验会更多。但并不代表我离线时间越长,获得的经https://a.9game.cn/zxgwc/709605.html
9.生物发酵展资讯发酵工艺:毕赤酵母工程菌高密度发酵及其影响离线检测包括气象色谱法、高效液相色谱法等,由于其检测的滞后性无法准确的控制甲醇的流加速率,从而导致外源蛋白表达不完全或菌体中毒死亡。在线检测法通常是针对甲醇挥发性的检测,常用的检测方法是通过分析发酵过程中所排出的尾气,同时结合甲醇在气液两相中的平衡系数得出发酵液中甲醇的浓度,有学者发明了一种自动化连续https://www.biozl.cn/3226.html
10.在线互动式UPS在线式UPS离线式UPS三种UPS原理与对比在线交互式 UPS 与在线 UPS 与离线 UPS:应用 这三种不同运行原理的拓扑结构的应用从小型住宅到大型数据中心都有所不同。 离线式UPS因其较高的能源效率和经济性,最常用于家庭、小型办公室,电源设计预算较低,以及一些对供电质量要求相对较低的领域,个人电脑的最佳价值,也适用于打印机、扫描仪、应急电源和 EPABX。https://cloud.tencent.com/developer/article/2239093
11.双人成行离线和在线有什么区别双人成行二号玩家加入方法1、玩法不同。双人成行离线的玩法为线下玩法,需要玩家在线下相聚才可以一起游戏。双人成行在线可以通过网络直接游戏,不需要线下相聚。 2、网络要求不同。双人成行离线不需要网络连接,也就是说玩家在没有网络的情况下也可以正常游戏。而双人成行在线需要有比较好的网络环境才可以进行游戏。 https://gl.ali213.net/html/2022-6/860745.html
12.离线LowE玻璃与在线LowE玻璃的优缺点离线Low-E玻璃一般采用真空磁控溅射镀膜工艺,在玻璃表面镀制多层复合膜,实现Low-E功能。最主要的优点是颜色丰富多彩,纯度、热学性能均优于在线Low-E玻璃。离线Low—E玻璃品种多样,根据不同气候特点可以制作高、中、低多种透过率产品,并且颜色上有银灰、浅灰、浅蓝和无色透明等,用着色玻璃还可制作绿色等其他多种颜色https://www.yoojia.com/ask/3-9742006234974497042.html