从大家给我的QQ留言中,看到有些初学者看不懂这个程序框架。下面我想详细讲解一下:
该程序框架的核心程序在OSAL_App.h文件中。请打开该文件参考我下面的讲解阅读程序。
其中,有一个void osal_heartbeat(void)函数,该函数的功能是启动T2定时器,并每10毫秒产生一次定时中断。这是程序框架的心跳,一般在主程序初始化完成之后立即执行该程序,使程序的心脏每10毫秒跳动一次。
SIGNAL(SIG_OUTPUT_COMPARE2)是T2中断的处理程序,即每10毫秒自动执行一次该处理程序。该中断程序首先检查UART0和UART1是否收到一个完整的报文,然后查看是否有新的按键按下,再然后查询是否有延迟事件要启动。
至于检查UART0和UART1是否收到一个完整的报文的机理在后续UART0和UART1驱动中讲解;查看是否有新按键按下的机理在后续按键驱动中讲解。我们首先看中断程序是如何处理事件的。
在OSAL_App.h的全局变量定义中,定义了一个16位的事件寄存器events。我们让events的每一位代表一个事件,各位均为0时,说明无事件发生;某位为1时,说明有对应的事件发生。这样events就可以标记16种事件,这对于一般的单片机应用程序足够了。
具体事件的定义在App.h文件中:
#define OCCURRED_1_EVT 0x0001
#define OCCURRED_2_EVT 0x0002
#define OCCURRED_3_EVT 0x0004
#define OCCURRED_4_EVT 0x0008
#define OCCURRED_5_EVT 0x0010
#define OCCURRED_6_EVT 0x0020
#define OCCURRED_7_EVT 0x0040
#define OCCURRED_8_EVT 0x0080
#define OCCURRED_9_EVT 0x0100
#define OCCURRED_10_EVT 0x0200
#define OCCURRED_11_EVT 0x0400
#define OCCURRED_12_EVT 0x0800
#define OCCURRED_13_EVT 0x1000
#define OCCURRED_14_EVT 0x2000
#define OCCURRED_15_EVT 0x4000
#define KEY_CHANGE_EVT 0x8000
事件名称由编程者根据实际应用改写成有意义的字符,例如最后一个事件KEY_CHANGE_EVT,一看就知道是按键发生变化事件。这样我们就可以任意设置一个事件,或者清空一个事件了。
OSAL_App.h文件中,有一个立即设置事件的函数:
void osal_set_event( unsigned int event)
{
events |= event;
}
其实,这个函数只有events |= event这一句程序。比如我们设置1#事件置位,只要执行
osal_set_event( OCCURRED_1_EVT);就可以了。