(通信 电子)ZigBee学习资料(2)

2019-04-22 16:48

重要的函数调用。

(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);

pHalKeyProcessFunction这个函数指针指向了哪个函数我们现在依然不清楚?但是为了我们有个清

晰而不间断的思路?我在这里先告诉大家。在这里调用的是

void OnBoard_KeyCallback ( uint8 keys, uint8 state )

这个函数。此函数在“ZMain\\OnBoard .c”文件中可以找到。在这个函数中?又调用了

void OnBoard_KeyCallback ( uint8 keys, uint8 state )

在这个函数中?按键的状态信息被封装到了一个消息结构体中(对于消息?我们稍后再说)。最后有

一个极其重要的函数被调用了。

osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );

与前面的pHalKeyProcessFunction相同?我先直接告诉大家registeredKeysTaskID所指示的任

务正式我们需要响应按键的GenericApp这个任务。

那么也就是说?在这里我们向GenericApp发送了一个附带按键信息的消息。在osal_msg_send函

数中

osal_set_event( destination_task, SYS_EVENT_MSG );

被调用?它在这里的作用是设置destination_task这个任务的事件为SYS_EVENT_MSG。而

这个

destination_task正式由osal_msg_send这个函数通过参数传递而来的?它也指示的是GenericApp

这个任务。在osal_set_event这个函数中?有这样一个语句: {

tasksEvents[task_id] |= event_flag; }

至此?刚才所提到的问题得到了解决。我们再将这个过程整理一遍。

首先?OSAL专门建立了一个任务来对硬件资源进行管理?这个任务的事件处理函数是

Hal_ProcessEvent。在这个函数中通过调用osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT,

100);这个函数使得每隔100毫秒就会执行一次HalKeyPoll()函数。HalKeyPoll()获取当前按键的状态?

并且通过调用OnBoard_KeyCallback函数向GenericApp任务发送一个按键消息?并且设置

tasksEvents中GenericApp所对应的值为非零。如此?当main函数里这样一段代码 {

do

{

if (tasksEvents[idx])

{

break;

}

} while (++idx < tasksCnt); }

执行了以后?GenericApp这个任务就会被挑选出来。然后通过

events = (tasksArr[idx])( idx, events )?

这个函数调用其事件处理函数?完成事件的响应。

cyril3 在GenericApp_ProcessEvent中?通过 {

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_rec 现在?我们回过头来处理我们之前

遗留下来的问题。

第一、pHalKeyProcessFunction这个函数指针为何指向了OnBoard_KeyCallback函数。

在HAL\\Commen\\ hal_drivers.c这个文件中?我们找到了HalDriverInit这个函数?在这个函数

中?按键的初始化函数HalKeyInit被调用。在HalKeyInit中有这样的语句: {

pHalKeyProcessFunction = NULL; }

这说明在初始化以后pHalKeyProcessFunction并没有指向任何一个函数。那

pHalKeyProcessFunction是什么时候被赋值的呢?

就在HalKeyInit的下方有一个这样的函数HalKeyConfig。其中有这样一条语句:

pHalKeyProcessFunction = cback?

cback是HalKeyConfig所传进来的参数?所以?想要知道它所指向的函数?必须找到其调用的地方。

经过简单的搜索我们不难找出答案。在main函数中有这样一个函数调用:InitBoard( OB_READY );此

函数中做了如下调用:

{

HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); }

第二、registeredKeysTaskID为什么标识了GenericApp这个任务?

由于OSAL是一个支持多任务的调度机制?所以在同一时间内将会有多个任务同时运行。但是从逻辑

上来讲?一个事件只能由一个任务来处理。按键事件也不例外。

那么如何向OSAL声明处理按键事件的任务是GenericApp呢? 在GenericApp_Init(GenericApp的任务初始化函数)中有这么一个语句: {

RegisterForKeys( GenericApp_TaskID ); }

RegisterForKeys函数向OSAL声明按键事件将由GenericApp任务来处理。在RegisterForKeys

函数中:

{

registeredKeysTaskID = task_id; }

我想我不用再做多余的解释了?聪明的您肯定可以理解。

五、消息队列

首先我需要想大家解释清楚消息与事件的联系。事件是驱动任务去执行某些操作的条件?当系统产生

了一个事件?将这个传递给相应的任务后?任务才能执行一个相应的操作。但是某些事件在它发生的同时?

又伴随着一些附加信息的产生。任务的事件处理函数在处理这个事件的时候?还需要参考其附加信息。最

典型的一类便是按键消息?它同时产生了一个哪个按键被按下了附加信息。所以在OnBoard_SendKeys

这个函数中?不仅向GenericApp发送了事件?还通过调用osal_msg_send函数向GenericApp发送

了一个消息?这个消息记录了这个事件的附加信息。eive( GenericApp_TaskID ); }

获取了这样一个消息?然后再进一步处理。


(通信 电子)ZigBee学习资料(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:教学常规自查报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: