应用层有一个任务,并匹配有一个唯一的任务ID。
任务中可以处理事件,存在有一个事件处理函数,所有事件处理过程都在函数内。
应用层的任务还有1个2个字节长的变量,称为任务事件变量。如果事件变量和某个事件宏值与操作为1,则表示应用层任务将处理这个事件。详情的体现情况可以查看事件处理函数,它的内部有与所有事件进行与运算。
系统在运行时会不断地读应用层任务事件变量,当它为0时,就认为应用层任务当前没有事件需要处理(队列为空),如果发现不为0,那么它就会认为应用层有事件将要处理,就会调用应用层事件处理函数ProcessEvent(byte task_id,UINT16 events),并且将任务事件变量传给events形参。在这个事件处理函数里,events变量会分别和所有应用层定义的所有事件宏值进行与操作,并执行对应的事件代码。
那其实当我们调用uint8 osal_set_event(uint8 task_id,uint16 event_flag)时,其实就是把任务ID中的事件变量或上了flag,使之成为非0事件变量,然后触发事件处理函数。
几乎每一层都是一个任务,每一层都有一个任务ID,事件处理函数,事件变量
并且所有的事件处理函数由一个数组集中
函数数组={事件处理A,事件处理B,…}
变量数组={事件变量A,事件变量B,…}
通过数组下标来获取事件处理函数和事件变量。
应用层任务的任务ID是8。也就是函数数组中的第8个元素。
在应用层OSAL开头的文件中的osalInitTasks中会给所有任务分配ID。
在OSAL/OSAL.c中的osal_run_system函数可以看到事件变量的轮询过程
系统在初始化完成后会一直死循环处理这个函数,来查看是否要执行事件
所以ZStack稳定工作时,他的行为就是在死循环里不断的读事件变量。如果都为0就继续读。
实力解说,赞一个