OSALA主循环流程

上传人:油条 文档编号:11041626 上传时间:2017-10-11 格式:DOC 页数:8 大小:73.50KB
返回 下载 相关 举报
OSALA主循环流程_第1页
第1页 / 共8页
OSALA主循环流程_第2页
第2页 / 共8页
OSALA主循环流程_第3页
第3页 / 共8页
OSALA主循环流程_第4页
第4页 / 共8页
OSALA主循环流程_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《OSALA主循环流程》由会员分享,可在线阅读,更多相关《OSALA主循环流程(8页珍藏版)》请在金锄头文库上搜索。

1、OSAL 主循环流程 接上篇 OSAL 初始化流程.记录下个人对 OSAL 主循环流程的学习:/-/-OSAL 系统主循环函数:void osal_start_system( void )#if !defined ( ZBIT ) /不知道是什么 东西for(;) / Forever Loop#endifuint8 idx = 0;Hal_ProcessPoll(); / This replaces MT_SerialPoll() and osal_check_timer()./轮询 TIMER 与 UART/-/执行循环语句:tasksEventsidx是一个指针变量,指向存放任务 idx

2、的存储空间,初始化时由/osal_memset()设为 0,只要不为空类型 NULL,/即有相对应任务事件发生,就 break 跳出循环体,通过下面的程序进行任务事件处理。/如果为空,执行判断语句,即 idx 自增,再返回轮询有无各层的任务事件发生。如果/执行完循环语句都没有检测到有事件发生,idx=7,进入睡眠。(对于本例子来说,任务数组里只有七个任务,tasksEvents0tasksEvents6,tasksEvents6就是用户自已添加的任务,idx 随着用户添加任务的增多而增大)do if (tasksEventsidx) / Task is highest priority tha

3、t is ready. break; while (+idx hdr.event ) /系统消息的进一步判断/ Received when a key is pressed /*小事件:按键事件*/ 如果一个 OSAL 任务已经被登记注册,那么任何键盘事件都将接受一个 KEY_CHANGE 事件信息。case KEY_CHANGE: /#define KEY_CHANGE 0xC0 -Key EventsSampleApp_HandleKeys( (keyChange_t *)MSGpkt)-state, (keyChange_t *)MSGpkt)-keys );break; /执行具体的按

4、键处理函数,定义在 sampleAPP.c 中/ Received when a messages is received (OTA:over the air) for this endpoint /*小事件:接收数据事件*/ 接收数据事件,调用函数 AF_DataRequest()接收数据case AF_INCOMING_MSG_CMD: / #define AF_INCOMING_MSG_CMD 0x 1A -Incoming MSG type messageSampleApp_MessageMSGCB( MSGpkt ); /调用回调函数对收到的数据进行处理break;/ Receive

5、d whenever the device changes state in the network/*小事件:设备网络状态变化事件*/ 只要网络状态发生改变,就通过 ZDO_STATE_CHANGE 事件通知所有的任务,注意,是所有任务都会收到这消息。case ZDO_STATE_CHANGE: /#define ZDO_STATE_CHANGE 0xD1 -ZDO has changed the devices network stateSampleApp_NwkState = (devStates_t)(MSGpkt-hdr.status); /获取设备当前状态if ( (SampleA

6、pp_NwkState = DEV_ZB_COORD)| (SampleApp_NwkState = DEV_ROUTER)| (SampleApp_NwkState = DEV_END_DEVICE) ) / Start sending the periodic message in a regular interval./*按一定间隔启动定时器*/这个定时器是为发送周期信息设置的,我觉得因为在这个例子中,用户自己添加的任务,只有两个事件是用于向外发送消息的,一个是发送 flash 闪烁消息,属于组寻址,而另一个是发送 periodic 周期消息,属于广播;这里是一个设备的网络状态发生了变化

7、,必须要告诉同一网络中的其它设备,因此要进行广播通知其它设备发送的消息中应该会包括本设备的类型。 不知道这样理解对不对管它的,以后会明白的/更新:这个定时器只是为发送周期信息开启的,设备启动初始化后从这里开始触发第一个周期信息的发送,然后周而复始下去.osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );else/ Device is no longer in the networkbreak; default:break;/ Rele

8、ase the memory/以上把收到系统消息这个大事件处理完了,释放消息占用的内存osal_msg_deallocate( (uint8 *)MSGpkt );/ Next - if one is available/*指针指向下一个 已接收到的”程序在 while ( MSGpkt )内放在缓冲区的待处理的事件,与/ SampleApp_ProcessEvent 处理多个事件相对应,返回 while ( MSGpkt )重新处理事件,/直到缓冲区没有等待处理事件为止。*/MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleA

9、pp_TaskID );/ return unprocessed events/ 判断是否有未处理的系统消息(有大事件没处理完),有则接收返回,注意!这里 return 到osal_start_system()下的 events = (tasksArridx)( idx, events )语句中,重新在 osal_start_system()下轮询再进入此函数进行处理。return (events SYS_EVENT_MSG); /-/ Send a message out - This event is generated by a timer/* 如果大事件是向外发送信息,该事件由定时器产

10、生*/ (setup in SampleApp_Init().if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) /发送周期消息事件/ Send the periodic messageSampleApp_SendPeriodicMessage();/ Setup to send message again in normal period (+ a little jitter) /这里为任务 SampleApp_TaskID 的事件 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 设定一个定时器,定时时间为 (SAMPLEAPP_S

11、END_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF),当时间一到,该运行的任务将被通报有事件发生。osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF) ); / return unprocessed events/ 判断是否有未处理的周期消息(有大事件没处理完),有则返回,同样是返回到 osal_start_system()下的events

12、= (tasksArridx)( idx, events )语句中。return (events SAMPLEAPP_SEND_PERIODIC_MSG_EVT);/ Discard unknown events 丢弃未知事件( 为什么没有发送 flash 消息的事件!?今天发现发送 flash消息事件是包含在按键事件里面的soga)return 0;/-/-4、 tasksEventsidx |= events;意思是好理解的,返回未处理的事件到任务 idx 中。但从语法上面来分析, tasksEventsidx 已被清 0,我实在不知道是存储空间地址上面的或,还是内容上面的或不钻了,以后再看看

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号