这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [转帖]VxWorks中文FAQ

共21条 2/3 1 2 3 跳转至
菜鸟
2006-11-27 02:47:00     打赏
11楼

6.3.2 请教中断问题,偶用ADS测试ARM中断式,当有IRQ中断产生时,程序转到中断入口0x18
0x00000018
B IRQ_Handler却不跳转到中断服务程序IRQ_Handler处,可能是什么原因请大侠指点!
注:中断已经enable
A
:这很有可能是中断和中断程序没有绑定在一起
再问:
偶程序里有一个Install_Handler不知道算不算是绑定,偶是菜鸟,请多多指点。谢谢!
unsigned Install_Handler (unsigned routine, unsigned *vector)

{ unsigned vec, oldvec;
vec = ((routine - (unsigned)vector-0x8)>>2);
if (vec & 0xff000000)
{
printf ("Installation of Handler failed");
exit(1);
}
vec = 0xea000000 | vec;
oldvec = *vector;
*vector = vec;
return (oldvec);
}
A
:用下面方法查一下
1)
确定一下是否中断发生,在中断发生时,查中断标志寄存器INTST1中相应的IRQ为是否置1
或用示波器量该IRQ管脚。有中断产生且中断enable,就应该执行相应的ISR
2)
如上面没有问题,仍不执行,再查一下是否有比该IRQ等级更高的中断持续发生屏蔽了该IRQ中断。
特别要注意一些FIQ中断,在ARMFIQ中断永远高于IRQ,可能会导致IRQ中断不被执行。
在中断屏蔽寄存器INTMR1中屏蔽所有优先级高于该IRQFIQ,disable这些FIQ.

希望这些对你有所帮助
6.4 LoadModule problems
6.5 pthreads
6.6 Reboot
6.7 Semaphores
6.8 Simulator
6.8.1 在simulator环境里如何模拟中断??
我想在simulator环境下,写一个ISR程序,但是无法模拟中断的产生。不知有何解决办法。
TIA (by wys205)
A:vxworks下的ISR程序:
参考我写的一个程序,另外需要另一个程序向simulator窗口发消息。
如果需要这个程序,请发mail。

#include "vxWorks.h"
#include "intLib.h"
#include "iv.h"
#include "taskLib.h"
#include "logLib.h"
#include "stdio.h"
#include "semLib.h"

void myISR(int);
void myTask();

SEM_ID myBinary;

#define MY_INUM 0xC011 /* Windows message, in fact */

/*-----------------------------------------------------------------------*/

void vxmain()
{
printf("inum = 0x%x, ivec = 0x%x\\n", MY_INUM, INUM_TO_IVEC(MY_INUM));

myBinary = semBCreate(SEM_Q_FIFO, SEM_EMPTY);

taskSpawn("tMyTask", 80, 0, 20000, (FUNCPTR)myTask,
0,0,0,0,0,0,0,0,0,0);

if (intConnect((VOIDFUNCPTR *)INUM_TO_IVEC(MY_INUM),
(VOIDFUNCPTR)myISR, 0) != OK)
perror("intConnect()");
}

/*-----------------------------------------------------------------------*/
void myISR(int param)
{
logMsg("task is %s\\n", (int)taskName((int)taskIdCurrent), 0, 0, 0, 0, 0);

semGive(myBinary);
}

void myTask()
{
int count = 0;

while (1) {
semTake(myBinary, WAIT_FOREVER);
printf("myTask: semaphore taken, count = %d\\n\\n", count++);
}
}

(by vxfree)

向simulator发送消息的程序:
哈哈,我已经试成功了,原来向simulator发送消息如此简单,请vxfree指正。
void CAboutDlg::OnButton1()
{
// TOD Add your control notification handler code here
HWND hwnd ;
hwnd= ::FindWindow(NULL,"VxWorks Simulator for Windows");

if(hwnd!=NULL)
::SendMessage (hwnd,0xC011,0,0);

}

(by wys205)
6.8.2 vxworks中文件操作异常区区最近正学vxworks,编译一例子,通过,在tornado下仿真运行,系统
提示异常发生。文件如下,哪位兄台可以提示一下?谢谢

