打印

请教:当快速CPU遇到慢速外设时,如何实现实时性问题?

[复制链接]
4039|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
crazyfool|  楼主 | 2013-8-25 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如72MHz的stm32外挂相对低速的12864液晶模块,如何实现:既能保证液晶的正常显示,又保证系统的实时性——或者说:在液晶驱动/显示时,不要简单地用delay函数,将时间白白地浪费在上面?
我现在的做法是:将液晶函数分时工作,即将原本:A-延时-B-延时-C-延时...,改成每2ms执行一个功能,顺序是A-B-C。但感觉还是麻烦。有无别的思路?请前辈赐教。

顺带一个问题:
蜂鸣器等部件可能在多个功能模块中使用,如何在整个系统中合理实现?比如在功能A中遇到按键有效,响一下;在功能B中遇到xx情况,蜂鸣器断续报警;在功能C中,遇到yyy,蜂鸣器持续响。而功能A、B、C分别在三个不同.c文件中编写。请教如何高效、准确地实现对蜂鸣器的控制?

谢谢!

相关帖子

沙发
crazyfool|  楼主 | 2013-8-25 10:46 | 只看该作者
蜂鸣器问题我现在是每个模块外带一个标志位,然后统一在main中处理。这就必须用到全局变量。

使用特权

评论回复
板凳
crazyfool|  楼主 | 2013-8-25 10:46 | 只看该作者
自己再顶顶,欢迎前辈支招。谢谢!!

使用特权

评论回复
地板
ZG11211| | 2013-8-25 11:14 | 只看该作者
12864反应慢的确是同疼的问题。换其它新的显示单元成本又是个问题

使用特权

评论回复
5
crazyfool|  楼主 | 2013-8-26 21:29 | 只看该作者
强力顶起,希望前辈分享经验啊:lol

使用特权

评论回复
6
xyz549040622| | 2013-8-26 23:03 | 只看该作者
建个缓冲区,有的自带FIFO的

使用特权

评论回复
7
xyz549040622| | 2013-8-26 23:03 | 只看该作者
建个缓冲区,有的自带FIFO的

使用特权

评论回复
8
elec921| | 2013-8-27 08:33 | 只看该作者
用串行,SPI给数后就去干别的,一会回来检查标志,不行就搞个状态机,每次都轮询。

使用特权

评论回复
9
ayb_ice| | 2013-8-27 08:49 | 只看该作者
这就需要一些高级概念了
通过时间片将任务分时执行,具体到1602也没有必要分时操作,先在缓冲区操作数据,最后一次性传输给LCD显示即可,可以判断不需要刷新则不操作。

另外一个问题其实是信号量问题,对公共资源的访问都要先获取权限,再操作,怎样获取权限就与实际需要有关,有些资源只能独占,不能被中断,这种情况也好处理,只要做标志位即可,有些可以被中断,这时需要算法维护,可以简单的通过优先级控制,设个标志,标示谁正在使用,申请使用者先判断能否中断当前操作,成功后即可操作,同时设置新的标志,当然算法很多。。。

使用特权

评论回复
10
crazyfool|  楼主 | 2013-8-27 09:19 | 只看该作者
xyz549040622 发表于 2013-8-26 23:03
建个缓冲区,有的自带FIFO的

普通的液晶模块,不带FIFO吧?
建立缓冲区即将需要写到液晶的数据先写到缓冲区,然后分时按FIFO原则写到?
这个真没用过,谢谢!好好学习学习!

使用特权

评论回复
11
crazyfool|  楼主 | 2013-8-27 09:21 | 只看该作者
elec921 发表于 2013-8-27 08:33
用串行,SPI给数后就去干别的,一会回来检查标志,不行就搞个状态机,每次都轮询。 ...

用串行能解决问题吗?疑惑中。关键是液晶速度太慢,需要不断检测BUSY,在写入某些指令后必须延时,有的甚至要延时若干ms。
状态机我只是简单用在按键检测,其他高深的不懂啊:Q

使用特权

评论回复
12
crazyfool|  楼主 | 2013-8-27 09:28 | 只看该作者
ayb_ice 发表于 2013-8-27 08:49
这就需要一些高级概念了
通过时间片将任务分时执行,具体到1602也没有必要分时操作,先在缓冲区操作数据, ...

谢谢指引!
缓冲区的大小如何界定?最后一次性传输是如何操作的?液晶能一次性接收那么多指令或数据吗?您的意思是先在缓冲区写数据,然后分时一次性将传输给LCD?

使用特权

评论回复
13
ayb_ice| | 2013-8-27 09:32 | 只看该作者
一般LCD操作都是这样的

通过映象RAM操作,功能好点的还有很多个页面RAM,最后对多个页面进行操作混合成最后一个页面的数据显示

使用特权

评论回复
14
yhn1973| | 2013-8-27 11:10 | 只看该作者
这种液晶最烦人了,说长不长,说短不短,好多命令都是延时几十us

使用特权

评论回复
15
受不了了| | 2013-8-27 11:28 | 只看该作者
好多年不用液晶屏,工作量少了好多

使用特权

评论回复
16
elec921| | 2013-8-27 13:26 | 只看该作者
crazyfool 发表于 2013-8-27 09:21
用串行能解决问题吗?疑惑中。关键是液晶速度太慢,需要不断检测BUSY,在写入某些指令后必须延时,有的甚 ...

检测buzy可以轮询啊,就是每转一圈过来检查下BUZY标志,如果还是忙就继续去干别的,别死等呀
每圈需要干什么都按状态分好,一圈圈转就是了

使用特权

评论回复
17
crazyfool|  楼主 | 2013-8-27 15:28 | 只看该作者
elec921 发表于 2013-8-27 13:26
检测buzy可以轮询啊,就是每转一圈过来检查下BUZY标志,如果还是忙就继续去干别的,别死等呀
每圈需要干 ...

我现在干脆直接每隔10ms执行一个任务了。

使用特权

评论回复
18
ahnusunwu| | 2013-8-28 00:10 | 只看该作者
Ti有FIFO芯片,就是可以用于快速与慢速之间的矛盾!!!!

使用特权

评论回复
19
elec921| | 2013-8-28 08:58 | 只看该作者
crazyfool 发表于 2013-8-27 15:28
我现在干脆直接每隔10ms执行一个任务了。

这个。。。

使用特权

评论回复
20
zdhlixiang2006| | 2013-8-31 18:55 | 只看该作者
我的一点看法:$
关于第一个问题:
    既然你都用了STM32这么高档的芯片,我不相信你的软件结构是前后台的(如果你是在校学生,当我没说:lol),这里一般都会用OS的,在OS中,它是最喜欢这种情况了,因为CPU的高速和外设的低速矛盾正是多任务并发运行的前提,请你好好理解这句话!至于怎么解决12864的情况,自己好好想想这句话就会有答案的
关于第二个问题:
   这个应该不难吧,搞一个子函数,入口参数要包括你这几种模式,然后里面分别处理就好了,当然这个子函数要定时执行不就OK了?该函数你要在其头文件中对外声明,然后别的C函数调用其即可,OVER

使用特权

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

本版积分规则

96

主题

172

帖子

2

粉丝