wince 触摸和audio驱动中添加postmessage
2012-08-08 15:22
295 查看
最近做的一个项目,需要不同模块之间通信,MCU-(OS驱动)-DLL-EXE,
由于需要arm将触摸驱动和音频设备开关信息发送给MCU处理
我在touch驱动和wavmain中加入了postmessage
message发给应用层,应用再通过串口发给MCU处理
下面看看具体的代码
可以看到我添加的地方就是post一个消息,消息是注册表注册的一个信息,也可以用其他数字什么的,但是注册的信息能保证唯一性
其次推荐用post不用send,因为post是异步的。
其次再看看audio的message,这个就有点纠结了,弄了我很久
先发个错误的
第四行和35行就是我添加的代码,编译后烧进板子后触摸无效,其实不是触摸无效,而是系统挂在一个地方了
原因就是这个地方跑进临界区,不能使用postMessage这种涉及到多线程的函数
下面发正确的修改:
3-11行就是我添加的,之所以前面那段加入switch里错误了,就是因为14行的lock函数
这个函数的定义就是进入临界区进行多线程的禁止和内存保护。
所以以后要长个教训,不是什么地方都可以乱插入函数
本文仅仅是作者个人观点,本人菜鸟,希望大家一起共同进步
由于需要arm将触摸驱动和音频设备开关信息发送给MCU处理
我在touch驱动和wavmain中加入了postmessage
message发给应用层,应用再通过串口发给MCU处理
下面看看具体的代码
BOOL getTouchCoordinate(USHORT *x, USHORT *y) { ULONG trytimes = 0; *x = *y = MAX_ADC_VAL; RETAILMSG(0, (TEXT("++++sampleADC!\r\n"))); while (trytimes++ < TIMEOUT_VAL) { if (!TouchSocIsPenDown()) { return FALSE; } #if COORDINATE_MODE if (TouchSocSampleCooCoordinate(x, y)) { break; } #else // COORDINATE_MODE if (!TouchSocSampleCoordinate(x, TRUE)) { continue; } // sampling Y coordinate if (TouchSocSampleCoordinate(y, FALSE)) { break; } #endif // COORDINATE_MODE } // while RETAILMSG(1, (TEXT("x=%x, y=%x \r\n"), *x, *y)); //下面是我添加的 if(((xx-(*x))>50)||(((*x)-xx)>50)||((yy-(*y))>50)||(((*y)-yy)>50)) { ::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_MCU_TOUCH-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),*x,*y); } xx=(*x); yy=(*y); //添加结束 if (trytimes > TIMEOUT_VAL) { RETAILMSG(1, (TEXT("timeout sampling coordinates\r\n"))); } TouchSocPreInit(); return TRUE; }
可以看到我添加的地方就是post一个消息,消息是注册表注册的一个信息,也可以用其他数字什么的,但是注册的信息能保证唯一性
其次推荐用post不用send,因为post是异步的。
其次再看看audio的message,这个就有点纠结了,弄了我很久
先发个错误的
case WODM_OPEN: { RETAILMSG(1, (_T("WODM_OPEN"))); ::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_OPEN-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0); DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId); if (!(dwParam2 & WAVE_FORMAT_QUERY)) { g_pHWContext->AudioPowerOn(FALSE); } dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser); break; } case WIDM_OPEN: { RETAILMSG(1, (_T("WIDM_OPEN"))); if (!(dwParam2 & WAVE_FORMAT_QUERY)) g_pHWContext->AudioPowerOn(FALSE); DeviceContext *pDeviceContext = g_pHWContext->GetInputDeviceContext(uDeviceId); dwRet = pDeviceContext->OpenStream((LPWAVEOPENDESC)dwParam1, dwParam2, (StreamContext **)dwUser); break; } case WODM_CLOSE: { RETAILMSG(1, (_T("WODM_CLOSE"))); ::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_CLOSE-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0); DeviceContext *pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId); }
第四行和35行就是我添加的代码,编译后烧进板子后触摸无效,其实不是触摸无效,而是系统挂在一个地方了
原因就是这个地方跑进临界区,不能使用postMessage这种涉及到多线程的函数
下面发正确的修改:
DWORD dwRet = MMSYSERR_NOERROR; //lishiqi insert 20120808 if(uMsg == WODM_OPEN) { ::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_OPEN-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0); } else if(uMsg == WODM_CLOSE) { ::PostMessage(HWND_BROADCAST, ::RegisterWindowMessage(_T("UWM_TO_AUDIO_CLOSE-{7049499B-0480-44f9-BF71-4AE91FA0443C}")),0,0); } g_pHWContext->Lock(); switch (uMsg) { case WIDM_OPEN_AUDIO_PHYSICAL_INPUT: { g_pHWContext->Codec_PowerInput(TRUE, dwParam1); g_pHWContext->Codec_InMute(FALSE, dwParam1); break; }
3-11行就是我添加的,之所以前面那段加入switch里错误了,就是因为14行的lock函数
这个函数的定义就是进入临界区进行多线程的禁止和内存保护。
所以以后要长个教训,不是什么地方都可以乱插入函数
本文仅仅是作者个人观点,本人菜鸟,希望大家一起共同进步
相关文章推荐
- 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)
- WINCE--流设备驱动简介及往BSP添加
- wince 驱动添加
- 在Wince的Catalog中添加驱动组件
- UT2416 wince 6.0 调试LCD35 触摸驱动参考
- 在Wince的Catalog中添加驱动组件
- wince下添加自己的流接口驱动
- 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)
- WINCE--流设备驱动简介及往BSP添加
- WINCE--流设备驱动简介及往BSP添加
- UT2416 wince 6.0 调试LCD35 触摸驱动参考
- wince下添加和删除驱动出现错误
- 在Wince的Catalog中添加驱动组件
- 在Wince的Catalog中添加驱动组件
- WINCE打印系列(一) WINCE打印驱动概况和如何添加打印组件
- 介绍一种wince 6.0 如何添加 640*480液晶驱动的好方法
- WINCE--流设备驱动简介及往BSP添加
- WinCE 6.0系统制定(添加Web Server组件、SQL Server CE组件和SD WiFi驱动)
- WINCE--流设备驱动简介及往BSP添加(转载)
- S3C2416 Linux2.6.21 驱动移植--添加UART3 及波特率设置bug消除