加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

VxWorks 编程的几个误区

时间:2013-09-08  来源:123485.com  作者:9stone

【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的情况,你还能怎么办呢?方向盘附近有个显示面板,倒可以在上面打印:“内存不足,请关闭部分任务或稍后再试!”可能开车子的还没有看到这个提示就已经车毁人亡了。


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门