.......
int teststdio()
{
char buffer[10];
char *tn = "tmpxxx"; //是不是这里的问题?
FILE *pf = NULL;
int result = 0;
/*fpos_t fp1;
long off;*/

/* opening a file for both reading and writing */

result += ASSERT((pf = fopen(tn, "w+")) != NULL);

/* closing the file */
result += ASSERT(fclose(pf) == 0);

/* reopening the file and attaching the standard input stream to the file */
result += ASSERT(freopen(tn, "r", stdin) == stdin);
.....
/


A:char *tn = "tmpxxx"; //是不是这里的问题?
你没指定文件所在的设备,
simNT环境里,一般设备为"host:"
所以格式为char *tn="host:/myFile";
(by wys205)

6.9 Task related items
6.10 Time/timer related items
6.11 Wind Web Server related items
6.12 Zinc/windML related items
6.13 Other items



菜鸟
2006-11-27 02:48:00     打赏
12楼
6.13.100 问一下在vxworks里面如何看ErrNo的解释, 谢谢
A:
-> printErrno(0x0001)
0x1 = S_errno_EPERM
value = 0 = 0x0
-> malloc(0x7fffffff)
value = 0 = 0x0
-> printErrno


0x110001 = S_memLib_NOT_ENOUGH_MEMORY
value = 0 = 0x0
(by vxfree)

6.14 VxWorks AE issues


6.15 I/O 操作
6.15.1 查看serial device的状态,又是异常!
文件如下,注释有它的说明,编译后,在shell输入:
-> pDevHdr = iosDevFind ("/tyCo/0",0)
Exception number 0: Task: 0x4bbc8e8 (t1)

General Protection Fault
Program Counter: 0x0041eba5
Status Register: 0x00010202

还是想得到各位兄台的指点,谢谢!
......
void tyShow
(
TY_DEV * pTyDev
)
{
/* read - ring buffer and semaphores */
printf ("Address of pTyDev->rdBuf = 0x%08x.\\n", &pTyDev->rdBuf);
printf ("Address of pTyDev->rdSyncSem = 0x%08x.\\n", &pTyDev->rdSyncSem);
printf ("Address of pTyDev->mutexSem = 0x%08x.\\n\\n", &pTyDev->mutexSem);

/* rdState */
printf ("pTyDev->rdState.xoff = 0x%02x.\\n", pTyDev->rdState.xoff);

printf ("pTyDev->rdState.pending = 0x%02x.\\n", pTyDev->rdState.pending);
printf ("pTyDev->rdState.canceled = 0x%02x.\\n", pTyDev->rdState.canceled);
printf ("pTyDev->rdState.canceled = 0x%02x.\\n", pTyDev->rdState.canceled);

/* write - ring buffer and semaphores */
printf ("Address of pTyDev->wrtBuf = 0x%08x.\\n", &pTyDev->wrtBuf);
printf ("Address of pTyDev->wrtSyncSem = 0x%08x.\\n\\n", &pTyDev->wrtSyncSem);

.....

A:
->buf=malloc(100)
->pDevHdr=iosDevFind("/tyCo/0", buf)
(by vxfree)


7.其它 FAQ
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


菜鸟
2006-11-27 02:54:00     打赏
13楼

--

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下的,不属于标准CTornado
BSP中提供了相应的sysInByte(),sysOutByte()等函数,参考BSP下的sysALib.s
(我看到前两年的2C语言还在考DOS操作。sigh 我担心B.Gate会考满分,而D.Ritchie不及格)

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)不用I/O函数,写汇编直接访问串口。
最好使用open()/close()read()/write()访问串口。这样程序不依赖于硬件,好移植。有人对移植性不以
为然,实际上老板们都希望以前的程序不用改就能重用,尤其是老程序已经通过严格测试,并经过了实践检
验。
如果你的程序没有移植性需求,可能的原因有:
-
程序太烂,不值得移植,不如重写;
-
程序太乱,且缺少文档,没办法移植;(可以让老板不敢炒你鱿鱼;)
-
产品在市场上惨败,公司已决定不再开发类似产品,可能要大规模裁员。

有人认为自己写专用驱动效率高,灵活。错了!
效率高是因为功能弱。为了让驱动和APP交换数据,你必须设计类似ring-buffer的数据结构并使用信号量机
制;为了支持同时监视多个串口,必须设计类似select的机制;必须管理所有串口的细节。最后发现,你不
过是在从头发明轮子。
串口是一种古老而缓慢的通信方式,指望在它身上挤出一点效率,我看不出有什么实际意义。如果速度实在
不够,也许你应该选用USB
open()/close()
函数是C程序员都应该会用的,而专用驱动接口只有你自己会用。不要因为不会使用I/O函数,
就牺牲多数人的灵活性以换取少数人的灵活性。可能你对8250SCC很熟,但别指望每个人都是。有可能在

另外一种硬件环境下的串口你也不懂。

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


菜鸟
2006-11-27 02:55:00     打赏
14楼

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 2rebuild All命令生成vxWorks,考到硬盘里通过bootrom.sys
启动vxWorks;vxWorks启动了,可我的应用没有。各位大侠,如何启动应用程序呢? 请指点。
小弟非常感谢!
: zhangjiaxue 02-8-21 18:09:18

Re:哪位大侠做过把应用绑定到vxWorks系统去 <--- 〖回复该帖子〗

1).在启动系统时启动用户定制的任务
假设有一个MultiTask.c的程序,该程序使用消息队列来传递不同task之间的消息,其中:taskInit
负责建立两个从task,监控和传递推出消息,并释放从进程需要的资源。
将此文件加入到制作vxworks的工程中(注意这里的MultiTask.c同样不能放在带空格的路径下),
修改usrAppInit.c,在开头加入:
extern void Init(void);
在函数结束前加入:
Init();
重新编译生成vxworks,重启目标机,可以看到任务自动执行。

