1
以下代碼存在問題。我需要它來訪問端口0x300到0x307,所以我這樣做:在嵌入式設備中使用ioperm()與端口進行通信
#ifdef LINUX
if(ioperm(PORT1,9,1)==-1) printf("Error in ioperm()");
#endif
其中PORT1 = 0x300。
然後我這樣做:
int j5inp(unsigned int addr){
#ifdef DOS
return inp(addr);
#endif
#ifdef LINUX
return inb(addr);
#endif
}
void j5outp(unsigned int addr, unsigned int val){
#ifdef DOS
outp(addr,val);
#endif
#ifdef LINUX
outb(val,addr);
#endif
}
/************/
hrd_check()
{
j5outp(PCHECK,0xAA);
if (j5inp(PCHECK)!=0xAA) return(0);
j5outp(PCHECK,0x55);
if (j5inp(PCHECK)!=0x55) return(0);
return(1);
}
其中P確認= 0x307。
我測試了這一點,我發現我能夠從端口檢索值0xAA我發送後,但第二個(0x55)失敗,因爲inb()仍然返回0xAA。
我做錯了什麼?這可能是硬件問題嗎?我應該嘗試調用Ioperm()函數爲每個調用inb()或者我應該嘗試使用iopl()?
順便說一下,我現在用的是板是研華PCM-3342
'inp(2)'手冊頁提到有'_p'變種會暫停,直到IO完成 - 您是否需要使用這些變種? (你不需要在每次使用時調用'ioperm()'或'iopl()' - 這些在進程的'thread_struct'中設置一個標誌。) – sarnold
你的意思是說inb在被調用時不會暫停?這是如何運作的?我嘗試的目的是將這個程序從DOS遷移到Linux。我需要通過訪問這些端口的方式來獲得與DOS中的函數inp()和outp()相同的性能。我會研究* _p函數,謝謝。 –
我將'_p'變體作爲註釋而不是回答,因爲我只是在黑暗中拍攝 - 但如果寫入IO端口需要一些時間,我不會感到驚訝,而outb_p() '會比'outb()'執行花費更長的時間,但是在等待輸出真正起作用之後,設備可能會用下一個'inb()'報告更新的值。大猜測,但希望很容易測試... – sarnold