1、背景
最近接触CC2530芯片,zstack协议栈的OSAL操作系统初看之下,一阵晕。现在先对按键的操作逻辑进行分析。
1.1 参考资料
2、按键初始化、配置、中断触发、消息发送、处理流程
2.1初始化
zmain.c:main()
-->
hal_drivers.c:HalDriverInit()
-->
hal_key.c:HalKeyInit();
2.2 配置
main.c
-->
OnBoard.c:InitBoard( OB_READY ); //配置为按键中断类型以及设置中断回调函数
2.3 中断触发
hal_key.c:HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR ); //中断服务函数
-->中断源里有你想要的按键触发的调用处理函数,记得清除中断标志噢。
hal_key.c:void halProcessKeyInterrupt (void)
-->
OSAL_Timers.c:uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )
-->
OSAL_Timers.c:osalTimerRec_t * osalAddTimer( uint8 task_id, uint16 event_flag, uint16 timeout )
-->调用定时器函数,在HAL_KEY_DEBOUNCE_VALUE即25ms之后发送HAL_KEY_EVENT事件。Hal_TaskID 为2,即硬件层任务号为2,最终这事件会被HAL任务函数Hal_ProcessEvent()所接受并处理。
hal_drivers.c:uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
2.4 消息发送
OnBoard.c:void OnBoard_KeyCallback (uint8 keys, uint8 state);
--> OnBoard_SendKeys(keys, shift)
onBoard.c:uint8 OnBoard_SendKeys( uint8 keys, uint8 state ) //发送有按键被按下的信息到应用层
-->osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr )
2.5 消息接收处理
3、