楼主: outman

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

[复制链接]
 楼主| outman 发表于 2010-7-29 13:45:10 | 显示全部楼层
楼上代码看得比较细,受教了
L.fish 发表于 2010-7-29 17:06:00 | 显示全部楼层
有一个问题不是很明白,再次请教一下outman
"Hal_ProcessEvent负责对按键进行持续扫描,发现有按键事件后OnBoard_KeyCallback函数向应用层"
HalKeyPoll中的回调函数是通过怎样的方式和OnBoard_KeyCallback联系起来的
这里不是狠明白....
 楼主| outman 发表于 2010-7-29 20:07:57 | 显示全部楼层
按你的思路,从HalKeyPoll函数顺着找:
先看HalKeyPoll函数最后:

  /* Invoke Callback if new keys were depressed */
  if (keys && (pHalKeyProcessFunction))
  {
    (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  }

这里调用了发生按键后的回调函数,顺着这个pHalKeyProcessFunction找过去,HalKeyConfig对其进行定义,定义成什么了呢?继续搜,OnBoard.c中的InitBoard函数进行了具体定义:

    HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);

这样不就和OnBoard_KeyCallback函数联系起来了吗?
L.fish 发表于 2010-7-30 09:11:26 | 显示全部楼层
谢谢,一直都为了回调函数头疼在,再去仔细研究下!
ssls18years 发表于 2010-8-17 06:52:07 | 显示全部楼层
在消息的空间分配函数byte * osal_msg_allocate( uint16 len )
中藏着一个大秘密....

答疑解惑有个消息专题由详解
ssls18years 发表于 2010-8-17 11:44:59 | 显示全部楼层
另外我补充os循环中的节电模式:

细心的同学会发现在死循环体的后面有调用osal_pwrmgr_powerconserve()这样一条语句。从名字及注释来看,属于节电模式的调用。此处不详细列举代码,只讲其工作原理。
上面章节讲到1ms心跳来临时去轮询各事件Timer是否需要处理。这里心跳很快(1ms),各事件的Timeout很慢(往往成百上千)。譬如Key检测的Timer事件的Timeout是100,意思是说100ms才去检测一次是否有Key按下。假如说Key检测的Timout在各Timer事件中Timeout最小,那么也就是说有99次心跳都不会有事件需要处理,但是死循环依然在跑,在做无用功,为了解决这个问题,就加入了节电模式。
在osal_pwrmgr_powerconserve()这个函数中会检测Timer时间链表中Timeout最小的值,假设为next, 然后设定CPU进入休眠模式next个毫秒。休眠时间到了苏醒过来立即就会有Timer事件需要处理,这样就可以达到省电的目的。
ssls18years 发表于 2010-8-17 11:46:46 | 显示全部楼层
当然休眠next个毫秒后如何苏醒过来我还没做研究,似乎是WatchDog看门狗什么的东东在捣鬼吧。:)
ssls18years 发表于 2010-8-17 11:50:00 | 显示全部楼层
另外这个节电函数中有关闭和回覆led状态的动作,所以在simple组网例程中会有发现led在拼命的闪烁,其实就是这个节电函数在作怪:进入节电就关灯,退出节电就回覆亮灯。
 楼主| outman 发表于 2010-8-17 12:17:44 | 显示全部楼层
ssls18years,多谢分享,受教了~
ssls18years 发表于 2010-8-17 12:36:39 | 显示全部楼层
我真是个忘性很大的人,再补充一点:

使用节电模式时,debug设置断点等等去跟踪会有异常,譬如设定休眠100ms后苏醒,但是因为你设置了断点,这个内部休眠的timer早都过了100ms,会导致一些异常发生,这点是我猜想的原因,此处声明不负责任。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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