初中生
最后登录1970-1-1
在线时间 小时
注册时间2017-8-8
|
楼主 |
发表于 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大佬
|
|