帮同学宣传一下http://shop57644665.taobao.com/

(1)当内核完成它自己内部由一些目标依赖部分组成的启动程序后,它将调用Application_Initialize()函数,这是实体进入内核所有应用程序的入口点。

(2)调用在Application_Initialize()函数中StartFrame()函数。这是实体对于框架来说的主要的进入点。StartFrame()主要负责内存池的创建,任务中实体任务的创建,启动作为当前应用程序一部分的任务。

(3)用于进行通信的分区内存池通过os_CreateParti tionPool()的调用而被创建。不同分区的大小和数目用户可以通过修改配置文件xxxconst.h来进行控制。

(4)如同任务的堆栈的内存分配一样,队列内存的分配是通过os_CreateMemoryPool()而得到的,它的大小也可以通过调整xxxconst.h而进行改变。

(5)在xxxcomp.c中有一张包含了所有在应用程序中的实体的pei_create()函数地址的表。实体可能以一个单独的任务运行也可能是共享一个任务。框架调用每一个pei_create函数并根据该函数的参数而创建一个实体。

(6)调用os_CreateTask()而创建一个任务。

(7)当所有任务都被创建后,框架像创建他们一样也使用相同的启动命令来启动他们。在进一步的初始化(如L1层和他的驱动)后,Application_Initialize()将会返回,内核中的调度将会被激活。

(8)任务根据他们的优先级不同而依次被调度。对于所有的任务来说,这里只有一个任务实体的函数。每个任务它都只被调用一次。每个任务都有它自己的堆栈空间和处理由所有框架函数通过pf_TaskEntry()发出的请求。

(9)在任务中每个实体函数消息队列通过os_CreateQueue()的调用而被创建。队列中实体的数量是通过pei_create()中输出的结构体而得知。

(10)pei_init()被调用。它的函数地址也是通过pei_create()中输出的结构体而得知。

(11)在pei_init()中当前被调度的实体同其他实体进行通信的通信通道被打开。这是通过调用vsi_c_open()来完成的。打开一个通信通道意味着向框架请求得到队列中的那些实体的句柄。如果一个实体的句柄因为相应的任务没有被调度而不能被请求,这时pei_init()将会返回一个错误信息,当前活动的任务将会被阻塞100ms以使内核能够调度比当前任务优先权低的任务。然后pei_init()将再次被调用。当所有被请求的句柄都被得到后,一个内部的数据库将通过pei_init()而被初始化。.

(12)如果与一个任务进行通信的所有的任务并没有都被调度,那么该任务可能被阻塞。

(13)如果一个任务在一个活动的主体中运行,pei_run将被调用。实体的主要循环也包含在pei_run()中。

(14)对于运行在被动活动主体中的任务其主要的循环已经进入了。任务将会进入os_ReceiveFromQueue()同时被阻塞直到它的消息队列接收到一个消息为止。