欢迎来到天天文库
浏览记录
ID:37714139
大小:21.01 KB
页数:7页
时间:2019-05-29
《zigbee学习笔记(一)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Zstack的任务处理机制Zmain.c中初始化部分重点掌握:osal_init_system();//初始化操作系统osal_start_system();//执行操作系统Z-Stack操作系统初始化中:osalInitTasks();//初始化系统的任务初始化系统的任务:voidosalInitTasks(void){uint8taskID=0;//分配内存,返回指向缓冲区的指针tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);//设置所分配的内存空间单元值为0osa
2、l_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));//任务优先级由高向低依次排列,高优先级对应taskID的值反而小macTaskInit(taskID++);//macTaskInit(0),用户不需考虑nwk_init(taskID++);//nwk_init(1),用户不需考虑Hal_Init(taskID++);//Hal_Init(2),用户需考虑APS_Init(taskID++);//APS_Init(3),用户不需考虑ZDApp_Init(taskID++);//ZDApp_I
3、nit(4),用户需考虑7GenericApp_Init(taskID);//GenericApp_Init_Init(5),用户需考虑}注明用户不需考虑的任务Ti已经给初始化完成了,在编程的时候可以不予考虑。我们只需要考虑硬件层和应用层的任务初始化。如:Hal_Init(taskID++);ZDApp_Init(taskID++);GenericApp_Init(taskID);下面说一下如何在程序中加入自己的任务:在osalInitTasks()和tasksArr[]添加相应的项就可以了。1.修改osalInitTasks()Voidos
4、alInitTasks(void){……OuhsApp_Init(taskID++);PhotoApp_Init(taskID);}2.修改tasksArr[]ConstpTaskEventHandlerFntaskArr[]={……OuhsApp_ProcessEventPhotoApp_ProcessEvent};3.添加-Init()和-ProcessEvent()VoidPhotoApp_Init(uint8task_id){7}Uint16PhotoApp_ProcessEvent(uint8task_iduint16events)
5、{}以上是任务的初始化与任务的添加,下面看以下任务是如何处理的?osal_start_system();//执行操作系统voidosal_start_system(void){#if!defined(ZBIT)&&!defined(UBIT)for(;;)//ForeverLoop#endif{osal_run_system();}}osal_run_system:voidosal_run_system(void){uint8idx=0;osalTimeUpdate();//这里是在扫描哪个事件被触发了,然后置相应的标志位7Hal_Proce
6、ssPoll();//硬件进程调用,ThisreplacesMT_SerialPoll()andosal_check_timer().do{if(tasksEvents[idx])//Taskishighestprioritythatisready.{break;//得到待处理的最高优先级任务索引号idx}}while(++idx7、保护events=tasksEvents[idx];//提取需要处理的任务中的事件tasksEvents[idx]=0;//CleartheEventsforthistask.清除本次任务的事件HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区activeTaskID=idx;events=(tasksArr[idx])(idx,events);//通过指针调用任务处理函数,关键activeTaskID=TASK_NO_TASK;7HAL_ENTER_CRITICAL_SECTION(intState);/8、/进入临界区,保护tasksEvents[idx]9、=events;//Addbackunprocessedeventstothecurrenttask.保存未处理
7、保护events=tasksEvents[idx];//提取需要处理的任务中的事件tasksEvents[idx]=0;//CleartheEventsforthistask.清除本次任务的事件HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区activeTaskID=idx;events=(tasksArr[idx])(idx,events);//通过指针调用任务处理函数,关键activeTaskID=TASK_NO_TASK;7HAL_ENTER_CRITICAL_SECTION(intState);/
8、/进入临界区,保护tasksEvents[idx]
9、=events;//Addbackunprocessedeventstothecurrenttask.保存未处理
此文档下载收益归作者所有