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

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

什么是内核应用程序?

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

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

内核应用程序的代码构建的二进制对于不同的处理器并不兼容,因此,针对不同的处理器需要构建不同的二进制文件,如UP,SMP,32位的VxWorks或64位的VxWorks等。

开发注意事项

使用的C或C++类库

应用程序类型

C语言

C++语言

内核应用程序

VxWorks本地库

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

RTP应用程序

Dinkum C库

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

内核应用程序结构

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

 void myAppStartUp (void)
{
runFoo();
tidThis = taskSpawn("tThis", , , STACK_SIZE,
(FUNCPTR) thisRoutine,,,,,,,,,,);
tidThat = taskSpawn("tThat", , , STACK_SIZE,
(FUNCPTR) thatRoutine,,,,,,,,,,);
tidAnother = taskSpawn("tAnother", , , STACK_SIZE,
(FUNCPTR) anotherRoutine,,,,,,,,,,);
return (OK);
}

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用来静态实例化任务

下载内核应用程序对象模块到目标

内核应用程序对象模块可以从Workbench或kernel的shell中下载。一旦被加载到目标系统内存,模块的任何子函数可以被调用,可以启动任务,调试等。

链接内核应用程序对象模块到VxWorks中

可以使用Workbench和命令行与VxWorks映像连接在一起。

配置VxWorks自动运行内核应用程序

  1. 配置VxWorks启用INCLUDE_USER_APPL组件
  2. 在usrAppInit函数中调用应用程序的入口函数,假设应用程序的入口点函数是myAppStartUp,那么按如下方式添加到usrAppInit中,void usrAppInit(){... myAppStartUp();}
  3. 链接内核应用程序与内核映像。

映像大小的考虑

一般bootloader会把bootloader的代码拷贝到RAM_HIGH_ADRS处的RAM中的,而把VxWorks映像拷贝到RAM_LOW_ADRS,因此,必须确保VxWorks的映像不会超过RAM_HIGH_ADRS-ROW_LOW_ADRS,否则将覆盖bootloader的代码,导致bootloader进程意外终止。

对应自启动的VxWorks映像,则需包装RAM_HIGH_ADRS小于LOCAL_MEM_SIZE。

VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)的更多相关文章

  1. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Small-Footprint Configuration

    什么是Small-footprint? Small-footprint常见关键配置? 如何配置Small-footprint? 什么是Small-footprint? Small-footprint配 ...

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

    #1 内核对象的静态实例化 内核对象的静态实例化 任务的静态实例化 VX_TASK宏用来在编译时声明一个任务对象.该宏带有2个参数:任务名和栈大小.不像taskSpawn函数,任务名称可以是NULL. ...

  3. VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer

    中断服务程序 ISR 硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式. ISR亦称为中断处理函数,是对中断的正确响应.可以使用任何ISR连接到任何没有被VxWorks使用的中断上.当关联 ...

  4. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务

    概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...

  5. VxWorks 6.9 内核编程指导之读书笔记 -- POSIX

    POSIX能力 VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件.VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSI ...

  6. VxWorks 6.9 内核编程指导之读书笔记 -- Singnals

    Signals 信号是操作系统用于异常处理和异步控制流的关键.在很多方面,信号相当于软件方面的硬件中的中断.操作系统产生的信号包括总线错误和浮点处理异常.信号也提供了API来管理和产生信号.在应用程序 ...

  7. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)

    VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...

  8. VxWorks 6.9 内核编程指导之读书笔记 -- C++开发

    5.1 介绍 针对C++的VxWorks配置 C++头文件 使用C++启动任务 C和C++之前调用代码 C++编译器说明 在信号处理和ISR中使用C++ 下载C++编写的内核模块 C++编译器的不同 ...

  9. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

随机推荐

  1. Linux下高并发socket链接数测试

    一.如何增大service进程的max open files ulimit -n 只能改小max open files,不能改大.需要按照以下步骤: 修改/etc/security/limits.co ...

  2. 深入NGINX:我们如何设计它的性能和扩展性

    为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...

  3. [Angular2 Form] Use RxJS Streams with Angular 2 Forms

    Angular 2 forms provide RxJS streams for you to work with the data and validity as it flows out of t ...

  4. 深入了解android平台的jni(一)

    android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中.     主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的 ...

  5. javascript实现单例模式

    1.简单实现单例模式: var singleTon = function(){ var _pria = 'private value'; var show_pria = function(){ con ...

  6. Golang学习 - reflect 包

    ------------------------------------------------------------ 在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueO ...

  7. NULL, '\0',0 '0'的区别

    如题,在程序中经常遇到NULL,和'\0',常常疑惑它们是什么关系,其实它们的值是一样的,只不过表现的形式不一样: 1.NULL; NULL 即空指针,在C和C++中的形式不一样,msdn上有如下的内 ...

  8. Quartz 设置一个半小时任务实现

    该文章属于本人原创,转载请注明出处.   spring + Quartz 设置定时任务时要求没一个半小时执行一次   设置两个相同的定时任务   第一个从整点开始每三小时执行一次           ...

  9. BootStrap2学习日记17---导航路径和分页

    导航路径 代码: <ul class="breadcrumb"> <li><a href="#">Home</a> ...

  10. jQery简单Tab选项卡效果

    简单的Tab效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...