VxWorks kernel application

#1 什么是内核应用程序?

#2 开发内核应用程序注意事项

什么是内核应用程序?

内核应用程序不同于RTP程序,它允许在内核态,与操作系统使用相同的地址空间。因此,它与操作系统会相互干扰。它可以编译成内核应用程序模块,亦可以与操作系统映像静态连接生成一个映像。应用程序模块可以被动态加载,因此在开发和调试阶段非常有用,它不必重新编译操作系统映像,并且可以存放在任何内核支持的文件系统中,如NFS,使用ROMFS文件系统的FLASH或ROM中,或磁盘上。但是,与操作系统静态链接显然更适合生产使用。

由于,内核应用程序运行在内核态,因此可以直接访问硬件,这与RTP不同,RTP运行在用户态,无法与硬件直接交流。内核应用程序无法直接启动,必须由其它程序或操作系统来启动它(可以通过shell或workbench来启动),也可以通过配置在引导时自动启动。

开发注意事项

使用的C或C++类库


应用程序类型


C语言


C++语言


内核应用程序


VxWorks本地库


Dinkum C++和嵌入式(abridged)C++库


RTP应用程序


Dinkum C库


Dinkum C++和嵌入式(abridged)C++库

内核应用程序结构

内容应用程序类似普通的C/C++应用程序,但是它不需要传统的main函数(不像RTP需要main)。它可以是任意函数,在该函数中启动所有需要运行的任务。

 1 void myAppStartUp (void)
 2 {
 3     runFoo();
 4     tidThis = taskSpawn("tThis", 200, 0, STACK_SIZE,
 5         (FUNCPTR) thisRoutine,0,0,0,0,0,0,0,0,0,0);
 6     tidThat = taskSpawn("tThat", 220, 0, STACK_SIZE,
 7         (FUNCPTR) thatRoutine,0,0,0,0,0,0,0,0,0,0);
 8     tidAnother = taskSpawn("tAnother", 230, 0, STACK_SIZE,
 9         (FUNCPTR) anotherRoutine,0,0,0,0,0,0,0,0,0,0);
10     return (OK);
11 }

VxWorks的头文件

要使用VxWorks的工具类库,必须要包含相应的头文件。VxWorks头文件只支持ANSI C函数原型,遵循ANSI X3.159-1989标准。

  1. 首先,必须先包含头文件vxWorks.h -- 它包含了基本定义和类型
  2. 其次,可以根据需要包含其它头文件如lstLib.h
  3. ANSI头文件,大部分是与编译器无关,但是有少部分与编译相关(如stdef.h和stdarg.h),工具链会自动找到内部头文件,不必用户指定。
  4. ANSI C++头文件,每个编译器都有自己的C++库和C++头文件(如iosream和new)。C++头文件在安装编译器时存放在安装目录,而不是/target/h里。
  5. -I编译选项,该选项可以指定,编译器搜索头文件的路径。
  6. 一些头文件包含了更底层的头文件,如tylib.h使用了rnglib.h。
  7. VxWork私有头文件,通常以/*HIDDEN*/ ... /*END HIDDEN*/包含。

自定义头文件

在自定义头文件中别用extern “C”语句来保护系统头文件。所有VxWorks系统头文件已经被配置成可以被C和C++使用。因此,你不可以强迫使用C连接这些头文件内容。如下是错误的:

#ifdef _cplusplus                                                                                  #include <stdio.h>

