Z-Stack的运行角度的理解(仅作个人学习笔记,希望别人评指正)

Z-Stack的运行角度理解

1:硬件初始化:

首先从底层硬件开始初始化,比如LCD、key、晶振、I/O等。

2:初始化系统:

把系统的消息队列,事件链表、各个任务号事件处理函数、内才存管理、flash等初始化,系统初话完毕。

3:配置:

完成硬件初始化和系统初始化后,由于某些硬件是要为上层的APP服务的,这时候我们就需要把相应的硬件配置好,如设置回掉函数为通知系统下层的动作,启动相关硬件设备处于工作状态。

4:系统运行:

系统调用其它层次

这时候系统开始了任务轮询机制:查事件链表,有事件则调用该任务号的事件处理函数。除了系统层外的所有层次都由系统调度,负责按优先级运行各个任务。

这时系统向其它层次的调度。每个层次的事件类型分为两种第一种系统事件:是系统告知的系统消息,该消息告诉相应层系统的消息队列中有一个需要该层处理的事件(具体是什么在消息结构中有)(应用层的收到无线消息、按键事件、串口事件)。第二种应用层本身是定义的事件:系统的定时器触发的事件,一般都是定时需要处理的(比如硬件层按键定时扫描,显示屏定时扫描)等等

其它层次到系统:

上面讲到了两种事件类型,那么第二种我们知道是系统定时器触发的事件,那么第一种呢?

这其实是其它层次告知系统的,比如硬件层定时出发一个扫描按键消息,这是硬件层发现有按键按下,那么他会去调用3中所说的回调函数,然后回调函数负责把该消息告知系统,系统会把该消息丢入消息队列,并把相应的任务事件置位为系统事件,等到轮询是就去执行。

然而系统怎么知道该消息是什么层的任务呢?

这是由于在回调函数中会查询是否有其他的层用到本层的相关应用?(比如硬件层就会看是否有其它层用到按键),如果有则把相关消息送达该任务(系统负责的),没有则不送。

那么如何查询是否有其它层用到本层相关应用呢?

这时由于如果其它层用到本层相关应用,会在该层的初始化时调用本层的相关应用的注册函数,注册登记。比如应用层登记按键、MT层的串口等。

简单区分:

第一种事件时被动的,第二种事件时主动的,并且不用去消息队列取消息。

5各层如何处理事件

每一层都有自己的事件处理函数,在该处理函数中首先会判断是否有系统消息,如果有那么先从系统中消息队列中把事件一一拿出来处理完。然后再返回未处理的非系统类事件。在下一次轮询中去处理该事件。

 

你可能感兴趣的:(Z-Stack学习开发笔记)