《《《《《正文》》》》》
轮询系统==》
就是在死循环里顺序的做各种事情!大概代码如下图1-1;这个适用于只需顺序执行事务且不需要外部事件来驱动事务的系统,比如仅仅实现LED翻转的系统,使用轮询系统来编程会很完美!
图1-1
int main(void)
{
//硬件相关初始化
HardWareInit();
for (;;)
{
// 处理事情 1
Something1();
// 处理事情 2
Something2();
}
}
前后台系统==》
但是上述在轮询系统中翻转LED的例子中,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。假设Something2 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到 Something1,要命的是 Something1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 Something2的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成;大概代码如下图1-2;
图1-2
int flag1 = 0;
int flag2 = 0;
int main(void)
{
//硬件相关初始化
HardWareInit();
for (;;)
{
if (flag1)
{
//处理事情 1
Something1();
}
if (flag2)
{
// 处理事情 2
Something2();
}
}
}
void ISR1(void)
{
/* 置位标志位 */
flag1 = 1;
/* 如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到前台处理 */
Something1();
}
void ISR2(void)
{
/* 置位标志位 */
flag2 = 1;
/* 如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到前台处理 */
Something2();
}
串口实例==》
轮询系统下的串口发送,代码大概如下图:
int main(void)
{
//硬件相关初始化
HardWareInit();
for (;;)
{
//uart发送函数
uart(0x55);//当中有等待发送完成函数
// 处其他事情
Otherthing();
}
}
void uart(uint8 data)
{
LPUARTx->SBUF_f.DATA = data;
//判断发送完成标志,此时系统一直在等待
while(FALSE == LPUart_GetStatus(LPUARTx,LPUartTC)){}
LPUart_ClrStatus(LPUARTx,LPUartTC);
}
前后台系统下的串口发送,代码大概如下图:
uint8 flag =0;
int main(void)
{
//硬件相关初始化
HardWareInit();
for (;;)
{
//uart发送函数
uart(0x55);
if(flag) //没发送完就先做其他的事情
{
//发送成功后的处理
DoSomething();
}
// 处其他事情
Otherthing();
}
}
void uart_ISR(void)
{
//发送完成标志
flag =1;
}
void uart(uint8 data)
{
//发送后,不需在这里等待,发送完成后跳到中断通知函数uart_ISR
LPUARTx->SBUF_f.DATA = data;
}
《《《《《END》》》》》