extern "C" {                                     ==========>                            #ifdef _cplusplus

#endif                                                                                                  extern "C" {

#include <stdio.h>                                                                                #endif

另外,也别在C++源代码文件中使用 extern “C”{ #include <stdio.h>},而应该直接使用 #include <stdio.h>

内核对象的静态实例化

VxWorks内核对象--如任务或信号量--既可以静态实例化亦可以动态实例化,静态实例化提高了性能。有特定的C宏来静态实例化内核对象。

静态实例化

静态实例化,指的是对象在编译时被声明(使用特定的VxWorks宏),通常是全局对象。因此在编译时分配了内存,而不需要在运行时分配。对象可以在启动初始化时直接获得。

相对静态实例化,动态实例化涉及到运行时分配,并在使用前初始化,在删除时需要删除对象,并释放系统内存等,通常使用malloc和new来进行。使用动态实例化,必须考虑内存不足,另外,性能更差。

Dynamic Instantiation
struct my_object * pMyObj;
...
pMyObj = (struct my_object *) malloc (sizeof (struct my_object));
if (pMyObj != NULL)
{
fooObjectInit (pMyOjb);
return (OK);
}
else
{
/* failure path */
return (ERROR);
}
Static Instantiation
struct my_object myObj;
...
fooObjectInit (&myOjb);
/* myObj now ready for use */

可以被静态实例化的内核对象

  1. 任务
  2. 信号量
  3. 消息队列
  4. 看门狗时钟

静态实例化的代码大小

编译时声明的对象并不占用可执行文件、VxWorks映像或存储介质的任何空间。如果只声明而没有初始化,则编译器将数据存放在bss段。

静态实例化的好处

  1. 访问更快,更确定
  2. 应用程序逻辑更简单,因为不需要考虑内存不足问题。
  3. 对象的静态实例化不会失败,除非应用程序本身太大,无法加载到系统内存。
  4. 可以移除动态内存分配模块,使得VxWorks内核更小。

应用程序和静态实例化

静态初始化提供了更好的性能和优势。如果对象永远不会被删除,则尽量使用静态实例化。静态实例化应该只用于内核应用程序,而不应该在RTP中使用。

静态实例化范围

内核对象通常做为全局变量,因为对象ID常用来任务间通信和同步。但是,并不是必须是全局的,也可以函数范围的。

宏的使用

如何代码太长需要要反斜杠来连接,如

myTask = VX_TASK_INSTANTIATE(myTask,100,0,4096,pEntry,\

0,1,2,3,4,5,6,7,8,9);

宏VX_TASK_INSTANTIATE用来静态实例化任务

时间: 2024-07-29 21:06:11

VxWorks kernel application的相关文章

VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)

#1 内核对象的静态实例化 内核对象的静态实例化 任务的静态实例化 VX_TASK宏用来在编译时声明一个任务对象.该宏带有2个参数:任务名和栈大小.不像taskSpawn函数,任务名称可以是NULL.VX_TASK的任务名称必须指定.栈大小是非零值并且是编译时常量. VX_TASK_INSTANTIATE宏被VX_TASK用来初始化和创建任务,等价于taskSpawn函数的功能.VX_TASK_INITIALIZE宏杯VX_TASK初始化任务并让任务处于SUSPEND状态,直到稍后调用taskA

Kernel Application

Kernel Application 是 Erlang 第一个启动的应用程序,基于OTP, Kernel and STDLIB, 主要包含以下服务: 可以运行appmon:start()看具体的结构,新版本的会报错,要用observer:start(),可以看到如下: 这就可以看出包含了哪些服务:code周期管理, 文件IO, 网络IO, 调试和日志....等. 注: 本BLOG都只是个人的理解和看法,没有权威性.

vxWorks 命令

sp( )            缺省參数创建一个任务(priority="100" 返回值为任务ID.或错误)(taskSpawn) sps( )                创建一个任务.并挂起它 tr( )                  恢复一个挂起的任务(与taskResume同样) ts( )                  挂起一个任务         (与taskSuspend同样) td( )                  删除一个任务 (与taskDele

Linux发展历史

一.因AT&T公司和BSD持久的官司,1990年左右,BSD已经基本清除了系统中的Unix代码,所以BSD一类的系统叫做类Unix系统.1990年左右,BSD分支中的Jolitz计划将BSD一直到X86机器(之前Unix一直运行在摩托罗拉生产的CPU之上),后因其合作机构要求将此移植后的系统商业化,导致1991年项目中止,1992年中左右又恢复,此计划叫 386-BSD 1991年8月,Linus Torvalds 宣布成立Linux,其后,Linux壮大,发展,因素如下: 1.遵循GPL 2.

Linux基础之文件系统及基本命令

Linux文件系统: Linux:glibc(glibc是GNU发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc) 程序编译方式: 动态链接 静态编译 进程的类型: 终端:硬件设备,关联一个用户接口 与终端相关:通过终端启动 与终端无关:操作引导启动过程当中自动启动 操作系统的组成: 静态:kernel, application 文件系统:层级结构 FHS: Filesystem Hierarchy Standard /bin:所有

Linux入门(四)

目录: 一.根文件系统层级标准FHS 二.bash的基础特性(一)     1.命令历史     2.命令行补全     3.路径补全     4.命令行展开     5.命令执行的状态结果     6.引用     7.快捷键 三.目录管理相关命令mkdir.rmdir.tree 四.引用命令的执行结果 五.文件查看类命令 六.文件管理和变量命令:cp.mv.rm 七.浮点数据如何存储 一.根文件系统FHS: 1.帮助信息获取: help,--helpl,man,info 自带文档(READM

浅谈操作系统发展史

一.计算机的基本组成 1)CPU:运算器.控制器.寄存器.缓存等组成 早期采用Poll轮询机制,每隔一定时间询问设备,浪费cpu资源 后来采用Interput中断机制,硬件通知机制,外围设备通过不断中断来和CPU核心设备交互,但中断过多会导致系统性能下降,如网卡访问量过大 运算器.控制器:核心部件 寄存器.缓存:加速部件,为了提高CPU的性能 2)存储器:内存,RAM(Random Access Memory)是编址单元 3)Input:下指令,提供数据等: 4)Output:输出数据加工的结果

Why GEMM is at the heart of deep learning

Why GEMM is at the heart of deep learning I spend most of my time worrying about how to make deep learning with neural networks faster and more power efficient. In practice that means focusing on a function called GEMM. It’s part of the BLAS (Basic L

1-17开源精神

转载请说明出处:http://www.cnblogs.com/zaifeng0108/p/7364389.html 完整的OS: Kernel+Application 狭义上的OS: kernel GNU/Linux 大教堂式,集市, www.top500.org;