野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5460|回复: 6

[ucos] uCOS-III用ADC的MDA方式采集,出现程序跑死,怎么破?

[复制链接]
发表于 2019-8-2 23:31:05 | 显示全部楼层 |阅读模式
本帖最后由 huashi 于 2019-8-2 23:39 编辑

火哥,我今天用F103跑uCOS-III,想用ADC通过DMA的方式采集电压,结果程序跑死,一直卡在准换那里,找了一圈各大论坛,没有找到解决方法,只能求助火哥,还请火哥指点迷津
回复

使用道具 举报

 楼主| 发表于 2019-8-3 16:40:40 | 显示全部楼层
本帖最后由 huashi 于 2019-8-5 00:52 编辑

搞定!!!!!结帖!!!!!以下是我解决问题的过程及方法:
我的目的是想通过移植uC/OS-III实现一些外设模块的调试,主要是想在今年(2019)的电子设计竞赛上跑一下uC/OS,起初参考火哥的例程进行了LED移植,很成功,
然后想能通过ADC采集电压值,直接像LED一样把BSP文件直接复制过来,这时我就想是不是直接像LED一样写个while()就可以了呢?不试不知道,一试吓一跳,系统跑死了?
(1)首先怀疑是配置出问题了,于是我检查了一遍代码,嗯……好像没问题,按复位,没反应……再看一遍代码,没毛病啊。
(2)Debug看一下,绝望啊~ 寄存器已经有变化,但就是没反应。
(3)上百度、论坛搜索、问同学,无果~(渐渐失去信心)
(4)(凌晨)发帖求助火哥,等候通过审核,希望火哥或者大虾能为我解惑。
(5)等待帖子审核通过的过程不敢闲着,翻书!  我的天!!!我找到问题所在啦!!!
在Jean J.Labrosse大佬的《uC/OS-III,The Real-Time Kernel》即《嵌入式实时操作系统uC/OS-III》(宫辉、曾鸣等译,邵贝贝审校)一书中写到:“在无限循环类型的任务中
必须调用某个uC/OS-III服务函数,使该任务进入某个等待事件的状态。确保每个任务都需要等待某个事件的出现是非常重要的,否则该任务就成为一个真正的无限循环……”
哎~书到用时方恨少,
(6)我回到自己的代码一看,再和例程对比,确实例程代码都有调用uC/OS的服务函数,于是我就在while()最后加了一句"OSTimeDly(1, OS_OPT_TIME_DLY, &err);"
看着烧写进度条走完,久违的心跳(LED指示)跳动了,系统跑起来啦!!!(鸡冻~_~)
到这系统跑死的问题就解决了,接下来分享一个BUG,额……也不能称之为BUG吧,
(7)系统跑起来了,ADC启动了DMA启动了,打开串口一看,what?   Val=0.000 ?!什么情况?(难受啊!搞了三天了居然是这么个结果T^T)
(8)不慌,代码虐我千百遍,我爱代码如初恋。又是一波Debug走起!嗯是的DMA正常,ADC->DR正常(ADC->DR = 0xFFFF,我接到3.3V上),奇怪了,怎么pirintf()打印出来
就成了0.000呢,不应该呀
(9)同样一波百度、论坛逛一圈(CSDN、本站、电子发烧友、正点原子论坛、GitHub),忽然看到一个标题为“在UCOS-II使用sprintf转化浮点数所遇到的问题”,点进去一看,
嗯……我的问题应该也是浮点数据的问题吧,直接定义一个浮点数据float i = 1.2; printf()一下,得到“i = 0.000”,我去还真是这个问题,T^T
(10)在任务堆栈前加“__align(8)”,呦!解决了!套用我们院长的一句名言:我们做学习(做物理)的不能只知其然,更应知其所以然……
(11)又是一波查资料,网上大佬说:在ARM中器本身不支持非对齐数据的存取,因此在有了64bit的数据操作指令后,指令要求8字节对齐。是先有8字节对齐的AAPCS,
然后才有的CM3,CM3 r2p0之前,自动压栈也不要求8对齐,r2p0好像才是强制对齐的,printf的8对齐是C运行库要求的,和硬件无关,C RTL手册有写,可以去阅读。
于是乎~翻书去!
好了,结帖!手动艾特WishWish大佬
回复 支持 反对

使用道具 举报

发表于 2019-8-3 17:34:25 | 显示全部楼层
huashi 发表于 2019-8-3 16:40
搞定!!!!!结帖!!!!!

分享下解决的办法呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-4 23:27:25 | 显示全部楼层
WishWish 发表于 2019-8-3 17:34
分享下解决的办法呢

哦哦,好的,有点上头,忘记了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-5 00:54:14 | 显示全部楼层
WishWish 发表于 2019-8-3 17:34
分享下解决的办法呢

经验置顶哈,WishWish大佬
回复 支持 反对

使用道具 举报

发表于 2019-8-5 09:05:27 | 显示全部楼层
huashi 发表于 2019-8-3 16:40
搞定!!!!!结帖!!!!!以下是我解决问题的过程及方法:
我的目的是想通过移植uC/OS-III实现一些外 ...

从这就可以看出来,用RT-Thread的必要性,资料以及可以交流的人都挺多的
回复 支持 反对

使用道具 举报

发表于 2019-8-5 13:52:25 | 显示全部楼层
我上周把emWin的基础例程和手机空中WIFI的例程柔和起来。最后也是在合适的地方加上 OS的延时就可以跑起来了。
上了OS,有时候还会出现个别线程死掉的情况。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-4 01:37 , Processed in 0.028318 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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