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)。它可以是任意函数,在该函数中启动所有需要运行的任务。
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标准。
- 首先,必须先包含头文件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。
转载于:https://www.cnblogs.com/C-Sharp2/p/5911688.html
VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)相关推荐
- VxWorks 6.9 内核编程指导之读书笔记 -- POSIX
POSIX能力 VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件.VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSI ...
- 《Java 并发编程实战》--读书笔记
Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- 《编程珠玑》 读书笔记
<编程珠玑> 读书笔记 娄雨禛 PB16060356 准确的问题描述 很多时候,我们总是过度关注了解决问题所用的巧妙算法,而将问题本身的重要性忽视.当我们拿到一个问题时,应当反复研读问题的 ...
- 《javascript面向对象编程指南》读书笔记
<javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...
- 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)
第十一章 嵌套与可变循环 Python 3.X里 print()函数默认是自动换行的,所以本章代码会有很多问题,实际上 print()函数里有一个默认参数 end, 默认情况下: end= " ...
- 《Java多线程编程核心技术》读书笔记
为什么80%的码农都做不了架构师?>>> <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...
- 《Java编程思想》读书笔记
前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...
- 《JavaScript DOM 编程艺术》读书笔记
<JavaScript DOM 编程艺术>读书笔记--其一 第二章 1.Javascript代码编写方式: (1)将JavaScript代码放在文档<head>标签中的< ...
最新文章
- Linux常用命令——cat,tac
- java applet js_jsp嵌入java-applet,实现js调用web服务器程序
- DL之SoftmaxWithLoss:SoftmaxWithLoss算法(Softmax+交叉熵误差)简介、使用方法、应用案例之详细攻略
- java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会
- 上传jar包到nexus私服
- python打开文件要wordcloud吗,使用python创建wordcloud
- HTTP系列学习(笔记三):HTTP的发展历程思维导图
- as_hash ruby_Ruby中带有示例的Hash.keep_if方法
- Jackson安全漏洞版本升级
- 【静默】Oracle各类响应文件何在?
- Unity3d场景漫游---iTween实现
- GitLab+Nornor3.0.0完成CI/CD流水线配置(更新版)
- 【R语言】如何直接调取Wind、iFinD数据接口教程
- ubuntu安装pyaudio
- MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(1) SolidWorks模型的导入
- 淘宝API 优惠券查询
- 单元测试系列一-为什么要写单元测试,何时写,写多细
- 青藤云中间商一面面经
- windows debug tools
- 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?