#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标准。

  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。

转载于:https://www.cnblogs.com/C-Sharp2/p/5911688.html

VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)相关推荐

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

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

  2. 《Java 并发编程实战》--读书笔记

    Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...

  3. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  4. 《编程珠玑》 读书笔记

    <编程珠玑> 读书笔记 娄雨禛 PB16060356 准确的问题描述 很多时候,我们总是过度关注了解决问题所用的巧妙算法,而将问题本身的重要性忽视.当我们拿到一个问题时,应当反复研读问题的 ...

  5. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  6. 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)

    第十一章 嵌套与可变循环 Python 3.X里 print()函数默认是自动换行的,所以本章代码会有很多问题,实际上 print()函数里有一个默认参数 end, 默认情况下: end= " ...

  7. 《Java多线程编程核心技术》读书笔记

    为什么80%的码农都做不了架构师?>>>    <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...

  8. 《Java编程思想》读书笔记

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...

  9. 《JavaScript DOM 编程艺术》读书笔记

    <JavaScript DOM 编程艺术>读书笔记--其一 第二章 1.Javascript代码编写方式: (1)将JavaScript代码放在文档<head>标签中的< ...

最新文章

  1. Linux常用命令——cat,tac
  2. java applet js_jsp嵌入java-applet,实现js调用web服务器程序
  3. DL之SoftmaxWithLoss:SoftmaxWithLoss算法(Softmax+交叉熵误差)简介、使用方法、应用案例之详细攻略
  4. java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会
  5. 上传jar包到nexus私服
  6. python打开文件要wordcloud吗,使用python创建wordcloud
  7. HTTP系列学习(笔记三):HTTP的发展历程思维导图
  8. as_hash ruby_Ruby中带有示例的Hash.keep_if方法
  9. Jackson安全漏洞版本升级
  10. 【静默】Oracle各类响应文件何在?
  11. Unity3d场景漫游---iTween实现
  12. GitLab+Nornor3.0.0完成CI/CD流水线配置(更新版)
  13. 【R语言】如何直接调取Wind、iFinD数据接口教程
  14. ubuntu安装pyaudio
  15. MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(1) SolidWorks模型的导入
  16. 淘宝API 优惠券查询
  17. 单元测试系列一-为什么要写单元测试,何时写,写多细
  18. 青藤云中间商一面面经
  19. windows debug tools
  20. 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?

热门文章

  1. 负债会让你有多大改变?
  2. 你在现实中遇到让你最跌破三观的人或者事是什么?
  3. 男人如何在不经常锻炼的情况下,慢慢消除大肚皮,恢复好身材?
  4. 每天走6000步,血糖真的可以恢复正常吗?
  5. 30岁过后,是继续上班,还是去做个小生意?
  6. 10个人做抖音,8个做不起来,为啥?
  7. This time, ZTE has released the world‘s first
  8. Each interface on the back of the fuselage
  9. Java-Jdk12版本下载后没有Jre的解决方案以及配置环境变量
  10. vim学习笔记--代码折叠