📄 vxworks faq.txt
字号:
能否具体描述一下当VxWorks收到外部中断信号时是怎么调用中断服务程序的?据说是在MUX层实现的,正
确否?
不同的cpu处理不一定相同,你是不是说网络设备的中断处理?(by superme )
是这样的,比如对于一个网络设备,物理层和MAC层分别由不同的CPU处理,两个CPU之间的通信机制是靠
共享内存,当物理层的消息要发往MAC层的时候就先给MAC发一个中断,MAC的CPU收到中断后就要调用相应
的ISR,可我现在只能看到MAC的ISR是在intConnect()函数里被调用,然后就看不到什么了,(我没有物理
层的程序,只有MAC层的程序)我就是想知道当一个外部中断来了以后VxWorks是如何处理的,如何调用ISR
的。据说是在MUX层里把中断号跟ISR捆绑在一起的,可我又没找到确切证据。哪位大侠给指点一下?
不胜感激!(by moonlight )
终于有个大侠给我回复了这个问题,我将之贴出来与大家共享:
外部中断产生时,处理流程是:
>1。根据CPU内部寄存器的中断允许位决定是否响应;
>2。x86CPU根据总线上的中断号查找中断向量表,得到中断向量;
> PowerPC只有一个外部中断0x500,跳到0x500处执行;
>3。CPU进入中断处理,执行的是操作系统预先安装的一个stub程序,
> stub负责保存中断现场等工作,然后调用intConnect()时所
> 安装的ISR;对于PowerPC,stub调用的是BSP中断控制器驱动程序的
> 一个函数,这个函数查询中断控制器的寄存器,得到中断号,
> 再去查找中断向量,得到的中断向量就是intConnect()安装的
> 函数;
>4。调用ISR。返回后,stub继续执行,恢复中断现场。结束中断。
>
>对于END driver,它有函数xxEndLoad()和xxEndStart()。
>MUX则有函数muxDevLoad()和muxDevStart()。系统(BSP)在
>初始化的时候调用过程是:
> muxLibInit();
> muxDevLoad(xxEndLoad,...);
> muxDevStart(pXxEndObj);
>
>在muxDevLoad()时,会调用到xxEndLoad,并通过字符串传递参数,
>xxEndLoad初始化一个END设备;
>在muxDevStart()时,会调用到xxEndStart,在xxEndStart里会
>进行intConnect, intEnable等工作。
>
>过程是这样的。严格来说,并不是在mux层的代码里链接中断,而是
>在END driver中完成的。mux并不和任何硬件直接联系。
(by moonlight )
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中断,在ARM中FIQ中断永远高于IRQ,可能会导致IRQ中断不被执行。
在中断屏蔽寄存器INTMR1中屏蔽所有优先级高于该IRQ的FIQ,会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()
{
// TODO: 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
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
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和/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)中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -