vxworks培训笔记

嵌入式开发涉及的内容
<1>硬件选型:CPU,板子架构,总线,存储方式,外设,接口
<2>软件:
 自编操作系统:编译原理,语言选择,调试工具,第三方开发工具
 高级操作系统:IDE,驱动的支持(架构),多cpu类型的支持,开发工具
 引进小部件:移植,编译环境,接口
<3>测试:开发、检验

2.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。
合并开发的例子有QNX,类似于dos下C语言程序的开发。
合并开发的优点:简单
    缺点:资源消耗量大,CPU支持(QNX最初只支持X86),非标准体系的支持

vxWorks实际采用开发模式
 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks的开发工具
 vxWorks:面向对象可以剪裁的实际运行操作系统

3.vxWorks启动方式
 <1>Rom方式 (vxWork_rom)
 vxWorks直接烧入rom
 <2>Rom引导方式(bootrom+vxWorks)
 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载
!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application

4.调试
 <1>attach
  用来在多任务调试时将调试对象绑定到某个任务
 <2>任务级调试(attach taskName)
  单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。
  全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。
  任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attach到本任务,不起作用。
  一次性断点:跑到一次之后自动删除。
 <3>系统级调试(attach system)
把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用
 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。
 !可是使用命令行方式的调试,参看crossWind教程。

5.调度
 优先级调度(无条件)
时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。
!死循环使比它优先级低的任务都不能运行。

6.任务间通讯
 信号量,全局变量,管道,signal,message queue,socket
信号量:分互斥、同步(二进制)、计数三种。其中互斥用于资源管理,禁止多任务同时共享内存。它的优势是:速度快;同一任务如果已经take到,再次take还会成功。
!全局变量一定要有信号量保护。
Message queue:封装了全局变量和信号量,优势是:快;有很多操作项(send多recv少:消息可以排队,用priority_urgent选项加到队列 头。send少recv多:取的时候支持fifo和优先级,即有消息到达时给高优先级任务还是先被recv阻塞的任务)
signal:紧急通信机制,仅次于中断,依赖于系统调度,不依赖时间片(中断依赖于硬件时间),因此signal又称为软中断。
!exeption:内部中断,属于硬中断(例如除法出错)。它与signal的关系如下图:


7.内存分配
在config.h中由宏定义指定。

!bootrom中的内存驱动在config/scr/drv/mem下,直接include *.c就可以使用其中的函数。对于flash必须在config.h中加上类型的定义,换flash芯片在flash***.h中修改控制字等宏定义。

