C#建立GPIO类事件怎么与驱动中的中断事件联系起来

yangjidi1985 2012-10-12 08:46:49
最近在学习wince,使用的是三星s3c6410开发板。要用C#建立一个GPIO的类与wince驱动联系起来,能够采集响应IO口的外部中断。
现在驱动层通过如下代码能够完成执行中断处理函数:
在GPIO_IoControl里面的中断函数代码:
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;
}

在应用层用C#建立一个GPIO的类,现在能够通过DeviceIOControl实现GPIO的输入输出和中断控制,但是一直不知道怎么采集上面的中断事件,希望有知道的前辈能够指点下。
另外对这部分驱动代码有有两点不明白的地方,也顺便请教一下:
1、传说中中断响应的ISR函数和IST函数分别对应上面程序的哪一段?
2、在应用层用C#建立的中断事件和thisISR.hEvent是什么关系?
...全文
299 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangjidi1985 2012-10-19
  • 打赏
  • 举报
回复
谢谢楼上的了。
那个源程序封装了控制GPIO的电平控制。
但是如果要在界面上用C#采集上升沿和下降沿就不太方便了,如果不和驱动中断相连的话定时扫描不方便啊。

我就想用C#建立个事件,上升沿执行事件处理程序。
yangjidi1985 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
[c#]wince平台下的GPIO接口使用测试程序

用C#控制TQ2440开发板上的LED小灯(C# GPIO学习笔记) .

希望能有帮助
[/Quote]

先看看,谢谢
woshi_ziyu 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:

ISR:中断服务程序 (interrupt service routine) 没看到具体的 可认为整个ThreadProc(PVOID lParam)为ISR


应该不是这样的吧。
看了一下这个帖子:http://www.cnblogs.com/we-hjb/archive/2009/11/29/1613245.html
上面说的检测中断响应事件的方法
……
[/Quote]
看了一下 帖子写的不错 也是介绍的驱动层使用中断的方法 不是应用层

yangjidi1985 2012-10-18
  • 打赏
  • 举报
回复
有没有人帮我解决下C#响应驱动中断的问题?
太感激了…………
yangjidi1985 2012-10-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

ISR:中断服务程序 (interrupt service routine) 没看到具体的 可认为整个ThreadProc(PVOID lParam)为ISR
[/Quote]

应该不是这样的吧。
看了一下这个帖子:http://www.cnblogs.com/we-hjb/archive/2009/11/29/1613245.html
上面说的检测中断响应事件的方法
1. 在OAL的OALIntrInit()函数中,设置某一GPIO为输出口,并使其输出高电平;

2. 在ISR的OEMInterruptHandler()函数中,将该GPIO设置为低电平;

3. 在IST的WaitForSingleObject()函数之后,将该GPIO设置为高电平;

4. 当外部中断触发时,GPIO会先被ISR拉低,再被IST拉高;

5. t1是外部中断下降沿触发以后,GPIO保持高电平的时间;

6. t2是GPIO保持低电平的时间;

7. t1+t2≈中断延迟时间

也就是说OEMInterruptHandler()函数执行的ISR程序;WaitForSingleObject()执行IST,由系统调度后执行,所以要慢一些
yangjidi1985 2012-10-18
  • 打赏
  • 举报
回复
在下面这个帖子里说明了应用层响应C++事件的方法
http://topic.csdn.net/u/20100531/21/eea1fd5b-e706-4d00-b3ed-86bb6ea6a9fb.html?seed=2081589965&r=79857816#r_79857816
但是在wince上没有ThreadPool.RegisterWaitForSingleObject方法,而且对应的eventSFifo.SafeWaitHandle也不知道怎么定义……
woshi_ziyu 2012-10-18
  • 打赏
  • 举报
回复
ISR:中断服务程序 (interrupt service routine) 没看到具体的 可认为整个ThreadProc(PVOID lParam)为ISR
yangjidi1985 2012-10-18
  • 打赏
  • 举报
回复
求指导
yangjidi1985 2012-10-12
  • 打赏
  • 举报
回复
//第一步:声明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);
}

现在还缺个GPIOEvent事件来与中断的thisISR.hEvent来获得联系。
yangjidi1985 2012-10-12
  • 打赏
  • 举报
回复
怎么发源代码的?
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;
}

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