VxWorks中的任务及调度(二):VxWorks中的main()

来源:互联网 发布:js参数给jquery赋值 编辑:程序博客网 时间:2024/06/05 09:13


虽然在VxWorks上开发已有几年功夫,尽管对跑在单盘上的应用代码还算熟悉,但对VxWorks系统依然如一个门外汉不知深浅,一旦遇到系统级别的问题只会程式化的去定位,知其然不知其所以然,心中缺了不少底气,一旦听说有个严重问题更是心有戚戚然焉。鉴于此,可知,不深入不行啊~

因此,第一节,选择从VxWorks中的任务和调度入手。VxWorks是基于任务(Task)调度的操作系统,VxWorks中的任务就如同其他操作系统例如Linux中的进程(Process), VxWorks系统依靠调度任务完成一个又一个功能。

刚接触VxWorks系统之初,有一点很不明白以前学编程时总会先写main(),但是在VxWorks系统中居然不需要写main,需要完成什么功能,创建一个任务(taskSpawn)即可。那么,VxWorks中真的没有main()吗?任务机制是否也如进程机制一样也有父任务与子任务?如果如此那么根任务在哪里?任务在何时运行?任务何时切换?

 

第一节: VxWorks中的main()

随着慢慢深入阅读设备代码,发现创建任务的API最后必然会追溯至应用程序中的一个总接口,这个总接口一定会被一个函数usrAppInit()调用。usrAppInit()定义在生成最后可执行文件工程个usrAppInit.c中,当我们需要增加一些假函数或者临时起任务完成某项功能时,也会在usrAppInit.c中增加代码。如下图所示,单盘应用软件的根任务EponMain即在该接口中定义,可见userAppInit()即相当于单盘的main()

 

那么, usrAppInitVxWorks是何关系?在系统启动过程中在何处被调用呢?以ECOB为例,生成最后可执行文件的功能eponCard_project包含以下源代码:

 

这些代码中有一部分和具体单盘类型相关,还有一部分是嵌入式系统中普遍存在的功能,例如prjConfig.c

prjConfig.c是一个动态生成的配置文件,该文件包含从内核启动前到内核启动完成后的初始化流程:

usrInit():内核初始化过程

 

usrNetProtoInit():协议栈初始化

 

usrNetworkAddrInit():初始化设备网络地址

 

以及其他网络相关功能初始化,WDB代理、软件开发工具、信号量、消息队列、I/O系统等。这些系统相关功能初始化后,最后执行内核启动完成后的流程usrRoot(), usrAppInit即在此处调用。

 

本小节总结:

VxWorks应用软件的总入口为定义在usrAppInit.c中的usrAppInit(),该接口在内核初始化完成后调用。

0 0