VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)
#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标准。
- 首先,必须先包含头文件vxWorks.h -- 它包含了基本定义和类型
- 其次,可以根据需要包含其它头文件如lstLib.h
- ANSI头文件,大部分是与编译器无关,但是有少部分与编译相关(如stdef.h和stdarg.h),工具链会自动找到内部头文件,不必用户指定。
- ANSI C++头文件,每个编译器都有自己的C++库和C++头文件(如iosream和new)。C++头文件在安装编译器时存放在安装目录,而不是/target/h里。
- -I编译选项,该选项可以指定,编译器搜索头文件的路径。
- 一些头文件包含了更底层的头文件,如tylib.h使用了rnglib.h。
- 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 */
可以被静态实例化的内核对象
- 任务
- 信号量
- 消息队列
- 看门狗时钟
静态实例化的代码大小
编译时声明的对象并不占用可执行文件、VxWorks映像或存储介质的任何空间。如果只声明而没有初始化,则编译器将数据存放在bss段。
静态实例化的好处
- 访问更快,更确定
- 应用程序逻辑更简单,因为不需要考虑内存不足问题。
- 对象的静态实例化不会失败,除非应用程序本身太大,无法加载到系统内存。
- 可以移除动态内存分配模块,使得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自动运行内核应用程序
- 配置VxWorks启用INCLUDE_USER_APPL组件
- 在usrAppInit函数中调用应用程序的入口函数,假设应用程序的入口点函数是myAppStartUp,那么按如下方式添加到usrAppInit中,void usrAppInit(){... myAppStartUp();}
- 链接内核应用程序与内核映像。
映像大小的考虑
一般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 (一)的更多相关文章
- VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Small-Footprint Configuration
什么是Small-footprint? Small-footprint常见关键配置? 如何配置Small-footprint? 什么是Small-footprint? Small-footprint配 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks Kernel application (二)
#1 内核对象的静态实例化 内核对象的静态实例化 任务的静态实例化 VX_TASK宏用来在编译时声明一个任务对象.该宏带有2个参数:任务名和栈大小.不像taskSpawn函数,任务名称可以是NULL. ...
- VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer
中断服务程序 ISR 硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式. ISR亦称为中断处理函数,是对中断的正确响应.可以使用任何ISR连接到任何没有被VxWorks使用的中断上.当关联 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- 多任务
概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- POSIX
POSIX能力 VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件.VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSI ...
- VxWorks 6.9 内核编程指导之读书笔记 -- Singnals
Signals 信号是操作系统用于异常处理和异步控制流的关键.在很多方面,信号相当于软件方面的硬件中的中断.操作系统产生的信号包括总线错误和浮点处理异常.信号也提供了API来管理和产生信号.在应用程序 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)
VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...
- VxWorks 6.9 内核编程指导之读书笔记 -- C++开发
5.1 介绍 针对C++的VxWorks配置 C++头文件 使用C++启动任务 C和C++之前调用代码 C++编译器说明 在信号处理和ISR中使用C++ 下载C++编写的内核模块 C++编译器的不同 ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
随机推荐
- 【原创】PostSharp入门笔记
最近写了一个抓取软件,用户反映软件偶尔会抛异常: 由于当时写代码时没有注意异常处理,大部分方法都没有写try…catch…finally的语句,所以很难找出异常是出在哪个地方,难道要为所有方法加上tr ...
- MySql服务器的启动和关闭
转自:http://zqding.iteye.com/blog/1562095 在windows下: 启动: .cd c:\mysql\bin .mysqld --console 关闭: .cd c: ...
- ajax重写,js方法重新
重写Jquery的$.ajax方法 (function($){ //备份jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=functio ...
- Docker 1.12.0将要发布的新功能
Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...
- java中如何忽略字符串中的转义字符--转载
原文地址:http://my.oschina.net/u/1010578/blog/366252 起因 这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是js ...
- C#中的多态现象
面向对象的特征封装.继承和多态.Polymorphism(多态性)来源于希腊单词,指“多种形态”.多态性的一个重要特征是方法的调用是在运行时确定而不是编译时.在.NET中用于实现多态性的关键词有vir ...
- C#求所有可能的排列组合
static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...
- WPF 之 鼠标双击事件
由于WPF中没有鼠标的双击事件,因而只能通过MouseDown事件来模拟.当连续的两次MouseDown事件的时间间隔,没有超过一个设定的时间阈值时,就计算为一个双击事件,并作相应的处理. 利用WPF ...
- C# 之 集合整理
集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问):一个集合包括多个元素,即有一个集合类对象和N个元素对象. BCL(Base Class Library, 基类库) ...
- Triangular Sums
描述 The nth Triangular number, T(n) = 1 + … + n, is the sum of the first n integers. It is the number ...