Embedded 版 (精华区)
发信人: wanily (醉了酒的老鼠), 信区: Embedded_system
标 题: VxWorks FAQ(6)--OS
发信站: 哈工大紫丁香 (2003年03月28日20:55:14 星期五), 站内信件
6.1 C++ issues
6.1.100 请教Vxworks中类的用法:
我的程序中包含如下内容,编译时全通过,但下载时显示
Errors while downloading D:/Tornado/target/proj/simtest/SIMNTgnu/simfun.out:
___6mytest
__$_6mytest
请问各位高人如何处理.
extern"C" {
class mytest
{
public:
mytest();
~mytest();
int add(int x,int y)
{
return (x+y);
}
};
mytest tmyt;
}
A:一看你的文件名后缀是否为cpp(必须为小写) 去掉语句extern"C" ,文件后缀名改为.cp
p!
6.1.101 请教帮主c and c++,tornado支持c and c++ ,但当我用c++写好程序test.cpp,然
后想在
srAppinit.c中调用我写好的myFuc();时,不能编译通过。但我把test.cpp改成test.c后则
可以通过。这是
为什么?
A:文件后缀为.cpp时编译器会认为是C++文件,这样有些定义类型为C的函数在编译或下载
时不被认可。
解决方法是把这些不被认可的C类型函数用语句extern "C"说明一下为C函数就行了.
6.2 Communication problems
6.2.100 关于消息队列(Message Queues)
我知道用msgQReseive()从队列中接受信息,用msgQSend()向队列发送信息。但有两个问题
:
1. 接收到的和发出的是什么信息?
2. 如何接收,如何发送?
A:使用队列接收和发送消息前,要先创建一个队列,这个队列实际上是一个FIFO的管道。
发送任务从管道的
一端发送消息,需要取得消息的任务从另一端接收消息。其中msgQReceive是一个阻塞的系
统调用,当队列
中有消息时,函数调用取的消息。如果没有消息,则该任务处于等待消息的状态,直到接
收到消息,才继续
执行。(by bruin)
6.3 中断(Interrupt)
6.3.1 VxWorks是如何调用ISR的?
能否具体描述一下当VxWorks收到外部中断信号时是怎么调用中断服务程序的?据说是在MU
X层实现的,正
确否?
不同的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中断产生时,程序转到中断入口0x1
8处
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)
--
醉了酒的老鼠想吃猫
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.4]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.439毫秒