OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3532|回复: 5

通过蓝牙升级之后,程序直接卡死?

[复制链接]

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 2023-5-25 17:09:13 | 显示全部楼层 |阅读模式
程序分为三个部分,IAP,  APP,  备份区域。同时还将内部FLASH模拟EEPROM进行使用,存储升级的相关参数以及其它信息。现象:   现在的问题是设备不升级就没有问题,升级成功直接跳到app没问题,升级失败调用备份程序也没问题。 但是一旦升级成功,不论是软件重启还是硬件重启,都会将程序卡死,
参考:  卡死的位置都在同一个函数里面,也就是获取所有参数信息的Getalldata,这个函数的作用就是将flash里面存储的参数读取出来供判断,为了规避干扰,我将整个过程设置为临界保护段,但是退出临界区的时候,直接卡死
疑惑:   问题是因为 uxCriticalNesting  这个变量是一个非常大的值,导致无法退出,这是我怎么都想不明白的,因为这个值在任务调度器的调度函数里面已经初始化为0了,怎么会被改变呢? 我的临界区也是成对使用的,同时这个临界区使用是在任务调度之后,此时uxCriticalNesting  已经被赋值为0了


个人思考:思考1、首先这个临界区并不是把所有中断都屏蔽的,中断优先级在0 ~ 4直接是无法打断的, 思考2、升级成功之后并重启才会出问题,期间失败去调用备份都不会出现这个问题,那升级过程中到底改变了什么未知的部分,因为所有内存部分都是规划好的   思考点3、程序卡死之后,我将IAP以及APP的Getalldata都屏蔽了,程序正常运行,但是加上之后又卡死
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-5-25 17:16:24 | 显示全部楼层
中断优先级在0 ~ 4直接是可以打断的
回复 支持 反对

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-5-25 17:18:10 | 显示全部楼层
15284083060 发表于 2023-5-25 17:16
中断优先级在0 ~ 4直接是可以打断的

我用vTaskList打印任务信息,历史最小堆栈都还有很大的值,也不是堆栈溢出,我deug的时候也没有进硬件中断
回复 支持 反对

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-5-25 18:49:19 | 显示全部楼层
还有一点,个人觉得最可能的原因是:GD32的主频是108M,但是STM32同款型号是72M,在开发的时候用的是STM32CuBEmax生成的代码,按照STM32的配置来看,主频是72M,CPU的读写操作就是72,但是对flash的读写速度是<=24M, 所以在频率设置的时候对读写是两个等待周期,但是主频为108之后读写速度应该是4个等待周期,我猜测会是这个问题
回复 支持 反对

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1387
金钱
1387
注册时间
2019-5-29
在线时间
163 小时
发表于 2023-5-25 20:14:51 | 显示全部楼层
程序使用bootleader了吗,有没有可能是在使用bootleader搬运的过程中,修改过某些内容
偷偷摸鱼
回复 支持 反对

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-5-30 10:03:33 | 显示全部楼层
这个问题解决了,和上面这些猜测都没关系,因为我用到了一个strtok,以及sscanf函数,但是要解析的字符串结尾并没有任何标识位,所以必须要要有'\0',因为我直接用%s解析出去的,在没升级之前,FLASH存储这个字符串结尾都是带有'\0'的,直到升级成功,我跟新版本的时候,把这个'\0'弄丢了,再次读取解析的时候,就直接出错,这个问题总结出来就是,解析字符串的时候用sscanf解析,并且规规矩矩的在结尾放好标识符,别学我瞎搞就没事
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 06:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表