在基于Z-stack的应用程序设计中,HAL(硬件抽象层)是这样运行的:
void osalInitTasks( void )
{……
Hal_Init( taskID++ );
……
}
打开 Hal_Init( ),似乎什么也没有做,只是完成了一件事情,给这个任务一个ID,实际上,对硬件的初始化的工作,在任务启动之前都已经开始做了,任务的运行,只是可以接收发给它的事件和消息。
那么,在HAL任务运行之前,系统对任务做了些什么呢?
当然是初始化。在ZMain.c文件中,有main函数,这是所有程序的入口。由于硬件是所有程序运行的基础,在这里要完成两个重要的函数:
// Initialize board I/O
InitBoard( OB_COLD );
// Initialze HAL drivers
HalDriverInit();
显然,它们的执行时间是早于任务的运行,在InitBoard()完成对板级I/O的设置。进去看一下:
void InitBoard( byte level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
}
else // !OB_COLD
{
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
}
}
代码太多,不再全部列出,主要是完成对Led。Timer和key的配置。这里重点看按键有关的。由于InitBoard函数的参数是OB_COLD,郁闷的HalKeyConfig()没有机会运行。
在经过耐心的等待之后,main()需要再次对开发板初始化,调用函数:
InitBoard( OB_READY );
机会来了,这时可以处理按键了,
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback)函数可以运行,在该函数中定义了是以中断的方式还是以查询的方式检测按键的状态,如果是查询方式,使用:
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);
延迟100ms后向任务Hal_TaskID发送一个事件。在事件处理代码中使用函数
HalKeyPoll()查询是否有按键按下。
如果是中断方式,使用
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
延迟25ms后使用函数HalKeyPoll()获取按键值。
更多内容,访问zigbee技术网:www.wsnzigbee.com