問題已解決:
原因是函數的調用方式與WinIO中不一致,使用的時候漏掉了__stdcall。
? ? ? 函數原定義為:
? ? ?
?
在實際的GPIO讀寫中遇到以下問題:
SetPortVal可正常寫入,但是GetPortVal無法讀取,程序崩潰,問題事件名稱:BEX, 具體原因正在調查。
?
?
以下內容為參考:
使用WinIO庫實現保護模式下的IO和內存讀寫
?
本篇文章主要介紹了"使用WinIO庫實現保護模式下的IO和內存讀寫(_inp,_outp) ",主要涉及到使用WinIO庫實現保護模式下的IO和內存讀寫(_inp,_outp) 方面的內容,對于使用WinIO庫實現保護模式下的IO和內存讀寫(_inp,_outp) 感興趣的同學可以參考一下。
?
使用WinIO庫實現保護模式下的IO和內存讀寫(_inp,_outp)
在WindowsXP等NT內核的操作系統中,#include?"conio.h"中定義的端口讀寫函數_inp,_outp已經不能直接使用了,這是因為Window的保護模式不允許對IO直接進行直接操作。但是在工業控制領域,對IO的讀寫是最基本的操作,尤其是對ISA總線或并口這類固定地址的存儲設備的訪問,我們必須能夠高效的進行IO讀寫來進行數據采集。
這里給出的解決方案是使用http://www.internals.com/提供的解決方案,即使用其網站上的WinIO.dll。其關鍵在與InitializeWinIo()函數調用之后,_inp,_outp函數可以被成功調用,在使用結束后再調用ShutdownWinIo()即可。
需要注意的是在程序運行的目錄下必須要有Wio.dll,Wio.sys和Wio.vxd。也就是說我們調用WinIO庫來實現IO讀寫實質上是在調用一個驅動,只有驅動級別的可執行文件才能解除保護模式(可能是進入了內核模式),實現對IO的直接讀寫。