|
有时候用AVR,51系列等单片机在无操作系统的情况下编程会遇到这种情况,伪代码如下:
void main()
{
主循环:
while(1)
{
//耗时较大的函数
BigWork();
//按键处理
Button();
//显示结果
Display();
}
由于有耗时较大的函数存在,所以在BigWork里面的时间太长以致影响了Button()的实时性,因为有时按键引脚的电平变化都已经结束,但还在BigWork里面没出来,Button()无法扫描到电平变化
现在只知道使用中断来打断BigWork
但中断引脚很有限,但按键却很多,例如最简单的电子闹钟也起码有3、4个按键
所以只能每个按键引线到同一个中断引脚,再分别引线到不同的IO端口,进入中断服务后再用扫描法看看哪个按下了。
伪代码如下:
//任何按键按下都会引发该中断
interrupt0_service()
{
//马上记录下此时连接按键的端口的状态
PORT_State=PORT;
//判断哪个按键按下并处理相应事宜
ScanButton(PORT_State);
}
//该中断负责显示
interrupt1_service
{
Display();
}
void mian()
{
//初始化中断的伪代码就省略了
while(1)
{
BigWork();
}
}
看上去好像没什么问题,但假设ScanButton的耗时也很大,中断0的服务就会很久都不能结束,除了堵住了优先级低于中断0的其他中断之外,还有没有什么潜在隐患呢?
|
|