针对zigbee2007这个程序
1、zigbee类似一个操作系统
2、main()函数前面主要做一些初始化
3、osal_init_system()对任务进行初始化包括用户任务,切记一一对应
4、继续走到了InitBoard( OB_READY );这个函数的关键的地方就是调用了HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback)函数,更重要的是它调用了osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE)函数,osal_start_timerEx函数通过调用osalAddTimer函数建立了一张各个任务的定时表,第一个加入表的便是Hal_TaskID任务,也就是管理硬件的任务,程序运行起来后,每隔100ms运行一次,暂时只知道他的一个功能、就是检测按键,通过HalKeyPoll()函数,且每次检测一次后有在定时表里面加入Hal_TaskID任务100ms运行,因为定时到后节点会被销毁,所以需要重新加入。按键检测室通过AD检测的,当用按键按下时会调用(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL)回调函数及OnBoard_KeyCallback。然后调用OnBoard_SendKeys函数再然后调用osal_msg_send函数发送消息,最最重要的的是因为他调用了osal_set_event,而最最要命的是tasksEvents[task_id] |= event_flag; 这句他将taskEvents赋值了,一个标志对应任务是否应该运行
/////////////////////////////////////////////////////////////////////////////
uint8 osal_set_event( uint8 task_id, uint16 event_flag )
{
if ( task_id < tasksCnt )
{
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts
tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)
HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts
}
else
return ( INVALID_TASK );
return ( SUCCESS );
}
//////////////////////////////////////////////////////////////////
因为osal_set_event影响了osal_start_system函数的执行,
还有一个重要的函数就是osalTimeUpdate();函数,他使得定时表中的倒计时能够持续更新通过调用osalTimerUpdate( elapsedMSec );函数,一到点者通过osal_set_event( freeTimer->task_id, freeTimer->event_flag );函数将对应任务置位。
void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop
#endif
{
uint8 idx = 0;
osalTimeUpdate();
Hal_ProcessPoll(); // This replaces MT_SerialPoll() and osal_check_timer().
do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = 0; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);
events = (tasksArr[idx])( idx, events );
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif
}
}
阅读(2215) | 评论(0) | 转发(1) |