|
本帖最后由 chinashaoshu 于 2019-10-8 14:17 编辑
问题:两个线程key(优先级为11)和emwin_gui(优先级18),按下按键给emwin发消息,发送过程如下,在key_handle中检测那个按键按下,然后直接调用Send_ButtonMess(x,MenuBar.opt);
- key线程
- static void key_handle(rt_uint32_t which_key)
- {
- switch(which_key)
- {
- case KEY_FUNC1:{
- Send_ButtonMess(0,MenuBar.opt);
- rt_kprintf("fun1\r\n");
- }break;
- case KEY_FUNC2:{
- Send_ButtonMess(1,MenuBar.opt);
- rt_kprintf("fun2\r\n");
- 。。。
- }break;
复制代码 Send_ButtonMess函数
- void Send_ButtonMess(uint8_t BnId,Menu_opt v)
- {
- WM_MESSAGE Message;
- Message.hWin = hMenuBar;
- Message.MsgId = WM_NOTIFY_PARENT;
- Message.hWinSrc = MenuBar.Button[BnId].hButton;
- Message.Data.v = v;
- WM_SendMessage(hMenuBar,&Message);
- }
复制代码 发送消息会触发回去emwin的互斥量
- void GUI_X_Unlock(void)
- {
- /* 发送互斥量 */
- rt_mutex_release(GuiMutex);
- }
- void GUI_X_Lock(void)
- {
- /* 获取互斥量 */
- rt_mutex_take(GuiMutex, RT_WAITING_FOREVER);
- }
复制代码 问题:有时候连续按下按键会导致画面不更新,按键没反应。
现象:仿真发现emwin线程正常运行,但是不再更新画面,好像是卡在什么地方了,keyboard线程也不再运行。
猜测:lcd的画面不更新了,但是emwin线程还能运行,emwin固件肯定出问题了,keyboard线程应该在死等互斥量,可能是连续快速按键,导致连续发送消息,使emwin出了问题,emwin rt_mutex_take了2次,但是只rt_mutex_release了一次,使得GuiMutex始终无法完全释放??观察emwin线程中会周期调用WM_SendMessage函数,可能连续按按键调用WM_SendMessage,使得打架了吧。。。。
请大神支支招!!!!
调试和仿真图片:
|
|