2).关于usrconfig.c
有些帮助文件中提到可以修改c:\\tornado\\target\\config\\all\\usrconfig.c中的usrRoot函数来改变启动
画面和启动用户任务。但在vxworksfaq中提到:"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.hconfig.hdefineundefINCLUDE_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下供makefile使用。可以参
照下面vxWorks.st_rom的产生方法产生一个可以standalonevxWorks.st,也可以在tornado集成环境中选
toolsèoptionsèprojectèshow Tornado1.0.1 menu items(如果安装时选择使用tornado1.0,则这个选项
默认被选中),然后选择builtèstandard bsp buildsèpcPentiumProvxWorks.st,这两种方法生成的
vxWorks.st都在c:\\tornado\\target\\config\\bspname目录下。



菜鸟
2006-11-27 02:56:00     打赏
15楼
附录A.一些有用的连接
英文:

http://www.xs4all.nl/~borkhuis/vxworks/vxworks.html
(Johan Borkhuis
的个人主页,本文中的FAQ大部分来自于该站点)
http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&group=comp.os.vxworks
(VxWorks
最热的新闻组)
Electronic Engineers\' Toolbox http://www.eg3.com/real/vxworks.htm
BGSH: A VxWorks Shell With Command Line Editing http://www.xmission.com/~bgeer/bgsh.html
Dave Korns page about updating GCC for the PPC http://www.newgcc4vxworks4ppc.cjb.net/
Embry-Riddle VxWorks 5.3(Tornado) Real-Time Laboratory Experiments
http://www.rt.db.erau.edu/experiments/vx/toc/TableOfContents.html
Introduction into realtime systems http://www.eventhelix.com/RealtimeMantra/default.htm
Unofficial VxWorks FAQ, by Hwa Jin Bae, http://www.xs4all.nl/~borkhuis/vxworks/vxfaq.html
VxWorks Exploder mailing list http://www-csg.lbl.gov/vxworks/
WindRiver Systems http://www.wrs.com/
Development examples of some realtime systems. http://www.eventhelix.com/ThoughtProjects
Instructions on how to build the ACE library for VxWorks:
http://www.gum.de/it/download_documents.htm
Article on memory testing http://www.netrino.com/Articles/MemoryTesting/
Building NTP for VxWorks http://chard.tuc.noao.edu/mpg/ntp/ntp.to.vxworks.html
VxWorks Under Linux http://chard.tuc.noao.edu/mpg/vxworks/linuxHostingVx.html

菜鸟
2006-11-27 05:44:00     打赏
16楼
兄弟是好人啊 !!!

菜鸟
2006-11-28 07:28:00     打赏
17楼
楼上的兄弟,我是mm,不是兄弟哦[em07][em26]

菜鸟
2006-12-05 08:06:00     打赏
18楼
mm是好人呵呵加油传阿?想问问知道怎么在vxworks下调用BIOS中断服务程序吗?

菜鸟
2009-08-28 14:03:34     打赏
19楼
知道的顶!

菜鸟
2009-08-28 14:04:30     打赏
20楼
知道的顶!

共21条 2/3 1 2 3 跳转至

回复

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