不知道你是否还记得这个函数:osal_start_timerEx(),在这个函数中添加了一个定时任务,其中ID号就不用我多说了,HAL_KEY_EVENT是将要被添加到tasksEvents的任务的掩码,HAL_KEY_DEBOUNCE_VALUE则是用来进行消抖的一个时间值。用过单片机的都知道当按键按下时会产生抖动,而通常消抖的方法是延时。所以我们也可以知道在这里产生IO口中断的是按键。如果使用IO口中断来读其它设备则可以根据实际情况读或调用函数osal_set_event()对添加任务。当然并不是每个中断都必须添加对应的任务,如定时器中断。在中断服务函数中是否添加对应的任务应视具体情况而定。
下面对ZigBee协议栈对事件的处理做一个总结。 在ZigBee协议栈中处理事件有三种方式:轮询、中断、(操作系统)任务。
其中轮询与中断学过单片机的都用过,在这就不必多说了。唯独任务(至少我所了解的)是操作系统才有的概念。使用任务处理事件就需要在一个事件产生时添加任务,在任务处理完毕时删除任务,还需要在不同任务间进行切换。在ZigBee协议栈中tasksEvents是一个任务是否存在的标志,当需要添加任务时通过调用函数osal_set_event()在tasksEvents中添加相应的掩码,当任务处理完毕时直接把相应的掩码清零即可。而任务切换则必须等到前一个任务处理完毕,并且没有优先级更高的任务时才被处理。而优先级是由数组tasksArr[]的成员的顺序决定的。在一些比较强大的操作系统当中这些东西都有,当然是会有所区别的,只不过要复杂得多,并且引入了一些新的概念像PCB、任务调度、进程、线程等,其中任务调度我的理解就是任务切换。像这些东西我所知道的与不知道的讲也讲不完,就并不多说了,还是回到我们的话题。
在ZigBee协议栈中任务的处理总结起来就一句话:任何一个任务都只有调用了函数osal_set_event()之后才能被处理。
当然事件与任务不是一回事,任务同中断一样只是处理事件的一种方式。而且通常是先有事件然后注册一个与事件对应的任务。没有事件当然也可以注册任务,不过这又有点扯远了。