8.中断
中断分三层含义:
 中断引脚号(或从中断控制器得到)(interrupt level) ***_LEVEL
 中断号(interrupt number)      INT_VEC_GET(***_LEVEL)
 中断向量(对x86是中断号*4)(interrupt vector)  INUM_TO_IVEC(INT_VEC_GET(***_LEVEL)
 !中断处理程序和中断向量必须connect再enable后才能被激活,对x86使用sysIntEnablePIC(),对MIPS,ARM,PPC等使用intEnable()。
 !中断中不能含有会使中断阻塞的函数接口。(例如printf就不行,使用logMsg)
 
9.Timer
 vxWorks使用3个timer,分别用于系统时钟,辅助时钟和时标。
 Timer0:用于系统时钟(system clock),可用sysClkRateSet()改变速率,默认值时60次/秒。
 !vxWorks下的watchdog基于timer0,因为是在interrupt尺度,使用必须谨慎,否则会降低系统效率。
Timer1:用于辅助时钟(auxiliary clock),在bsp.h中定义了最大速率,最小速率和实际速率初始值。可用sysAuxClkRateSet()改变速度。用sysAuxClkConnect()定义辅助时钟的定时任务。
Timer2:用于时标(timestamp)。从系统开始运行时就一直递增,可以用来获得系统运行时间,在windview工具中被使用。用户程序也可以通过sysTimestamp()得到运行时间。

10.*.o,*.out,vxWorks
 一个板子跑起来之后可以有多个*.o和*.out(类似于window下的应用程序)和有且仅有一个的vxWorks(类似于window操作系统),但这些*.o和*.out的编译必须和vxWorks基于同一种cpu。
 !bootrom在启动时被部分复制到ram里在运行,这一部分将下载vxWorks到ram,然后跳转到vxWorks入口处运行,然后vxWorks将这一部分的bootrom重新划分到系统池。

11.符号表(symbol table)
 符号表就是一个数组,定义了函数和全局变量跟他们的地址的对应关系,默认情况下符号表放在主机上,如果定义了standalone symbol table,则目标机上也有一份符号表,一般与target shell绑定使用。

12.一些配置
 pci的配置默认使用自动配置,如果要手工配置,必须定义pci configuration
 键盘和显示器的驱动归入串口部分,默认输入输出是显示器和键盘,可以重定向到串口。

13.使用watchdog产生周期性调用例程
主程序:watchdog(func,param,tick)
被watchdog调用的程序:func(param)
     {
      watchdog(func,param,tick);
      ……
     }

14.任务切换速度:us量级,Cache关闭时上升到10us量级。
 例如对于x86,233Mhz,cache打开,中断响应典型值3.5us。其中c function挂接0.7us,中断推出+task重调度2.5us

15.tornado文件结构
用户主要需要目录:
 tornado/host:tcl控制语句、主机上运行的exe
 tornado/docs:帮助文件,其中的books.html提供总览
 tornado/target:头文件,库文件,bsp
修改bsp主要修改target目录下的文件,bsp的修改影响到bootrom和vxworks两部分,下面介绍的是使用工程方法建立的bootrom和vxWorks.

16.bootrom的启动顺序和源码位置
函数: romInit    romStart    usrRoot    CMDLoop
文件: <bsp/romInit.s>    <all/bootInit.c>  <al/bootConfig.c>      <all/bootConfig.c>
其中bootInit.c和bootConfig.c会用到sysLib.c中的一些函数,这些函数使一些通用接口,它们调用scr/config(简称S/C)下的usr***.c和scr/drv/(简称DD)下的一些程序。
DD下面的就是device driver,它们的链接方式有两种:
 <1>被bootConfig.c和sysLib.c等直接#i nclude
 <2>目录下自带makefile,用cmd命令在目录下键入make,函数进入系统库
usr***.c:配合宏使用的链结方式,直接#i nclude
!如果修改含有makefile文件的目录下的*.c文件,必须重新make,否则系统库没有更新。
!特殊修改推荐将文件拷到bsp目录下,加入工程或者#i nclude
!如果设备供应商只提供*a或*.o而不提供源码,那么在makefile中加入LIB_EXTRA=**.a或MACH_EXTRA=**.o。*.o是无条件链接,而*.a库是有条件链接,只有在用到了库中的函数接口时,才会被链接。

17.vxWorks启动顺序和源码位置
函数: sysInit    usrInit    usrRoot    usrAppInit
文件: <bsp/sysALib.s>       <usrProj/prjConfig.c> <usrProj/prjConfig.c>    <usrProj/usrAppInit.c>
 prjConfig.c引用usr***.c,目录是target/config/comps/src(简称C/S,!不是bootrom调用的同名函数)
 图 形界面下的初始配置来自bsp的config.h和makefile,在工程建立的时候系统会自动完成此工作,编译使系统会根据图形界面下的配置自动生成 prjparam.h和prjComps.h来保存选中的组件和配置参数。此后配置的改动将通过prjConfig.c和这两个.h文件反映,再修改 config.h不会对vxWorks的生成起作用。对上面三个文件的手工修改也会被系统自动覆盖。系统同时还在usrProj下自动生成 makefile,同样不能通过对文件的直接修改达到更新目的。

18.vxWorks的数据分类
 Text  常数
 Data  函数体外部被初始化了的变量(包括只能在本文件内使用的LOCAL型变量)
 Bss  函数体外部没有被初始化的变量,拷贝vxWorks使不需要被拷贝,系统划出一定空间后统一置为零。
 Stack 函数体内变量,包括root_stack(启动时需要的堆栈)、isr_stack(中断堆栈)和任务堆栈,前面两个可以在工程下定义,后面一个在发起任务时由程序指定,来源于系统池。
 Pool 系统池,由malloc取用
 TCB Task Control Block,任务参量

19.编译
 Tornado 采用gnu make作为编译工具,编译时必须注意以下三个地方保持一致:cpu起始地址,源码编译时的起始地址,相关搬运算法使用的地址。也就是说要注意 makefile和config.h中下面宏定义的一致 性:RAM_HIGH_ADRS,RAM_LOW_ADRS,ROM_TEXT_ADRS,ROM_SIZE

20.编译技巧
在build propertyc/c++ complier中加上-S,就可以生成.s而不是.o文件,在.s文件中可以清楚地看到data段,text段等。
加上-Dmacro=XXX,编译系统就会定义这个宏。
使用ar –crusv 可以将.o加入.a,例如:arppc  –crusv  lib文件位置  *.o
使用ar –t [>text.txt] 可以列出库文件里面包含的.o模块,并重定义输出到text.txt
nm用来生成符号表,例如:nmppc -–numeric–sort vxWorks用来按地址排列vxWorks的符号表

20.修改MMU
 如果使用MMU,必须修改sysLib.c中的全局MMU映射表:PHYS_MEM_DESC sysPhysMemDesc,内容为: {{地址1,地址2(= = 地址1),长度,屏蔽,读写权限及cache允许或禁止}, ……}
 ! 当RAM同时被两段或两段以上的总线操作(例如有cpu2,dsp,pci设备等),则不能设为cacheAble,否则会因为cache使ram不能及 时更新而出错。否则,在cpu发数据到pci设备时,先写再flush;pci设备发数据到cpu时,先invalidateCache()的相应部分, 然后再写。
 !pci设备必须加入MMU映射表。

21.从串口下载vxWorks需要的修改
在config.h中加入:
#undef INCLUDE_TSFS_BOOT  /*tsfs启动*/
#define INCLUDE_TSFS_BOOT
#undef  TTY_CONSOLE
#define  TTY_CONSLE    0  /*重定向输入输出到串口0*/
#undef  WDB_TTY_CHANNEL
#define WDB_TTY_CHANNEL 1 /*调试串口为串口1*/
#undef WDB_TTY_RATE
#define  WDB_TTY_RATE  57600 /*串口波特率*/
bootline设置为:
"tsfs (0,0)chengjy:/tgtsvr/vxWorks h=202.38.78.76 e=202.38.78.189 u=test189 pw=test"

22.PCI网卡的初始化
 <1>sysHwInit中对PCI初始化,sysHwInit2中打开中断
 <2>confignet.h中的endDevTbl的初始化,定义***_LOAD_FUNC
 <3>提供源码或.o方式的驱动

23.定时轮询的实现方法
 <1> for(;;){do…;taskDelay(10)};
 <2>watchdog
 <3>auxClock

24.驱动的三层模式
以 串口为例:底层是与硬件直接相关的驱动(ppc860sio.h),中间层提供从硬件相关到硬件无关的函数封装(sysSerial.c),最后在 sysLib.c中提供上层要调用的初始化函数(就是在sysHwInit()中调用sysSerial.c中封装好的 sysSerialHwInit())。
在实际的启动流程中通过ttyDevCreate()打开文件”/tyCo”,之后就可以通过文件系统的open,read,write来对串口操作了。

个人前几年学习Vxworks时,整理的笔记,总给大家了。 1 基于硬盘启动的Vxworks环境搭建 3 2 Vxworks引导盘制作 6 2.1 通过DOS加载VxWorks方法 6 2.2 Bootrom三种类型 7 2.3 VxWorks映象 7 2.4 Bootrom.sys最快制作方法 8 2.5 从网络引导 8 2.6 从本地硬盘引导 9 2.7 制作bootrom文件 9 2.8 Bootrom编译步骤 11 2.9 用BSP生成Bootable工程(即我们的程序文件) 12 2.10 FTP Server下载VxWorks 14 3 Tornado调试环境的建立 17 3.1.1 配置文件config.h 17 3.1.2 网络连接 18 6 从主机搭接(attach)到目标机 21 7.1.3 串口连接 21 4 4.Config.h文件注释说明 22 4.1 启动行说明 #define DEFAULT_BOOT_LINE \: 22 4.2 Config.h 文件说明 23 4.3 启动参数结构体 BOOT_PARAMS 35 4.4 booting过程介绍,比较详细 38 5 sysClkRateGet();返回系统时钟每秒的tick数量, tick详解 43 6 中断应用设计要点 44 7 驱动程序设计 49 8 缩短vxworks的启动时间 51 9 调试篇 54 10 驱动编程步骤 54 10.1 将驱动程序增加到“系统驱动程序列表”中 54 10.2 将设备增加到“系统设备列表”中 55 10.3 打开设备,得到文件描述符 55 10.4 SELECT机制的使用 55 10.4.1 select( )函数翻译 57 11 VxWorks系统的网络驱动(END) 60 12 VXworks操作系统中信号量用于多任务同步与互斥的讨论 62 12.1 二进制信号量实现互斥和同步 64 12.1.1 互斥的实现: 64 12.1.2 同步的实现: 65 12.2 互斥信号量 67 13 Tornado的文件目说明录 68 14 Shell 内置命令说明 72 14.1 任务管理 72 14.2 任务状态信息 72 14.3 系统修改和调试 73 14.4 对象命令( WindSh Commands for Object Display ) 73 14.5 WindShell and Browser, Shell 命令 74 15 驱动篇 81 16 中断篇 83 16.1 中断服务程序ISR编写注意事项 83 16.2 中断号与中断向量的转换 83 16.3 安装中断服务程序 intConnect() 83 16.4 调试中断服务程序方法 84 17 mkboot批处理命令详细解释 84 18 MakeFile 说明 85 19 VxWorks5.4中的输入输出重定向 89 19.1 vxworks屏幕输出, 一般来说用printf都是串口/shell输出,串口输出就可以到屏幕上了? 89 19.2 20.2 VxWorks中针对X86开发时标准输入输出的重定向? 90 20 怎样加入外部.o文件? 92 21 如何在Vxworks中使用 cd ,pwd , ls 命令:启用File System and Disk Utilities组件(INCLUDE_DISK_UTIL),可在shell下用pwd/cd/ls等命令 93 22 Error: image is larger than 524288 bytes 94 23 proxyArpDefaultOn()未定义解决方法? 94 24 如何将VxWorks的系统定时间隔或系统Ticks设置为1ms????? 95 25 read/write、fread/fwrite、fopen/open有什么区别 96 26 快速启动??????????????? 100 27 启动时报ATA0a和硬盘启动相关问题 100 28 如何安装USB2.2新版本及编译USB驱动? 101 29 WindML、图形界面相关问题 102 29.1 WindML,ugldemo出错? 102 29.2 5101 VxWorks黑屏问题? 102 29.3 添加ugldemo.c后,编译报undefined reference to “ugltextdraw” 错误一大堆? 102 29.4 WindML 中文字库显示? 103 30 VxWork6.8相关问题 105 30.1 ELF和bin文件的区别? 105 30.2 diab和GNU的区别? 106 31 No such file or directory错误? 107
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值