这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 嵌入式实时操作系统VxWorks下编程的几个误区(转)

共2条 1/1 1 跳转至

嵌入式实时操作系统VxWorks下编程的几个误区(转)

助工
2009-01-12 18:34:35     打赏

【1】tornado使用标准c语言吗?为什么没有提供inb(), outb()等函数?
tornado缺省使用gnu编译器,支持ansiiso c, c++,以及at&t语法汇编 (非intel)。由于c++很庞大,
而且在不断发展,所以有些标准c++的特征 可能gnu不支持(基本没有编译器支持所有c++特征)。程序
员一般只要 掌握常用部分就能编出不赖的程序了。 inb(),outb()是turbor cdos下的,不属于标准c。
tornado在bsp中 提供了相应的sysinbyte(),sysoutbyte()等函数,参考bsp下的sysalib.s。

【2】VxWorks下怎么访问a盘,c盘(pc机环境)?
a,c是m$对pc机设备的命名方式,目的是让傻瓜用户方便理解。 VxWorks下叫fd0和ata0。

【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】不用io函数,写汇编直接访问串口。
最好使用open()close(),read()write()访问串口。这样程序 不依赖于硬件,好移植。有人对移植性不
以为然,实际上老板们 都希望以前的程序不用改就能重用,尤其是老程序已经通过严格测试, 并经过
了实践检验。
如果你的程序没有移植性需求,可能的原因有:
- 程序太烂,不值得移植,不如重写;
- 程序太乱,且缺少文档,没办法移植;(可以让老板不敢炒你鱿鱼;))
- 产品在市场上惨败,公司已决定不再开发类似产品,可能要大规模裁员。
有人认为自己写专用驱动效率高,灵活。错了! 效率高是因为功能弱。为了让驱动和app交换数据,你
必须设计类似ring-buffer 的数据结构并使用信号量机制;为了支持同时监视多个串口,必须设计类似
select 的机制;必须管理所有串口的细节。最后发现,你不过是在从头发明轮子。
串口是一种古老而缓慢的通信方式,指望在它身上挤出一点效率,我看不出 有什么实际意义。如果速度
实在不够,也许你应该选用usb。 open()close()函数是c程序员都应该会用的,而专用驱动接口只有你
自己会用。 不要因为不会使用io函数,就牺牲多数人的灵活性以换取少数人的灵活性。 可能你对8250
或scc很熟,但别指望每个人都是。有可能在另外一种硬件环境下
的串口你也不懂。

【7】分不清fopen(),fread()和open(),read()的区别。
fwrite等是带缓冲的,最好别用在串口或音频等设备上。写串口的意思 是希望串口立即把数据发送出去
,而不是放在缓冲区中。另外,工作 在line_mode下的串口驱动本身就具有缓冲能力。

【8】反复查询标志变量以确定等待的事件或超时发生。 最没有效率的做法。尽量使用信号量、select
()或watchdog。 只有在特殊情况下,例如硬件不支持中断,或延迟一小段时间, 才有理由这样做。
【9】在程序中频繁调用malloc()free()。
桌面系统和嵌入式系统的一个很大区别是,桌面系统的user是人,人对系统实时性,稳定性要求相对并
不高。程序死机时,大不了 结束进程或重新关机开机。嵌入式系统的user基本上是大系统中 的其它部
分,实时性或稳定性不好会导致重要数据丢失,甚至发生 重大事故。卫星在天上飞时,如果系统瘫痪,
遥控系统都失灵了, 你总不能亲自爬上去关机开机吧。(不过象这种系统都有备份,出错时可以启动备
份系统)。
VxWorks是实时操作系统,并不表示你写的程序就一定是实时的。 malloc()free()非常灵活,但它每次
需要进行搜索算法,需要的时间 是不确定的。另外它导致内存碎片,导致性能下降或内存不足, 写得
差的程序还可能发生内存泄漏或悬空指针。
实时性要求高的应用,或多或少都会采用静态分配,即在程序中 事先定义好可能需要的全部变量,或者
在程序启动时一次分配好, 以后就不再分配释放了,或者是写专用的内存管理函数。 利用率和灵活性
是差了些,得到的是性能。
在风河公司的另一款基于osekvdx的操作系统osekworks中,你甚至 不能在程序中创建任务,分配资源。
所有都在编译前静态指定。 osekworks主要用于汽车工业。试想malloc()返回null的情况,
你还能怎么办呢?方向盘附近有个显示面板,倒可以在上面打印: “内存不足,请关闭部分任务或稍后
再试!”可能开车子的还没有 看到这个提示就已经车毁人亡了。



关键词: 嵌入式     实时     操作系统     VxWorks     编程     几个    

高工
2009-01-20 10:23:42     打赏
2楼

呵呵,写得不错,又学到新知识了。顶楼主一下。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]