打印

在定时中断里做**

[复制链接]
4206|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
s99060|  楼主 | 2007-2-3 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tyw| | 2007-2-3 19:39 | 只看该作者

在定时中断里做**

可设置一个适当的公共时标,例如10ms
红灯开0.1s,关0.5s
    开计数10(10x10ms=0.1s),关计数50(50x10ms=0.5s).
绿灯开0.3s,关0.6s
    开计数30(30x10ms=0.3s),关计数60(60x10ms=0.6s).

使用特权

评论回复
板凳
s99060|  楼主 | 2007-2-3 20:54 | 只看该作者

在中断中处理大量这类问题时是不是太麻烦呢

这还要用到状态机(上面的问题只是个例子),比如有两对灯(不是两个灯了):
一对:红亮1s,灭2s,绿灯亮3s,灭4s
另一对也一样,只是时间不同

使用特权

评论回复
地板
tyw| | 2007-2-3 21:03 | 只看该作者

定时中断中仅每隔5ms取反一个标志,二次"1"间隔10ms

在中断外,母程序里检测这个标志,是"0"不动作,是"1"了就让各个计数器减1,哪个计数器为"0"了,就做相应的开或关的动作

使用特权

评论回复
5
s99060|  楼主 | 2007-2-3 23:07 | 只看该作者

问题就在这里

这相当于为每组红绿灯设置了一个单独的定时器,主程序只处理一组灯时只要一直等待时间到后继续下一步即可,而如果是两组灯它就不能一直等着,需要跳出,为第二组灯服务,当然第二组也不能等着,还要回来管第一组

回来时,程序需要知道第一组灯将要干什么,也就是要进入刚才跳出的断点!!

可以用状态机,但状态机在需要经常变更功能的时候就麻烦了,而且编程时在每个断点还要写个状态

我用汇编时就在断点处保存PC地址(当然不是进堆栈),回来后取出即可,这个步骤在每个断点处都是一样的,当然程序也一样,用了一个子程序,编程时就像一个等待循环

可这个方法在C里能直接实现吗?好像还是要用到汇编吧...因为C来调用那个断点子程序时不知道他往堆栈里压了些啥,这样看来加入汇编似乎也不成啊

使用特权

评论回复
6
maychang| | 2007-2-3 23:13 | 只看该作者

回楼主

假定你上班时在做加热试验,对样品加热15分钟,停30分钟。你有某种病,需要每小时吃一次药。另外还和女朋友约好上午10点半给她打电话。
你需要几块手表?别跟我说戴三块。

使用特权

评论回复
7
dadodo| | 2007-2-3 23:54 | 只看该作者

哈哈

使用特权

评论回复
8
freego| | 2007-2-4 01:17 | 只看该作者

suggest to read some Multi-Task runing document

It is basic!

使用特权

评论回复
9
tyw| | 2007-2-4 08:09 | 只看该作者

每组计数器都有一个"计数到"标志

一开始计数就置"1",减到"0"了就置"0",母程序只要检查"计数到"标志安排做动作,由于循回速度很快,一般为几百us~几ms,所以不会耽误你的点灯动作的.
处理器是以快速的串行来模拟并行动作的

使用特权

评论回复
10
FZJ| | 2007-2-4 08:21 | 只看该作者

哈哈,maychang 的比喻强!

其实仔细想想就知道了.

使用特权

评论回复
11
s99060|  楼主 | 2007-2-4 09:57 | 只看该作者

要死,我哪个地方说过要3块表?

每个任务一个定时器是指你脑袋里记住的做每件事的时间,表当然还是一块!!!

现在也不是谈处理时间够不够的问题

比如每组灯:红灯亮,红灯灭,绿灯亮,绿灯灭,再红灯亮.......

第一组灯"红灯灭"的时间未完,还要等待(然后是要点亮绿灯),这时跑去照看第二组灯,假设第二组"绿灯亮"时间也没完,这时再回来:

这时时间到了,你知道这是什么意思吗?你这么知道是要亮红灯还是灭红灯抑或是对绿灯操作????????

这就要记住每组灯的控制状态,这其实就是状态机的道理,如前面所说,状态机有不方便的地方.

freego说得多任务(和多线程,多进程到底什么区别,一并讨教了)就是这个意思了,这里的两组红绿灯只是个最简单的例子,起码你要想到有100组,每组100个灯....呵呵!

操作系统里的多任务有种是用时间片的方式,在这里不合适的,另一种就可以了,遇到时间未到直接请求操作系统退出任务(线程/进程?)即可,不会浪费时间

我要的就是这种方式,但不用操作系统(资源,时间不够,项目不复杂,但东西多,用汇编都勉强够,想改用好点的MCU,用C编程).

但不管怎样,问:"只用"C能不能做到这点???(操作系统里用到汇编是不是包括解决这个问题)

使用特权

评论回复
12
s99060|  楼主 | 2007-2-4 10:17 | 只看该作者

继续

如果时间未到,就直接退出任务,这时要像进中断一样须保存断点,这个断点至少包括PC,还有必要的REG,且不能用系统堆栈

用汇编当然没问题,用C怎么保存和取出PC呢??C编译时也不知道怎样利用REG的,那就是说也不知道要保存哪些REG,那就全部REG都保存吧(和用操作系统一样浪费RAM空间),可这些好像没汇编不行...

要命的是:想用ARM的cortex-M3,就是ZLG推的LM3s,那个东西是thumb代码的,在Keil里说::::thumb里不能嵌入ASM~~~~  不嵌ASM就只有用独立的ASM函数, 可是怎样从ASM函数里跳出调用它的那个函数(任务)呢?

使用特权

评论回复
13
forthlab| | 2007-2-4 10:20 | 只看该作者

解决这个问题,就是用状态机!

但你说的:“但状态机在需要经常变更功能的时候就麻烦了”,不理解。
用C编程,变更功能的时候,很简单的。你按照状态机图修改就可以了。
不过用汇编就很麻烦的。
当状态机很多的时候,计算一下最恶劣的情况CPU资源是否够。

使用特权

评论回复
14
s99060|  楼主 | 2007-2-4 10:27 | 只看该作者

谢谢楼上!!

不好意思了,原来在汇编里用状态机是麻烦所以用了另一种办法...

马上试试!!

使用特权

评论回复
15
tyw| | 2007-2-4 11:06 | 只看该作者

晕死了耶

100只灯,10ms来不及兜母程序就延长到100ms,总够了吧,再不够就提cpu时钟频率.方法就是设公共时标,检查子系统计数到"0"标志,再按排相应动作.

使用特权

评论回复
16
s99060|  楼主 | 2007-2-4 11:19 | 只看该作者

谢谢tyw了,一直在关注这个问题

只是这里不是时间够不够的事情呦,

也不是6楼关于要多少块表的问题!

使用特权

评论回复
17
平常人| | 2007-2-4 11:29 | 只看该作者

设置时钟中断周期为两个灯闪动周期的最大公约数即可

“最大公约数”好像是小学的内容。

使用特权

评论回复
18
mohanwei| | 2007-2-4 14:31 | 只看该作者

呵呵6楼比较幽默

一般没什么狠苛刻的要求,按照tyw说的做就可以了,毕竟LED闪烁周期的误差是不用要求太高的吧?

使用特权

评论回复
19
s99060|  楼主 | 2007-2-4 19:34 | 只看该作者

:(

闪烁只是个比方哦

使用特权

评论回复
20
sd325| | 2007-2-5 13:48 | 只看该作者

使用操作系统了,每个任务控制一个灯。

使用操作系统了,每个任务控制一个灯。

使用特权

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

本版积分规则

40

主题

224

帖子

0

粉丝