Embedded 版 (精华区)
发信人: wanily (醉了酒的老鼠), 信区: Embedded_system
标 题: VxWorks FAQ(7)--Others
发信站: 哈工大紫丁香 (2003年03月28日20:56:18 星期五), 站内信件
7.1 Hard delay
7.2 Memory leaks
7.3 Corba engines
7.4 Web servers
7.5 NTP usage
7.6 Performace / Benchmarks
7.7 SNMP
7.8 Lint
7.9 Encryption
7.10 其它
7.10.1 VxWorks下编程的几个误区。(by vxfree)
1)Tornado使用标准C语言吗?为什么没有提供inb(), outb()等函数?
Tornado缺省使用GNU编译器,支持ANSI/ISO C, C++,以及AT&T语法汇编(非Intel)。
由于C++很庞大,
而且在不断发展,所以有些标准C++的特征可能GNU不支持(基本没有编译器支持所有C++特
征)。程序员一
般只要掌握常用部分就能编出不赖的程序了。inb(),outb()是Turbor C/DOS下的,不属于
标准C。Tornado在
BSP中提供了相应的sysInByte(),sysOutByte()等函数,参考BSP下的sysALib.s。
(我看到前两年的2级C语言还在考DOS操作。sigh 我担心B.Gate会考满分,而D.Ritchie不
及格)
2) VxWorks下怎么访问A:盘,C:盘(PC机环境)?
A:,C:是M$对PC机设备的命名方式,目的是让傻瓜用户方便理解。 VxWorks下叫/fd0和/at
a0。
3)目标机没有键盘和显示器,printf()打印到哪里去了?
打印到标准输出设备上了。至于标准设备是什么,如果你用PC终端,就到屏幕上;否则
到系统中第一个串
口去;还有可能被重定向到别的设备上了,比如磁盘文件或telnet端口。如果什么都没有
,打印的字符串被
丢弃。
C语言中,3个标准设备的文件描述符为STD_IN, STD_OUT, STD_ERR;文件指针为stdin,
stdout, stderr;
C++中有cin, cout, cerr对象。
4) 怎么在VxWorks下用(段:偏移地址)方式访问端口?
VxWorks for X86工作在保护模式下,应用程序不用关心段的存在。直接用线性地址访问即
可,例如:
*(unsigned short *)0xb8000 = 0xAA55; 可以访问Video RAM。
(8086,DOS真是害人的玩艺儿,是不是现在大学里还在教)
5) 在中断服务程序(ISR)中调用printf()打印调试信息。
程序死机是正常的,没有烧坏硬件算幸运的了。VPG里规定了哪些函数是可以调用的。关键
是printf()会引
起任务阻塞,而中断不是任务。可以用logMsg()。
6)不用I/O函数,写汇编直接访问串口。
最好使用open()/close(),read()/write()访问串口。这样程序不依赖于硬件,好移植。
有人对移植性不以
为然,实际上老板们都希望以前的程序不用改就能重用,尤其是老程序已经通过严格测试
,并经过了实践检
验。
如果你的程序没有移植性需求,可能的原因有:
- 程序太烂,不值得移植,不如重写;
- 程序太乱,且缺少文档,没办法移植;(可以让老板不敢炒你鱿鱼;))
- 产品在市场上惨败,公司已决定不再开发类似产品,可能要大规模裁员。
有人认为自己写专用驱动效率高,灵活。错了!
效率高是因为功能弱。为了让驱动和APP交换数据,你必须设计类似ring-buffer的数据结
构并使用信号量机
制;为了支持同时监视多个串口,必须设计类似select的机制;必须管理所有串口的细节
。最后发现,你不
过是在从头发明轮子。
串口是一种古老而缓慢的通信方式,指望在它身上挤出一点效率,我看不出有什么实际意
义。如果速度实在
不够,也许你应该选用USB。
open()/close()函数是C程序员都应该会用的,而专用驱动接口只有你自己会用。不要因为
不会使用I/O函数,
就牺牲多数人的灵活性以换取少数人的灵活性。可能你对8250或SCC很熟,但别指望每个人
都是。有可能在
另外一种硬件环境下的串口你也不懂。
7)分不清fopen(),fread()和open(),read()的区别。
fwrite等是带缓冲的,最好别用在串口或音频等设备上。写串口的意思是希望串口立即把
数据发送出去,而
不是放在缓冲区中。另外,工作在LINE_MODE下的串口驱动本身就具有缓冲能力。
8)反复查询标志变量以确定等待的事件或超时发生。
最没有效率的做法。尽量使用信号量、select()或watchdog。只有在特殊情况下,例如硬
件不支持中断,或
延迟一小段时间,才有理由这样做。
9)在程序中频繁调用malloc()/free()。
桌面系统和嵌入式系统的一个很大区别是,桌面系统的user是人,人对系统实时性,稳
定性要求相对并不
高。程序死机时,大不了结束进程或重新关机开机。嵌入式系统的user基本上是大系统中
的其它部分,实时
性或稳定性不好会导致重要数据丢失,甚至发生重大事故。卫星在天上飞时,如果系统瘫
痪,遥控系统都失
灵了,你总不能亲自爬上去关机开机吧。(不过象这种系统都有备份,出错时可以启动备
份系统)。
VxWorks是实时操作系统,并不表示你写的程序就一定是实时的。malloc()/free()非常
灵活,但它每次需
要进行搜索算法,需要的时间是不确定的。另外它导致内存碎片,导致性能下降或内存不
足,写得差的程序
还可能发生内存泄漏或悬空指针。
实时性要求高的应用,或多或少都会采用静态分配,即在程序中事先定义好可能需要的
全部变量,或者在
程序启动时一次分配好,以后就不再分配/释放了,或者是写专用的内存管理函数。利用率
和灵活性是差了些
,得到的是性能。
在风河公司的另一款基于OSEK/VDX的操作系统OSEKWorks中,你甚至不能在程序中创建任
务,分配资源。所
有都在编译前静态指定。OSEKWorks主要用于汽车工业。试想malloc()返回NULL的情况,你
还能怎么办呢?
方向盘附近有个显示面板,倒可以在上面打印:
"内存不足,请关闭部分任务或稍后再试!"可能开车子的还没有看到这个提示就已经车毁
人亡了。
7.10.2 各位大侠: 我的程序写好了,系统如何启动我的应用程序。tornado 2 帮助里有
这一段:
Linking the application with VxWorks is really a two-step process. You must
add an entry point
to the application in usrConfig.c, and you must modify the makefile to link
the application
statically with VxWorks.
To start your application during system initialization, add code to the
usrRoot( ) routine in
usrConfig.c. You can call application initialization routines, create
additional I/O devices,
spawn application tasks, and so on, just as you do from the Tornado shell
during development.
An example is provided in usrConfig.c. This file includes and initializes a
simple demo if the
preprocessor constant INCLUDE_DEMO is defined in one of the configuration
files. In that
situation, usrRoot( ) spawns usrDemo( ) as a task as the last step in booting
the system. You
can simply insert the appropriate initialization of your application after
the conditional
code to start the demo. For example:
/* spawn demo if selected */
#if defined(INCLUDE_DEMO)
taskSpawn ("demo", 20, 0, 2000, (FUNCPTR)usrDemo, 0,0,0,0,0,0,0,0,0,0);
#endif
taskSpawn ("myMod", 100, 0, 20000, (FUNCPTR)myModEntryPt,
0,0,0,0,0,0,0,0,0,0);
To include your application modules in the bootable system image, add the
names of the
application object modules (with the .o suffix) to MACH_EXTRA in Makefile.
For example, to
link the module myMod.o, add a line like the following:
MACH_EXTRA = myMod.o
...
Building the system image with the application linked in is the final part of
this step. In
the target directory, execute the following command:
make vxWorks
按上面的步骤,我用tornado 2的rebuild All命令生成vxWorks,考到硬盘里通过bootrom
.sys
启动vxWorks;vxWorks启动了,可我的应用没有。各位大侠,如何启动应用程序呢? 请指
点。
小弟非常感谢!
※ 作 者: zhangjiaxue 02-8-21 18:09:18 ※
Re:哪位大侠做过把应用绑定到vxWorks系统去 <--- 〖回复该帖子〗
1).在启动系统时启动用户定制的任务
假设有一个MultiTask.c的程序,该程序使用消息队列来传递不同task之间的消息,其中
:主task为Init,
负责建立两个从task,监控和传递推出消息,并释放从进程需要的资源。
将此文件加入到制作vxworks的工程中(注意这里的MultiTask.c同样不能放在带空格的
路径下),
修改usrAppInit.c,在开头加入:
extern void Init(void);
在函数结束前加入:
Init();
重新编译生成vxworks,重启目标机,可以看到任务自动执行。
2).关于usrconfig.c
有些帮助文件中提到可以修改c:\tornado\target\config\all\usrconfig.c中的usrRoot
函数来改变启动
画面和启动用户任务。但在vxworks的faq中提到:"Tornado2.0不使用usrconfig.c,而是用
target\config\comps下的 configulettes,如果需要使用usrconfig,必须"make"
c:\tornado\target\config\pentiumpro下的makefile文件。事实上,在帮助文件里大量地
提到了修改
usrconfig,例如在不通过网络而是从rom启动vxworks,使用flash ram等。
实际上就tornado2.0来说,分为两种情况:
<1>用户自己建立的bootable image
这时不使用usrconfig,用户通过对工程可视化的修改,就可以裁减内核。如果在project
里面去掉了默认
的dependence,可以看到target\config\comps下的一些*.c,*.h文件其实是被引用的。通
过对它们的修改,
可以起到类似于修改usrconfig.c的作用,编译时使用的是系统自动在工程所在目录下产生
的makefile,
对这个makefile的修改将不会产生作用。
<2>系统默认的bootable image
这时使用安装时自带usrconfig。用于通过对configAll.h和config.h中define或undef宏IN
CLUDE_XXX来
裁减内核。这时对启动化面的修改是通过对usrconfig.c的修改实现的。用户定制任务如下
实现。: 在
#else
#if defined(INCLUDE_DEMO) /* create demo w/o shell */
taskSpawn ("demo", 20, 0, 2000, (FUNCPTR)usrDemo, 0,0,0,0,0,0,0,0,0,0);
#endif /* mips cpp no elif */
#endif /* INCLUDE_SHELL */
后面添加
taskSpawn("tInit", 1, 0, 10000, (FUNCPTR)Init, 0,0,0,0,0,0,0,0,0,0);
这里使用的是c:\tornado\target\config\bspname下的makefile。
定制任务还需要在makefile里添加:
MACH_EXTRA = MultiTask.o
这个MultiTask.o是在另外一个downloadable application project里编译产生的。这个
project里仅含有
一个MultiTask.c,将MultiTask.o拷贝到c:\tornado\target\config\bspname下供makefil
e使用。可以参
照下面vxWorks.st_rom的产生方法产生一个可以standalone的vxWorks.st,也可以在tornad
o集成环境中选
择toolsèoptionsèprojectèshow Tornado1.0.1 menu items(如果安装时选择使用torn
ado1.0,则这个选项
默认被选中),然后选择builtèstandard bsp buildsèpcPentiumPro、vxWorks.st,这两
种方法生成的
vxWorks.st都在c:\tornado\target\config\bspname目录下。
--
醉了酒的老鼠想吃猫
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.4]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.806毫秒