发新帖我要提问
12
返回列表
打印

[讨论]关于单片机如何在处理多个中断保持实时性

[复制链接]
楼主: yxdengos
手机看帖
扫描二维码
随时随地手机跟帖
21
aceice| | 2008-12-17 11:52 | 只看该作者 回帖奖励 |倒序浏览

其实好的OS,不光是调度的问题

文件系统,网络支持,API都是重要的参数.......
OS的提出,无非就是为了方便写应用程式和设备管理而已。

使用特权

评论回复
22
yxdengos|  楼主 | 2008-12-18 12:23 | 只看该作者

ls

我认为所谓你所说可能丢失掉低优先级的情况 

两次低优先级中断的间隔中(譬如说是5ms) 5ms内如果没有处理完高优先级的ISR以及低优先级的ISR 那么可能会丢失这个中断的响应

原因有两点
1. 高优先级ISR在响应过程中 低优先级的中断不会被响应 标志位就一直有效着 如果第二个低优先级来临时 第一个低优先级还没有响应 那么丢失了一个
2. 即使我们在5ms中响应了这个低优先级中断 此时又来临了第二个低优先级中断 此时在ISR中我们会关闭此中断(我认为ISR应该不支持可重入) 那么这个第二个中断就得不到响应

因此 合理安排好ISR的长度 和时间 就可以满足性能 

使用特权

评论回复
23
牧狼者| | 2008-12-19 08:22 | 只看该作者

5ms的中断足够做很多事了

   进入中断设标志位快速退出,main程序里每5ms轮询一次要处理的工作,没事就呆在轮询的入口。这样设计的程序诸如:
    void delay(unsigned int cnt)
    {
      for(;cnt; cnt--) ;
     }
之类的延时就想都不要想了!我做过类似的设计,处理速度确实很快。

使用特权

评论回复
24
yxdengos|  楼主 | 2008-12-19 23:18 | 只看该作者

自己的见解

如果ISR简单地做标志位的话 速度很快 自然不会丢失中断 即可以保证在两次低中断来临中 完成对其中断标志位的操作

但是会造成主程序中的if、case语句很多 如果存在某个程序运行时间的不可确定性 那么任务响应的实时性将无法保证

如果使用一个定时器中断 譬如1ms进行一次中断 对相应的标志位进行处理 然后分配中断标志的处理程序(任务) 即可以保证一定的实时性 即用中断来驱动任务 但是增加了一个中断 势必带来其他的问题 譬如tick的时间 不知道用中断来驱动的思路有什么问题没有?
请ls的各位大牛回答
谢谢!

使用特权

评论回复
25
dengm| | 2008-12-20 18:11 | 只看该作者

中断级别是可以扩展的:

         ORG 0000
           NOP
L_RESET:   AJMP START 
         ORG 0003   ; EX INT 0 ; 
           JBC EX0, SUB_INT0 ; 关中断
L_RETI:       RETI

       ;;;;;;;;;;
       ;;;;;;;;;;
;_________________________
SUB_INT0:
    ACALL L_RETI   ;---- reset int. system, 其他中断可运行!!!!! 
    push psw
    mov psw, #00001100b ; select reg bank 3
    XCH A, R2           ; BACKUP ACC
   ;;;;;;;
   ;;;;;;;;;
    XCH A, R2           ; RESTORE ACC
    pop psw

   ;-----------------------------
    setb ex0            ; 开中断, 下一ret语句不会被任何中断打断,
                        ; 可把 setb ex0 与 ret 看成 3 字节 3 周期指令! 
    ret                 ; return to main.
;========================

START:
    ; INI
    ;;;;;
    ;;;;;
MAIN_LOOP:
      ;;;;;
      ;;;;;
      SJMP MAIN_LOOP

使用特权

评论回复
26
cnchip| | 2008-12-20 18:54 | 只看该作者

我觉得多核简直就是自找麻烦!

有双核就会有四核、八核。。。
无故增加了复杂性!
何况是MCU呢,搞什么多核!

使用特权

评论回复
27
暮然| | 2008-12-20 22:04 | 只看该作者

裸奔好!

别指望os能更实时,裸奔快的多了。
定时器产生时间片,普通中断,仅做标志位,主循环中时间片查询操作;实时中断长话短说。实时中断可将优先级调高,避免流产。

使用特权

评论回复
28
暮然| | 2008-12-20 22:27 | 只看该作者

做过才知道

顾虑这么多,做过才知道。
以前做的一套设备,测量转速,3600r/min,60个齿,合计3600hz,3.6k的频率
277us一次中断,测得的转速十分准确,平稳,滤波过后仅有正负2r/min的跳动(发动机平稳状态转速),也没见出问题。
设备还有ps2接口(必须采用中断),2个串口(接收中断),ad采集,定时器(中断)。其间还要刷液晶。
现在设备也没问题,19楼所顾虑的,不一定就是真的,做了才知道,何不多尝试?

使用特权

评论回复
29
块块| | 2008-12-21 08:53 | 只看该作者

加缓冲,设置下半部分处理

其1:一旦进入串口和SPI中断之后,
    如果是发送,发完就走
    如果是接收,收完放到缓冲区就走(在main中执行下半部分)
其2:串口和SPI中断实时性并不是很强,至少可以延时8bit之后处理,
其3:你的51至少有1MIPS吧,
    5ms至少可以运行3K(考虑双周期指令),
    你一个中断,写成几百条就已经很大了

所以你把5ms的中断优先级设为最高。其它两个平级就可以了。

使用特权

评论回复
30
yxdengos|  楼主 | 2008-12-22 08:42 | 只看该作者

谢谢大家评论

将时间片的优先级别设为低 是想不打扰某些中断正在处理的过程

如果在主程序中空闲着 仅仅靠1ms、5ms的时间片来查询各个标志位 似乎对于main中的while(1) 太浪费效率了

综合起来 我认为可以将其他外部事件触发的中断设为高 根据MCU的主频 查询各个标志位 使得PC指向程序入口 而主程序的while做着各个事件的后台工作 如果你要编码或者…… 我可以让while中不停地编着(设标志位) 不浪费MCU宝贵的资源

请问23楼 你的意思是说用时间片来查询各个标志位处理速度等性能很好?而且你是在主程序中进行延时tick 并不是用定时器中断?

thx

使用特权

评论回复
31
liuwenbin1984| | 2008-12-23 14:51 | 只看该作者

用RTX51

用RTX51 keil自带的实时操作系统,支持多任务切换

使用特权

评论回复
32
yxdengos|  楼主 | 2008-12-30 10:49 | 只看该作者

使用特权

评论回复
33
hero787| | 2009-7-22 08:31 | 只看该作者

分时

使用特权

评论回复
34
tianqi911| | 2018-8-9 10:00 | 只看该作者

使用特权

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

本版积分规则