打印

请教各位:如何避免硬等待?

[复制链接]
3617|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
catwill|  楼主 | 2010-9-28 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近遇到一个比较困扰的事:
我用IO模拟时序驱动一个类SPI接口的芯片
每通讯一字节都要等待busy,大概2ms左右吧;
我发几条长指令的话,几十上百毫秒就浪费掉了。
如果以前用51,我就直接Delay();了
但是现在STM32 72MHz的主频,如果Delay就直接被浪费掉了,不绿色、不环保、不和偕、不能可持续发展啊;
感觉自己到了瓶颈:片内外资源越多,对资源的掌握就越差……
能不能调用一个函数,函数中需要delay的地方就自己跳出去干别的,等时间到了再回来?
想了想:用状态机,函数指针数组,switch case这样,需要放在循环中调用n次才能执行完一个命令;
而且带来重入等问题……
用操作系统?没接触过,移植等麻烦事就来了~
而且自己“裸奔”还操作不到位,比较迷茫呢,用系统估计迷茫的事情更多……
各位大佬给我出出注意吧,小弟先谢过了~

相关帖子

沙发
yewuyi| | 2010-9-28 09:51 | 只看该作者
用51就绿色、环保、和偕、可持续发展了吗?

至少需要熟悉什么前后台才能谈状态机。

使用特权

评论回复
板凳
catwill|  楼主 | 2010-9-28 10:12 | 只看该作者
只知道最简单的前后台:大循环是后台,中断为前台
但是这个模拟的类SPI我想把它放到大循环中,因为放到定时中断中的话会拖慢中断的速度;
但是每次通讯就会有若干个Delay();
困扰了几天没思路,
楼上指导一下?:)

使用特权

评论回复
地板
yewuyi| | 2010-9-28 10:16 | 只看该作者
你没有真正理解前后台的精华,所以无法谈下去。

建议你先恶补相关知识3月后再来回这个帖子会得到异常的收获。

使用特权

评论回复
5
catwill|  楼主 | 2010-9-28 10:25 | 只看该作者
楼上就多建议一下:相关知识
比如推荐一下书?
感觉相关知识就像相关部门一样虚无飘渺……
手边能弄到的书有:
邵贝贝教授翻译的uC/OS-II中译本--看过几页,完全不懂
陈明计的《SMALL RTOS》--看过一部分,80%不懂
《C和指针》--这个已经看了一半左右,恶补了一下C语言^_^
《C专家编程》 -- 这个当小说看了一点
《C陷阱与缺陷》-- 这个看了几十页,没**住,主要是和作者差距太远
《匠人手记》-- 看过一遍
《51单片机工程应用实例》唐继贤著 -- 没看过
“51单片机入门”一类书有几本,基本翻烂了,感觉没有介绍我这个疑惑的
关于单片机编程思想的书没找到合适的
楼上可否有推荐的?
谢谢!
另:知道51中 Delay(); 也不可持续发展……

使用特权

评论回复
6
fzu_csc| | 2010-9-28 10:26 | 只看该作者
想了想:用状态机,函数指针数组,switch case这样,需要放在循环中调用n次才能执行完一个命令;
而且带来重入等问题……

觉得这样就挺好。

多任务就必然会有重入的问题。如果没有多任务需求,那么delay即可,没啥好浪费的;有这个需求,那就认真解决重入问题。不过,任务切换也是需要时间的。

使用特权

评论回复
7
yewuyi| | 2010-9-28 10:29 | 只看该作者
翻翻一本很老的书,《时间触发嵌入式系统设计模式》

使用特权

评论回复
8
HWM| | 2010-9-28 10:31 | 只看该作者
to LZ:

采用中断服务程序处理,这是避免硬等待的基本方法。当然前提是具有相应的中断资源。

使用特权

评论回复
9
catwill|  楼主 | 2010-9-28 10:38 | 只看该作者
《时间触发嵌入式系统设计模式》手边只有电子影印版的
(希望作者不会骂我……关键是现在的书良莠不齐,我都是尽量弄到电子版浏览一下再买的……)
10.1期间仔细看一下,谢谢yewuyi!

to 8楼 HWM:
IO 模拟的类SPI接口,放到定时中断中感觉会拖慢中断的速度,因为里面有几个us级的Delay
现在先想把ms级的Delay()占用的CPU节省下来~

to 6楼 fzu_csc:
谢谢鼓励:我也是想这次先用Delay()实现功能,以后自己进步了再优化^_^

使用特权

评论回复
10
fzu_csc| | 2010-9-28 10:42 | 只看该作者
7# yewuyi

搜索了下这本书,当当卓越都缺货,淘宝上倒还有卖,57左右。

看这名字,时间触发,是不是有点类似uc/os-ii的时间管理;目前正在看uc/os-ii,看了uc/os-ii,这个还有必要把这本书卖来看看么?

使用特权

评论回复
11
yewuyi| | 2010-9-28 10:42 | 只看该作者
想了想:用状态机,函数指针数组,switch case这样,需要放在循环中调用n次才能执行完一个命令;
而且带来重入等问题……

觉得这样就挺好。

多任务就必然会有重入的问题。如果没有多任务需求,那么delay即可,没啥 ...
fzu_csc 发表于 2010-9-28 10:26


抢占性实时多任务才有比较严重的重入问题,如果是协调性质的前后台结构,只要稍微关注一下代码写法,可基本不存在重入问题,当然前提是要懂什么叫重入,这样在写代码的时候稍加注意即可。

使用特权

评论回复
12
catwill|  楼主 | 2010-9-28 10:48 | 只看该作者
嗯……
那个……
结贴之后这个帖还能回吧?……:L

使用特权

评论回复
13
HWM| | 2010-9-28 10:50 | 只看该作者
to 9L:

针对“ms级的Delay()”搞个对应的计时器即可,然后再考虑相应的中断处理。当然前提还是具备相应的资源。

OS方法当然可以,但其有消耗。也许可能还得不偿失。

使用特权

评论回复
14
catwill|  楼主 | 2010-9-28 10:55 | 只看该作者
楼上是说不完全放到定时中断中,谢谢!我再仔细想想

使用特权

评论回复
15
catwill|  楼主 | 2010-9-28 10:56 | 只看该作者
楼上是说不完全放到定时中断中,谢谢!我再仔细想想

使用特权

评论回复
16
catwill|  楼主 | 2010-9-28 10:59 | 只看该作者
这网速……
我结贴的时候点了两下,就给各位的分数都*2了,呵呵!

使用特权

评论回复
17
yewuyi| | 2010-9-28 11:18 | 只看该作者
定时完成任务并不必须把任务一定要放在定时中断中完成。

以前有人用强实时和弱实时来形容任务,这个比喻还是很有道理的,基本上一般任务都是弱实时的。

TO fzu_csc:时间触发并不一定UCOS,即使是前后台也是一种时间触发方式。

使用特权

评论回复
18
catwill|  楼主 | 2010-9-28 11:23 | 只看该作者
“弱实时”……我依稀想起了“农民讲习所”
可惜那时与所长差距太大,根本理解不了他的想法……

使用特权

评论回复
19
yewuyi| | 2010-9-28 11:26 | 只看该作者
弱实时也不是所长创造的,这个概念在NN年就已经有前辈高人讲过。

使用特权

评论回复
20
宇宙飞船| | 2010-9-28 12:47 | 只看该作者
精能硬件汇编语言,闭上眼睛也能DIY 一个OS出来。
楼主可以参考ARM7的硬件做法。再在8位机上用软件模拟。

使用特权

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

本版积分规则

4

主题

72

帖子

0

粉丝