STM32中OTA与App使用的问题

因终端有远程升级的需求,终端固件划分为两个部分。

数据传输方式:GPRS

MCU:STM32F301C8T6     16k+64k

1、OTA部分:ota部分程序的功能是通过GPRS模组接收服务器下发的app文件。并将bin文件写入在app固件对应的Flash区。完成bin文件的接收和写入后,清除flash中的ota更新请求标记,然后系统主动软件复位。系统复位重启后检测更新标记已经被清除,直接跳转至app代码区。在每次系统复位之后,系统都是从ota部分代码区开始运行的,进入ota代码区后读取flash中是否有更新请求标记,如果有就通过GPRS请求更新数据包,如果没有就直接跳转到app代码区。ota代码区flash地址设置为0X08000000--0X08005800,大小为22k,实际ota代码大小为0X5080 小于21k。注意,该代码区的大小必须为0X200的整数倍。

 

2、APP部分:app部分是正常的业务代码,具体内容与实际项目内容相关联。除了业务逻辑的处理外,app代码需要通过GPRS接收服务器的更新请求,并将更求请求标记写入Flash中,写入完成后,系统主动软件复位。app部分代码flash起始地址为0X08005080,大小为0XA800。地址分为在MDK中进行设置。

 

问题描述1:

由于mcu资源限制,随着app处理的问题增加,app的代码变多,生成的app.bin大小也接近系统的flash限制。于是对app工程设置的优化选项。优化等级设为2级优化,优化后,生成的bin文件小了4k左右。当系统的1.3版本经过优化后,业务逻辑仍然能正常处理。但导致系统进行ota时程序死机。ota代码无法正常完成更新。系统从此停留在ota代码区的死机部分。在1.2版本的app工程中,进行OTA升级时未出现死机的情况,测试板子运行正常。

 

问题描述2:

在1.2版本的app工程中,进行了小批量的OTA升级测试,一共进行升级的设备共84台,设备分布在实际的使用环境中。其中发现1台出现于1.3版本一样的死机情况。

 

 

问题分析:

系统死机后,在ota工程中死机的前一步分加入关键变量值的打印,然后重新烧录进行ota。发现控制循环的变量值发生了变化。

在队列清空函数中,循环结束变量是当前队列的长度和位置的和,变量类型均为u16 ,这两个变量的值在正常的情况下被初始化为0。出现异常时其和的值变成256. 此时在for循环中自增变量的类型为u8,最大值为255.故无法跳出此循环,进而出现系统不能继续往后运行的情况。

在1.2版本中出现死机的设备关键变量值的打印,队列的长度和位置的和的值为12965,仍然不能跳出循环。

 

产生问题的可能原因:

1、OTA部分与APP部分RAM区重合导致数据干扰。

由于在两个工程中做了Falsh区的隔离,但未对RAM区进行隔离,可能会导致OTA工程中全局变量的初始值被修改的情况。

测试实验:在MDK中对RAM区进行隔离设置。该问题仍然出现,故排除RAM区重合的原因。

 

2、原因分析中。。。

 

解决方案:

更改OTA代码中队列清除函数中循环变量的类型为u16,保证变量的初始值被修改也能跳出循环。

 

相关连接:

https://community.st.com/message/192335-problem-about-stm32f301-iap

posted on 2018-04-07 09:04  iDea2011  阅读(4240)  评论(1编辑  收藏  举报

导航