EVC应用程序实现IO中断流程。

来源:互联网 发布:mac安装ipa到手机 编辑:程序博客网 时间:2024/05/06 14:19

首先是映射物理地址了。应该都知道。

常见的是virtualalloc和virtualcopy,用完后需要virtualfree.

也可以使用:

PHYSICAL_ADDRESS potadress = {0x56000000 ,0};//根据需要自己定义自己的地址

(volatile IOPreg*)MmMapIoSpace(potadress, sizeof(IOPreg),FALSE);

释放使用:MmUnmapIoSpace((PVOID)gpio_base,sizeof(IOPreg));

然后操作是:配置具体io实现中断,然后通过开发板提供bsp的XXXIntr.h。找到对应的中断号

比如:

 UINT g_CAN_EINT = IRQ_EINT11; // Determined by 2440 board layout.
 UINT  g_CAN_SYSTR = SYSINTR_UNDEFINED;

然后申请中断

KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CAN_EINT, sizeof(UINT32), &g_CAN_SYSTR, sizeof(UINT32), NULL);//是驱动/应用程序和kernel通讯的一个接口函数,具体的调用意义是看该函数的IOCTRL是什么以及kernel中对应的处理函数(ioctrl table);当然需要判断是否执行成功。

然后创建event,将该事件与中断号绑定

 g_CAN_LISTEN_EVENT = CreateEvent(NULL, FALSE, FALSE, NULL);
(InterruptInitialize(g_CAN_SYSTR, g_CAN_LISTEN_EVENT, 0, 0))//也需要判断绑定成功与否。

然后就可以创建中断线程CreateThread

;;;WaitForSingleObject(g_CAN_LISTEN_EVENT, INFINITE) == WAIT_OBJECT_0

每次中断响应完后需要使用    InterruptDone(g_CAN_SYSTR);

释放的时候就需要做一下几步:

CloseHandle 中断线程(可以在创建线程后就执行)

CloseHandle  event

InterruptDisable g_CAN_SYSTR

 KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&g_CAN_SYSTR, sizeof(UINT32),NULL,0, NULL);//释放。

 

 

呵呵这是我的一次尝试,执行成功,估计还有不足,请大家指出!

 

 


 


 


 

原创粉丝点击