19,502
社区成员
发帖
与我相关
我的任务
分享
struct ISRData
{
HANDLE hThread;
DWORD sysIntr;
HANDLE hEvent;
DWORD threadID;
};
ISRData thisISR;
.....
case ON_Thread_Check: //开启中断线程
EnableEINT45();
if(!isInThread)
{
thisISR.hThread=CreateThread(0, 0, (LPTHREAD_START_ROUTINE) ThreadProc, (LPVOID)pOutBuf, 0, &(thisISR.threadID));
if(thisISR.hThread==0)
OutputDebugString(L"LED creat thread fail.\n");
}
else
OutputDebugString(L"A thread is running.\n");
break;
中断线程如下:
DWORD WINAPI ThreadProc(PVOID lParam)
{
isInThread=true;
OutputDebugString(L"Is in thread.\n");
thisISR.hEvent=CreateEvent(NULL, FALSE, FALSE, NULL);
int irq=IRQ_EINT5;
if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &irq, sizeof IRQ_EINT5, &(thisISR.sysIntr), sizeof thisISR.sysIntr, NULL))
{
OutputDebugString(L"Kernel distributes interrupt fail.\n");
}
if (!(InterruptInitialize(thisISR.sysIntr, thisISR.hEvent, 0, 0)))
RETAILMSG(1, (TEXT("ERROR: LED:Connect Interrupt to event fail.\n")));
else
RETAILMSG(1, (TEXT("LED:Connect Interrupt to event success.\n")));
for (;;)
{
RETAILMSG(1, (TEXT("Waiting for interrupt..................................\n")));
WaitForSingleObject(thisISR.hEvent, INFINITE);
if(!isInThread)
{
RETAILMSG(1, (TEXT("Thread has aborted.\n")));
break;
}
OutputDebugString(L"I have got the interrupt.\n");
InterruptDone(thisISR.sysIntr);
//int* pOutBuf=(int*)lParam;
//*pOutBuf = v_pIOPregs->GPNDAT; //输出给上层参数
OutputDebugString(L"WriteBuffer.\n");
}
RETAILMSG(1, (TEXT("I am out of the loop.\n")));
//取消IRQ与SYSINTR之间的关联
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&thisISR.sysIntr, sizeof(UINT32),NULL,0, NULL);
//取消Event与PwrButtonSysIntr之间的关联
InterruptDisable(thisISR.sysIntr);
CloseHandle(thisISR.hEvent);
RETAILMSG(1, (TEXT("Led Interrupt Thread Exit.\n")));
isInThread=false;
return 0;
}
//第一步:声明API
//创建或打开对象,并返回一个可被对象访问的句柄
[DllImport("coredll.dll",EntryPoint="CreateFile")]
private static extern IntPtr CreateFile
(
string lpFileName,//文件名
uint dwDesiredAccess,//访问模式
uint dwShareMode,//共享模式
uint lpSecurityAttributes,//SD
uint dwCreationDisposition,//如何创建
uint dwFlagsAndAttributes,//文件属性
uint hTemplateFile//文件模板句柄
);
//对设备执行指定的操作,访问设备驱动程序
[DllImport("coredll.dll", EntryPoint = "DeviceIoControl")]
private static extern int DeviceIoControl
(
IntPtr hDevice,//设备句柄
int dwIoControlCode,//设备控制选项,带有 FSCTL_ 前缀的常数
IntPtr lpInBuffer,//设备控制选项,具体取决于dwIoControlCode参数
uint nInBufferSize,//输入缓冲区的长度
IntPtr lpOutBuffer,//设备控制选项,具体取决于dwIoControlCode参数
uint nOutBufferSize,//输出缓冲区的长度
ref int lpBytesReturned,//实际装载到输出缓冲区的字节数量
IntPtr lpOverlapped//重叠指针
);
//对设备执行指定的操作,关闭设备驱动程序
[DllImport("coredll.dll", EntryPoint = "CloseHandle")]
private static extern int CloseHandle
(
IntPtr hDevice//设备句柄
);
//GPIO控制
public void ConectGPIO()
{
int bytesReturned = 0;
int controlCode = 0x04001180;
DeviceIoControl(gpioDriver, controlCode, IntPtr.Zero, 2, GlobalVariable.pointerBuffer, 0, ref bytesReturned, IntPtr.Zero);
}
void EnableEINT45(void)
{
v_pIOPregs->GPNCON&=~(0x3<<10);
v_pIOPregs->GPNCON|=0x2<<10;
v_pIOPregs->EINT0CON0|=0x7<<8;
v_pIOPregs->EINT0MASK&=~(0x1<<5);
v_pIOPregs->EINT0PEND=0x1<<5;
}