'The exception Privileged instruction ' 是什么毛病??

zouzoumao 2005-09-05 10:32:31
pc104编程,有_outp操作。一运行就报这个错。

谢谢,非常着急!
...全文
464 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zouzoumao 2005-09-06
  • 打赏
  • 举报
回复
wuwu.............
谢谢大家,给分了哦。见者有份。
mituzhishi 2005-09-05
  • 打赏
  • 举报
回复
能不能贴一下代码?
firstdreamer 2005-09-05
  • 打赏
  • 举报
回复
最好贴出代码让大家看看
Jagen在路上 2005-09-05
  • 打赏
  • 举报
回复
to zouzoumao(走走猫~), 你的操作系统是32位,除了写驱动,没有办法了:(
本来在普通主板上0x3f0对应的是COM1,但是在PC104上却找不到,看来应该只有些驱动才行了!
wanguodu 2005-09-05
  • 打赏
  • 举报
回复
要写硬件端口或管理级寄存器只能在内核态下写。
mituzhishi 2005-09-05
  • 打赏
  • 举报
回复
没搞过这么复杂的东西.
zouzoumao 2005-09-05
  • 打赏
  • 举报
回复
操作系统是NT
请问除了写驱动外还有什么别的办法吗?
wanguodu 2005-09-05
  • 打赏
  • 举报
回复
大意是在用户模式下访问管理(内核)模式下的寄存器。如果你是在象Linux这种操作系统下开发设备驱动的话,你的驱动代码是不能在用户空间跑的,必须集成或动态加载在内核中方可正常运行。
zouzoumao 2005-09-05
  • 打赏
  • 举报
回复
谢谢各位的关注。代码如下。
这是用来给pc104设置watchdog timer的程序,基本完全是copy用户手册上给出的例程。有人说是访问了不该访问的寄存器导致的,需要虚拟一下,我可是一点也不知道该怎么做。。。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define IO_INDEX_PORT 0x3F0
#define IO_DATA_PORT 0x3F1
#define UNLOCK_DATA 0x87
#define LOCK_DATA 0xAA
#define DEVICE_REGISTER 0x07
void EnterConfigMode()
{
_outp(IO_INDEX_PORT, UNLOCK_DATA);
_outp(IO_INDEX_PORT, UNLOCK_DATA);
}
void ExitConfigMode()
{
_outp(IO_INDEX_PORT, LOCK_DATA);
}
void SelectDevice(unsigned char device)
{
_outp(IO_INDEX_PORT, DEVICE_REGISTER);
_outp(IO_DATA_PORT, device);
}
unsigned char ReadAData(short int reg)
{
_outp(IO_INDEX_PORT, reg);
return (_inp(IO_DATA_PORT));
}
void WriteAData(unsigned char reg, unsigned char data)
{
_outp(IO_INDEX_PORT, reg);
_outp(IO_DATA_PORT, data);
}
void SetWatchDogTime(unsigned char time_val)
{
EnterConfigMode();
SelectDevice(8);
//Set Register F2
//Set Watch-Dog Timer 1~ 256 steps
WriteAData(0xF2, time_val);
ExitConfigMode();
}


void main(int argc, char* argv[])
{
int time_value=0;
char *ptr;

if (argc == 1)
{ printf("\n Syntax: 3412WD [step] \n");
printf(" step range : 1 ~ 256 steps \n");
printf(" timer range: 0:16 ~ 127:16 (min:sec) \n");
return ;
}
if (argc > 1)
{
ptr = argv[1];
time_value = atoi(ptr);
}
if (time_value > 0 && time_value < 256)
{
SetWatchDogTime((unsigned char) time_value);
printf("Watch Dog reset Timer set up : %02d:%02d ",(time_value-1)/2,
((time_value-1)%2)*30+16);
}

}

单步执行的时候可以看到,就是在EnterConfigMode处走不下去了。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