欢迎来到天天文库
浏览记录
ID:41153047
大小:443.71 KB
页数:60页
时间:2019-08-17
《OSAL在Zigbee的应用详解【入门级】》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第一部分OSAL主循环流程我使用的协议栈版本及例子信息:ZigBee2006TexasInstrumentsZStack-1.4.3-1.2.1ProjectszstackSamplesSampleApp接上篇OSAL初始化流程.记录下个人对OSAL主循环流程的学习:OSAL系统主循环函数:voidosal_start_system(void){#if!defined(ZBIT)//不知道是什么东西for(;;)//ForeverLoop#endif{uint8idx=0;Hal_ProcessPoll();//ThisreplacesMT_SerialPoll()a
2、ndosal_check_timer().//轮询TIMER与UART//执行循环语句:tasksEvents[idx]是一个指针变量,指向存放任务idx的存储空间,初始化时由//osal_memset()设为0,只要不为空类型NULL,//即有相对应任务事件发生,就break跳出循环体,通过下面的程序进行任务事件处理。//如果为空,执行判断语句,即idx自增,再返回轮询有无各层的任务事件发生。如果//执行完循环语句都没有检测到有事件发生,idx=7,进入睡眠。(对于本例子来说,任务数组里只有七个任务,tasksEvents[0]~tasksEvents[6],tasksEven
3、ts[6]就是用户自已添加的任务,idx随着用户添加任务的增多而增大)do{if(tasksEvents[idx])//Taskishighestprioritythatisready.{break;}}while(++idx4、s[idx];//uint16events;对应有事件发生的任务的数组tasksEvents[idx]=0;//CleartheEventsforthistask.NULLHAL_EXIT_CRITICAL_SECTION(intState);//跳出中断临界状态:恢复先前中断状态events=(tasksArr[idx])(idx,events);//调用相对应的任务事件处理函数处理,各类事件处理函//数M(task_id,event)返回的都是这个任务未被处理的事件HAL_ENTER_CRITICAL_SECTION(intState);tasksEvents[idx]5、=e6、vents;//Addbackunprocessedeventstothecurrenttask.//把刚才返回未处理的任务事件添加加当前任务中再进行处理//(跳出此if(idx7、stemintosleep}#endif}}说明:(1)OSAL调用Hal_ProcessPoll();来轮询UART与TIMER,涉及HAL层,晚点总结.(2)HAL_ENTER_CRITICAL_SECTION(intState);与HAL_EXIT_CRITICAL_SECTION(intState);见1;(3)events=tasksEvents[idx];tasksEvents[idx]=0;见2;(4)events=(tasksArr[idx])(idx,events);见3;(5)tasksEvents[idx]8、=events;见4;1、HAL_ENTER_CR9、ITICAL_SECTION(intState)与HAL_EXIT_CRITICAL_SECTION(intState)定义在hal_mcu.h中,如下:/*********************************************InterruptMacros********************************************/#defineHAL_ENABLE_INTERRUPTS()st(EA=1;)//开中断#defineHAL_DISA
4、s[idx];//uint16events;对应有事件发生的任务的数组tasksEvents[idx]=0;//CleartheEventsforthistask.NULLHAL_EXIT_CRITICAL_SECTION(intState);//跳出中断临界状态:恢复先前中断状态events=(tasksArr[idx])(idx,events);//调用相对应的任务事件处理函数处理,各类事件处理函//数M(task_id,event)返回的都是这个任务未被处理的事件HAL_ENTER_CRITICAL_SECTION(intState);tasksEvents[idx]
5、=e
6、vents;//Addbackunprocessedeventstothecurrenttask.//把刚才返回未处理的任务事件添加加当前任务中再进行处理//(跳出此if(idx7、stemintosleep}#endif}}说明:(1)OSAL调用Hal_ProcessPoll();来轮询UART与TIMER,涉及HAL层,晚点总结.(2)HAL_ENTER_CRITICAL_SECTION(intState);与HAL_EXIT_CRITICAL_SECTION(intState);见1;(3)events=tasksEvents[idx];tasksEvents[idx]=0;见2;(4)events=(tasksArr[idx])(idx,events);见3;(5)tasksEvents[idx]8、=events;见4;1、HAL_ENTER_CR9、ITICAL_SECTION(intState)与HAL_EXIT_CRITICAL_SECTION(intState)定义在hal_mcu.h中,如下:/*********************************************InterruptMacros********************************************/#defineHAL_ENABLE_INTERRUPTS()st(EA=1;)//开中断#defineHAL_DISA
7、stemintosleep}#endif}}说明:(1)OSAL调用Hal_ProcessPoll();来轮询UART与TIMER,涉及HAL层,晚点总结.(2)HAL_ENTER_CRITICAL_SECTION(intState);与HAL_EXIT_CRITICAL_SECTION(intState);见1;(3)events=tasksEvents[idx];tasksEvents[idx]=0;见2;(4)events=(tasksArr[idx])(idx,events);见3;(5)tasksEvents[idx]
8、=events;见4;1、HAL_ENTER_CR
9、ITICAL_SECTION(intState)与HAL_EXIT_CRITICAL_SECTION(intState)定义在hal_mcu.h中,如下:/*********************************************InterruptMacros********************************************/#defineHAL_ENABLE_INTERRUPTS()st(EA=1;)//开中断#defineHAL_DISA
此文档下载收益归作者所有