本帖最后由 拨云人 于 2014-4-16 11:35 编辑
主要问题:大家经常说,中断处理函数不要执行时间太长, 但我现在的工程本身是一个事件触发的系统,主程序只完成了一些初始化功能,然后就进入了睡眠并等待事件的发生(sleep and wait for event), 几乎所有要执行的功能,都是在中断里完成的,甚至在中断里调用了软件延时100ms ( delay_ms(100) ) 这样的函数.
会不会造成一些不良后果呢?
有三个GPIO中断源,一个蓝牙协议栈中断,
系统可简述为3个模块: 采集模块,存储模块(SD卡),BLE蓝牙模块
GPIO中断可分为:
1、 由采集芯片产生, 每4ms 产生一次,在中断处理函数里,我只是做了接收数据(通过SPI),并置了各种标志位.
2、 按键中断, 检测到按键按下之后,需要处理很多事情,例如 SD卡初始化,采集芯片初试化等,这个耗时会比较长.但是正常情况下,正在采集的时候,是把按键功能关闭的。
3、 外部高电平中断,当检测到USB线的插入时,会在某个引脚检测到高电平,这时候我需要给SD卡重新上电,也就是在这里调用了 delay_ms(100),这个中断处理过程也会很长。
中断2,3的处理时间都很长,但是正常情况下,如果正在采集(中断源1使能),那么中断源 2,3,都是处于关闭状态的。只有结束采集之后,才会打开。
在中断1的处理函数中,会根据接收到的数据,以及进入中断的次数,置很多的标志位.然后我的主循环就成了:
while(1)
{
sleep(); //每次从中断回来,都会往下执行一遍
if(xxx_flag==1)
{
xxx_flag= 0;
do_someting;
}; // 检测到某标志位,后..
if(xxx_flag==1)
{
xxx_flag= 0;
do_someting;
}; // 检测到另一个标志位后...
if(xxx_flag==1)
{
xxx_flag= 0;
do_someting;
};// 检测到另一个标志位后...
...
...
...
}
这样的结构,我都不忍直视了.:'(
|