Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1133818
  • 博文数量: 141
  • 博客积分: 2853
  • 博客等级: 少校
  • 技术积分: 2266
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-04 12:03
文章分类

全部博文(141)

文章存档

2014年(3)

2013年(12)

2012年(126)

分类: 嵌入式

2012-10-24 18:57:08

针对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) |
0

上一篇:单片机调试之GND

下一篇:cgi网关程序

给主人留下些什么吧!~~