打印

求助关于UCOSIII的一些问题

[复制链接]
1795|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
过路人1024|  楼主 | 2019-1-23 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

金钱
1、有个疑问,我在ucos中创建了两个任务,一个任务0是死循环闪烁LED0,用UCOS的延时,另一个任务1死循环闪烁LED1,用软件for循环延时,我在任务1里,LED1开始闪烁的时候,关闭了时间片调度,闪烁完了后,又打开了时间片调度,按我的理解是,任务1LED闪烁的时候,任务0的LED应该不会闪烁的,因为关掉了时间片,用的延时也不是ucos延时,所以任务0理应是等任务1执行完了再执行的,然而实际是任务0的LED0也会跟着一起闪烁。。。
2、在创建的任务中,只要调用了0.96寸TFT彩屏的显示程序就会出问题,有两个任务,只执行了第一个任务,就一直停止了,用debug调试发现进入了HardFault_Handler中断函数,请问这是什么原因?堆栈大小也改变了,从128一点点增加调到10K都不行,时间片调度时间也一点点改大了,也不行。在驱动彩屏通讯的时候,也尝试过关闭时间片,驱动完在开启,还是不行。求教这应该怎么解决?

相关帖子

沙发
ningling_21| | 2019-1-23 13:12 | 只看该作者
驱动TFT彩屏需要多少内存?

使用特权

评论回复
板凳
xstong| | 2019-1-23 15:24 | 只看该作者
1.ucosiii增加了时间片轮转调度,但还有系统的时钟节拍中断要产生任务调度,任何中断返回都会产生任务调度。
2.HardFault_Handler必定是执行了某些异常的操作,比如访问0指针,数据执行除0操作等等!

使用特权

评论回复
地板
过路人1024|  楼主 | 2019-1-23 21:59 | 只看该作者
ningling_21 发表于 2019-1-23 13:12
驱动TFT彩屏需要多少内存?

一张图片25K

使用特权

评论回复
5
过路人1024|  楼主 | 2019-1-23 22:02 | 只看该作者
xstong 发表于 2019-1-23 15:24
1.ucosiii增加了时间片轮转调度,但还有系统的时钟节拍中断要产生任务调度,任何中断返回都会产生任务调度 ...

请问类似模拟SPI、模拟I2C通讯等函数、读外部数据等不能被中断的函数,在ucos中应该做怎么的处理呢?

使用特权

评论回复
6
xstong| | 2019-1-24 08:33 | 只看该作者
这些操作为什么不可以被中断呢?如果是独立任务操作,可以中断!
具体的方法要看你的应用而定,如果是多任务访问共享资源,没有延迟,可以开关中断来保护,如果执行保护时间比较长,可以给调度器上锁或者使用互斥锁。
模拟SPI,I2C可能执行时会用到延迟函数,如果是使用系统的延迟函数必定要产生任务调度,这时候不能关中断,不能调度器上锁,只能用互斥锁。
而外,模拟SPI,I2C即便需要延迟应该是比较短暂的,最好自己写个纯的延迟等待函数。系统延迟OSTimeDelay至少会延迟一个时钟节拍,一般至少1ms。

写OS程序,设计框架很重要,尽可能避免多任务共享IO操作。

使用特权

评论回复
7
kingkits| | 2019-1-24 08:39 | 只看该作者
本帖最后由 kingkits 于 2019-1-24 08:41 编辑

正常通讯都是使用芯片自带的接口,模拟I2C总线一般对中断的干扰不敏感, 模拟SPI 对短暂的中断也能忍受,如果确认中断会影响通讯,可以考虑使用timer中断完成SPI 时钟及数据发送接收,最后一种,就是关中断(前提是你的中断服务中没有不能容忍的延时)

使用特权

评论回复
8
xstong| | 2019-1-24 08:40 | 只看该作者
做过很多项目,UCOS中使用最多的就是事件标志,偶尔用下互斥锁,系统的时钟节拍都不会用的(很多低功耗产品,即便时钟节拍设置4-8次/秒,平均功耗会增加不少)! 纯靠事件来驱动!

使用特权

评论回复
9
xstong| | 2019-1-24 08:47 | 只看该作者
另外,值得注意的是,与写裸机程序不同的是,很多库函数是不可重入的比如malloc,free,printf等,如果多个任务操作,可能会撞上同时执行,必定会产生BUG或者HardFault_Handler中断。这些操作必须做好保护,另外还有任务栈的定义,一定养成一个习惯,定义的时候声明为8字节对齐(严格遵守AAPCS的库函数可能会要求8字节对齐)。

使用特权

评论回复
10
kingkits| | 2019-1-24 10:11 | 只看该作者
ucosii 主要靠系统的几个调度函数(比如信号,系统延时等)显式地切换任务,因此,你使用死循环调用时会出现你期望的现象
ucosiii 却不是这样,他有很多后台的调度会自动切换任务,因此会出现你看到的现象

使用特权

评论回复
11
caijie001| | 2019-1-25 08:37 | 只看该作者
HardFault_Handler的话用这个库去看看是什么原因导致的https://github.com/jiejieTop/CmBacktrace

使用特权

评论回复
12
caijie001| | 2019-1-25 08:41 | 只看该作者
过路人1024 发表于 2019-1-23 22:02
请问类似模拟SPI、模拟I2C通讯等函数、读外部数据等不能被中断的函数,在ucos中应该做怎么的处理呢? ...

临界段

使用特权

评论回复
13
caijie001| | 2019-1-25 08:42 | 只看该作者
xstong 发表于 2019-1-23 15:24
1.ucosiii增加了时间片轮转调度,但还有系统的时钟节拍中断要产生任务调度,任何中断返回都会产生任务调度 ...

时间片在同等优先级才起作用,如果高优先级任务没主动放弃CPU使用权,低优先级任务就会被饿死

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

39

帖子

0

粉丝