![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
6.2 Communication problems
6.3 中断(Interrupt)
6.3.1 VxWorks是如何调用ISR的?
能否具体描述一下当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下仿真运行,系统
提示异常发生。文件如下,哪位兄台可以提示一下? |
|