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

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

常见的是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);//释放。

 

 

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

 

 


 


 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值