楼主: outman

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

[复制链接]
dxf520 发表于 2010-10-11 09:13:08 | 显示全部楼层
太复杂了
难懂啊
li469173166 发表于 2010-11-1 22:05:38 | 显示全部楼层
请问“#define XREG(addr)       ((unsigned char volatile __xdata *) 0)[addr]”中 ((unsigned char volatile __xdata *) 0)[addr]  是怎么理解啊? 谢谢!!
xj178926426 发表于 2010-11-15 22:19:14 | 显示全部楼层
额 超人大哥 呵呵 !
看啦你的博客我有两个疑问,向你请教哈,谢谢超人大哥指点!
void osalTimerInit( void )
{
  // Initialize the rollover modulo
  tmr_count = TICK_TIME;
  tmr_decr_time = TIMER_DECR_TIME;

  // Initialize the system timer
  osal_timer_activate( false );
  timerActive = false;

  osal_systemClock = 0;
}
我首先看的这个函数,然后又找下去,看到这个函数:
void osal_timer_activate( byte turn_on )
{
  osal_timer_hw_setup( turn_on );
  timerActive = turn_on;
}
额,还是没有到头又跳到这个函数啦:
void osal_timer_hw_setup( byte turn_on )
{
  if (turn_on)
  {
    HalTimerStart (OSAL_TIMER, tmr_count );
  }
  else
  {
    HalTimerStop (OSAL_TIMER);
  }
}
由于上面的第一个函数的调用是osal_timer_activate( false );
就是说参数是false ,最后就执行啦 HalTimerStop (OSAL_TIMER);
这句话, 但是当我看这个函数的时候,这个函数表示停止计时工作???
额?有点莫不着头脑啦 呵呵!!! 希望指点哈 !!!
xj178926426 发表于 2010-11-15 22:49:13 | 显示全部楼层
额 上面那个问题我知道啦 呵呵 是在 osal_start_timerEx这个函数里开始计时的
但是还是有点疑问就是还是觉得是timer2作为系统计时的 ??? 望指点哈 呵呵 !
先谢谢超人大哥???
 楼主| outman 发表于 2010-11-15 23:21:48 | 显示全部楼层
顺着你说的这个osal_start_timerEx函数开始说,因为这个是设置定时器开始的函数,一层层往下找,osal_timer_activate==》osal_timer_hw_setup,这个函数里有句:
  1.     HalTimerStart (OSAL_TIMER, tmr_count );
复制代码
其中:
  1. #define OSAL_TIMER  HAL_TIMER_2
复制代码
是不是这里让你觉得系统定时器是用的timer2呢?

再往下看:
  1. uint8 HalTimerStart (uint8 timerId, uint32 timePerTick)
  2. {
  3.   uint8 hwtimerid;

  4.   hwtimerid = halTimerRemap (timerId);

  5.   if (halTimerRecord[hwtimerid].configured)
  6.   {
  7.     halTimerSetCount (hwtimerid, timePerTick);
  8.     halTimerSetPrescale (hwtimerid, halTimerRecord[hwtimerid].prescale);
  9.     halTimerSetOpMode (hwtimerid, halTimerRecord[hwtimerid].opMode);
  10.     halTimerSetChannelMode (hwtimerid, halTimerRecord[hwtimerid].channelMode);
复制代码
这里实际操作的timer做了个"remap", 其对应关系:
  1. uint8 halTimerRemap (uint8 timerId)
  2. {
  3.   switch (timerId)
  4.   {
  5.     case HAL_TIMER_0:
  6.       return HW_TIMER_3;
  7.     case HAL_TIMER_2:
  8.       return HW_TIMER_4;
  9.     case HAL_TIMER_3:
  10.       return HW_TIMER_1;
  11.     default:
  12.       return HW_TIMER_INVALID;
  13.   }
  14. }
复制代码
以HalTimerStart 函数里的
halTimerSetCount (hwtimerid, timePerTick);//设置定时器计数值
这句作为例子

这里的hwtimerid = halTimerRemap (timerId);而timerId= OSAL_TIMER = HAL_TIMER_2
这样的话,从上面的代码
  1.     case HAL_TIMER_2:
  2.       return HW_TIMER_4;
复制代码
不就能看出hwtimerid 实际上的值为HW_TIMER_4,那不就说明系统定时器实际上是在操作timer4吗?
xj178926426 发表于 2010-11-16 10:11:28 | 显示全部楼层
呵呵 果然是超人啊  恩 学习啦 看来来要好好看看 这个代码 呵呵 谢啦哈 超人大哥
沧浪之水 发表于 2010-11-20 12:19:47 | 显示全部楼层
告示
后辈再学习楼主这篇佳作时,请注意使用的zstack-1.4.3-1.2.1(2430),因为相关代码函数在07协议栈找不到。洒家为此走了不少弯路。
 楼主| outman 发表于 2010-11-20 19:23:29 | 显示全部楼层
楼上提醒的是,这篇教程写得时间比较早,那个时候全部的实验都是在2430上做的。现在新的教程全部转到2530上了,函数还是多少有些区别的,但基本原理还是一样的,请大家看的时候注意
yuzhiwu1 发表于 2010-11-21 10:52:43 | 显示全部楼层
我想问一下
if (!halTimerRecord[HW_TIMER_1].intEnable)
  {
    halProcessTimer1 ();
  }
这是什么意思啊
yuzhiwu1 发表于 2010-11-21 11:16:39 | 显示全部楼层
楼主这是怎么看到的“我们看到timer4的callBackFunc函数是Onboard_TimerCallBack,最终指向osalTimerUpdate,”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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