#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. 【原创】PostSharp入门笔记

    最近写了一个抓取软件,用户反映软件偶尔会抛异常: 由于当时写代码时没有注意异常处理,大部分方法都没有写try…catch…finally的语句,所以很难找出异常是出在哪个地方,难道要为所有方法加上tr ...

  2. MySql服务器的启动和关闭

    转自:http://zqding.iteye.com/blog/1562095 在windows下: 启动: .cd c:\mysql\bin .mysqld --console 关闭: .cd c: ...

  3. ajax重写,js方法重新

    重写Jquery的$.ajax方法 (function($){ //备份jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=functio ...

  4. Docker 1.12.0将要发布的新功能

    Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...

  5. java中如何忽略字符串中的转义字符--转载

    原文地址:http://my.oschina.net/u/1010578/blog/366252 起因     这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是js ...

  6. C#中的多态现象

    面向对象的特征封装.继承和多态.Polymorphism(多态性)来源于希腊单词,指“多种形态”.多态性的一个重要特征是方法的调用是在运行时确定而不是编译时.在.NET中用于实现多态性的关键词有vir ...

  7. C#求所有可能的排列组合

    static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...

  8. WPF 之 鼠标双击事件

    由于WPF中没有鼠标的双击事件,因而只能通过MouseDown事件来模拟.当连续的两次MouseDown事件的时间间隔,没有超过一个设定的时间阈值时,就计算为一个双击事件,并作相应的处理. 利用WPF ...

  9. C# 之 集合整理

    集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问):一个集合包括多个元素,即有一个集合类对象和N个元素对象. BCL(Base Class Library, 基类库) ...

  10. Triangular Sums

    描述 The nth Triangular number, T(n) = 1 + … + n, is the sum of the first n integers. It is the number ...