楼主: outman

[原创]奥特曼Zigbee读书日记(二)--OSAL系统框架专题

[复制链接]
沧浪之水 发表于 2010-11-22 12:26:09 | 显示全部楼层
回复 40# yuzhiwu1

HalTimerConfig (OSAL_TIMER,                        // 8bit timer2
                  HAL_TIMER_MODE_CTC,                 // Clear Timer on Compare
                  HAL_TIMER_CHANNEL_SINGLE,           // Channel 1 - default
                  HAL_TIMER_CH_MODE_OUTPUT_COMPARE,   // Output Compare mode
                  OnboardTimerIntEnable,              // Use interrupt
                  Onboard_TimerCallBack);             // Channel Mode

——》
uint8 HalTimerConfig (uint8 timerId, uint8 opMode, uint8 channel, uint8 channelMode,
                      bool intEnable, halTimerCBack_t cBack)
{
  uint8 hwtimerid;

  hwtimerid = halTimerRemap (timerId);

  if ((opMode & HAL_TIMER_MODE_MASK) && (timerId < HAL_TIMER_MAX) &&
      (channelMode & HAL_TIMER_CHANNEL_MASK) && (channel & HAL_TIMER_CHANNEL_MASK))
  {
    halTimerRecord[hwtimerid].configured    = TRUE;
    halTimerRecord[hwtimerid].opMode        = opMode;
    halTimerRecord[hwtimerid].channel       = channel;
    halTimerRecord[hwtimerid].channelMode   = channelMode;
    halTimerRecord[hwtimerid].intEnable     = intEnable;
    halTimerRecord[hwtimerid].callBackFunc  = cBack;  }
  else
  {
    return HAL_TIMER_PARAMS_ERROR;
  }
  return HAL_TIMER_OK;
}

    见红色部分
wjw111lu 发表于 2010-11-23 20:37:15 | 显示全部楼层
很清楚,尤其是time4的问题,学习了~~~
沧浪之水 发表于 2010-11-25 17:05:46 | 显示全部楼层
回复 20# ssls18years


    "关于Key检测的第一次是怎么启动的,奥版说的没错,是系统初始化时启动的。说细致了其实就是在Key的组态函数中有调用osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100),"
请问一下,Key的组态函数具体指的是哪个函数,在那个文件下面啊?
谢谢!
沧浪之水 发表于 2010-11-25 17:28:42 | 显示全部楼层
1、系统时钟第一次是那里开启的?
2、按键检查第一次是怎么启动的?
希望能再代码中具体指一下,俺将万分感谢。
 楼主| outman 发表于 2010-11-25 22:22:34 | 显示全部楼层
手上现在没有代码,所以具体的位置没法告诉你。第一次的启动基本上都是在本层的init函数里可以找得到,应该不难,试着用source insight搜一下。
沧浪之水 发表于 2010-11-26 11:05:36 | 显示全部楼层
本帖最后由 沧浪之水 于 2010-11-26 11:29 编辑

回复 45# outman


    在void InitBoard( byte level )
{
·······
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;
    HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); //按键检测非中断方式
}

void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback){
·····
  if (Hal_KeyIntEnable)
  {
·····
    }
  else    /* Interrupts NOT enabled */  {······
    osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);    /* Kick off polling */  
}

由此得知,系统在初始化函数——》InitBoard——》HALkeycongfig——》如果非中断方式执行osal_start_timerEx ——》按键检测软件定时加入链表——》开启系统时钟
按键检查的时钟应该是在这里开启的,不确定的是,系统时钟的第一次开启是不是也是在这里开启的。还请outman能帮忙分析一下。
沧浪之水 发表于 2010-11-26 11:59:52 | 显示全部楼层
刚刚又看了ssls18years的《我心目中的Zstack OSAL & Message》中讲到,系统时钟第一次开启应该是在
nwk_init( taskID++ );中开启的,因不开源,也无从验证。
ankjoy 发表于 2010-12-7 00:06:03 | 显示全部楼层
辛苦了,能够感受到很多诚意,所以也很认真学习了一下。
不过我发现ZStack-CC2530-2.3.0-1.4.0版本中,osal_timer_activate这些函数都不见了。
/*********************************************************************
* @fn      osalTimerInit
*
* @brief   Initialization for the OSAL Timer System.
*
* @param   none
*
* @return
*/
void osalTimerInit( void )
{
  osal_systemClock = 0;
}
不知道outman是否有研究过。
期待outman的解答!!
 楼主| outman 发表于 2010-12-7 10:53:55 | 显示全部楼层
以前的笔记是在zstack 1.4.3的基础上写的,现在用的zstack 2.3.0在省电模式下的定时器调整这里有些区别。回头有空我专门就这部分写一下。

提示一点,zstack 1.4.3中osal_timer_activate这个函数是来开启系统定时器的。但不要顺着“zstack 2.3.0如何开启系统定时器”这个思路找,而是看下“zstack 1.4.3为什么要关掉系统定时器”。其实根本原因是因为省电模式下的系统主频不同,导致定时器时间有差异。具体可以读下zstack 1.4.3 osal_retune_timers函数和zstack 2.3.0的osal_adjust_timers函数。

另外,建议初学者在开始的时候可以把省电模式这部分先放一放。
ok258200 发表于 2010-12-31 21:02:36 | 显示全部楼层
大哥做一个项目怎么来做啊,具体步骤哦,感觉还是不懂。怎么来做自己的应用,具体一步一步的。谢谢哦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表