硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4257|回复: 21
收起左侧

[emWin] 用WM_SendMessage给窗口发消息死机

  [复制链接]

76

主题

237

回帖

465

积分

高级会员

积分
465
发表于 2019-11-29 10:26:09 | 显示全部楼层 |阅读模式
在一个检测任务中使用 WM_SendMessage给窗口发送消息,发现一个问题,如果发送的频率过快,会导致发送消息的检测任务挂起在emWin的一个互斥锁上,无法再发送任何消息了....但是用GUI_StoreKeyMsg发送消息,就没这个问题,什么原因呢?
WM_SendMessage这个函数发送消息能发送多少?有消息缓冲池之类的机制吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-11-29 10:54:56 | 显示全部楼层
如果是多任务的话,试试函数 WM_SendMessageNoPrara,另外你的自定义消息里面执行的函数里面先别执行功能,看看是否正常,然后逐步增加执行的功能。

我之前实测这个函数发送效果后,直接在这个发送的消息的任务里面执行另一个任务的回调,另外就是将你这个发送消息的任务优先级设置高点。
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-11-29 12:38:23 | 显示全部楼层
eric2013 发表于 2019-11-29 10:54
如果是多任务的话,试试函数 WM_SendMessageNoPrara,另外你的自定义消息里面执行的函数里面先别执行功能, ...

GUI的任务就一个,检测任务是另一个普通任务(收到中断就发送消息给GUI窗口),如果我检测任务里不发送消息给GUI窗口,就没问题,或者使用GUI_StoreKeyMsg给GUI窗口发送消息也没问题,但是使用WM_SendMessage发送,一旦频率快了(检测任务接收的中断有时候会1s好几十次,甚至上百次),发送消息的这个检测任务就被挂起了(挂起在emWin的一个互斥锁上,无法再发送消息了),你说的WM_SendMessageNoPrara等我试试看。这个GUI真是玩不明白啊...
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-11-29 12:38:45 | 显示全部楼层
emwin有时候很奇怪,某些消息发送会立刻发送成功,导致消息回调函数重入,如果有一些函数内的变量可能就会出问题
回复

使用道具 举报

9

主题

112

回帖

144

积分

初级会员

积分
144
发表于 2019-11-29 18:33:37 | 显示全部楼层
任务优先级可能会导致这种问题产生。WM_SendMessage会直接回调,如果层级比较深且回调函数复杂的话,很容易导致调用此接口的任务栈溢出。建议使用RTOS的接口给GUI任务发队列消息,GUI任务收到消息后作相应处理。这样可以把GUI任务与其它任务彻底分离开来,任务执行上的时间也更可控。逻辑也会更加清晰
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-2 12:52:15 | 显示全部楼层
本帖最后由 kokoromi 于 2019-12-4 12:08 编辑
yanchao7788 发表于 2019-11-29 18:33
任务优先级可能会导致这种问题产生。WM_SendMessage会直接回调,如果层级比较深且回调函数复杂的话,很容易 ...

啥意思?我现在就俩任务,一个GUI任务,一个检测任务,在检测任务里用WM_SendMessage()给GUI任务发消息,发几次后检测任务就挂起在GUI任务的一个互斥信号量上,无法执行其他操作了。
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-2 12:54:10 | 显示全部楼层
本帖最后由 kokoromi 于 2019-12-4 12:09 编辑
eric2013 发表于 2019-11-29 10:54
如果是多任务的话,试试函数 WM_SendMessageNoPrara,另外你的自定义消息里面执行的函数里面先别执行功能, ...

不行啊,WM_SendMessage()和WM_SendMessageNoPrara()这两个函数是不是只能在GUI任务里调用,不能在非GUI任务里使用?试了好多次,在检测任务里发几次消息给GUI任务,检测任务就挂了....
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-2 14:16:38 | 显示全部楼层
本帖最后由 kokoromi 于 2019-12-4 12:10 编辑

问题算是解决了吧,经过测试 WM_SendMessage和 WM_SendMessageNoPrara函数只能在GUI任务中使用,不能在GUI任务以外的其他普通任务中使用,否则发送消息有很大概率让发送消息的任务挂起在GUI_X_OS.c文件中定义的那个互斥信号量上无法继续工作,具体原因不清楚。如果要在GUI以外的任务发送消息给GUI任务,只能使用GUI_StoreKeyMsg这个函数。但是使用发送按键消息函数会导致整体结构复杂混乱,没采用这个方式。
最后采用了另一个方法,在普通任务中发送消息使用系统的队列函数OSTaskQPost把消息发送给GUI任务,然后GUI任务收到这个消息后再使用WM_SendMessage或WM_SendMessageNoPrara把消息发送给窗口就可以了,用系统的队列中转了一下,没问题了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-12-3 08:55:59 | 显示全部楼层
kokoromi 发表于 2019-12-2 14:16
问题算是解决了吧,经过测试 WM_SendMessage和 WM_SendMessageNoPrara函数只能在GUI任务中使用,不能在GUI ...

没问题,可以多任务调用的。
做的那个音乐播放器和视频播放器是采用的这两个函数。
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2019-12-3 10:58:10 | 显示全部楼层
eric2013 发表于 2019-12-3 08:55
没问题,可以多任务调用的。
做的那个音乐播放器和视频播放器是采用的这两个函数。

是不是emwin的设置需要变更? 比如允许多任务设置?自行添加任务锁函数?
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-3 23:21:49 | 显示全部楼层
kokoromi 发表于 2019-12-2 14:16
问题算是解决了吧,经过测试 WM_SendMessage和 WM_SendMessageNoPrara函数只能在GUI任务中使用,不能在GUI ...

我之前通过外部按键触发,使用WM_SendMessage发送自定义消息没问题;
今天调试通过FMC读取ram数据之后,调用WM_SendMessage发送自定义也会出现这个问题,我这边是100ms读取一次ram信息然后发送给GUI任务界面。即使改为1s一次发消息也不行。
明天试下用队列消息试一下。

回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-4 09:29:57 | 显示全部楼层
xiaomeng 发表于 2019-12-3 23:21
我之前通过外部按键触发,使用WM_SendMessage发送自定义消息没问题;
今天调试通过FMC读取ram数据之后, ...

我之前不好使就是在发送消息频率较快的情况下才出现,比如1s内发送好多次。如果发送频率慢,就没问题。
后来我用系统的队列中转了一下,发送频率多快都没问题了。总感觉这俩函数在非GUI任务之外的任务中使用有BUG,在GUI任务中使用就没任何问题。
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-4 09:33:21 | 显示全部楼层
本帖最后由 kokoromi 于 2019-12-4 12:16 编辑
eric2013 发表于 2019-12-3 08:55
没问题,可以多任务调用的。
做的那个音乐播放器和视频播放器是采用的这两个函数。

试过发送频率比较快的情况下还好用吗?比如1s内发个5次以上的?我当时测试是发送频率慢的话没问题,但是消息发送频率高了之后就完蛋了...
我看过你的那个音乐播放任务,MP3播放调用的是MP3MusicPlay()这个函数吧,函数末尾使用了WM_SendMessageNoPara发送消息,但是这个发送频率应该不高的吧,你试试发送频率高了之后,比如1s发10次或更多消息,看看这个播放任务会不会挂起在GUI的那个互斥锁上。
无标题.png


回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-4 09:50:56 | 显示全部楼层
我的问题找到了,是因为任务分配的栈空间太小,现在改大就可以了;
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-12-4 10:23:25 | 显示全部楼层
kokoromi 发表于 2019-12-4 09:33
试过发送频率比较快的情况下还好用吗?比如1s内发个5次以上的?我当时测试是发送频率慢的话没问题,但是 ...

我以前也试过多任务使用emwin,总是有莫名其妙的问题
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-4 11:32:21 | 显示全部楼层
kokoromi 发表于 2019-12-4 09:33
试过发送频率比较快的情况下还好用吗?比如1s内发个5次以上的?我当时测试是发送频率慢的话没问题,但是 ...

我的现在1s发送10次,今天试验,都发送成功了
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-4 15:30:00 | 显示全部楼层
eric2013 发表于 2019-12-3 08:55
没问题,可以多任务调用的。
做的那个音乐播放器和视频播放器是采用的这两个函数。

我知道什么原因了,我之前用的是STemWin_CM4_OS_wc32_ARGB.a这个库,现在换成STemWin_CM4_wc32_ARGB.a这个库就没问题了,感觉多任务模式的emWin太难搞了,各种问题找不到原因,弄不明白,还是老老实实一个任务吧...
不过之前说过的用GUI_SendKeyMsg发送按键导致系统硬fault的问题依然存在,用GUI_StoreKeyMsg这个就没问题,不知道怎么回事。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-12-4 19:56:20 | 显示全部楼层
kokoromi 发表于 2019-12-4 15:30
我知道什么原因了,我之前用的是STemWin_CM4_OS_wc32_ARGB.a这个库,现在换成STemWin_CM4_wc32_ARGB.a这 ...

GUI_SendKeyMsg是不是在中断里面调用的?
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-4 21:41:26 | 显示全部楼层
eric2013 发表于 2019-12-4 19:56
GUI_SendKeyMsg是不是在中断里面调用的?

不是,是在一个单独的按键处理任务中调用的,按理说应该不会有问题,但是实际使用这个就进硬错误...
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-4 23:22:59 | 显示全部楼层
kokoromi 发表于 2019-12-4 21:41
不是,是在一个单独的按键处理任务中调用的,按理说应该不会有问题,但是实际使用这个就进硬错误...

我也遇到过,我是有三个窗口GUI,只在一个窗口中时,外部按键通过GUI_SendKeyMsg发送按键会进硬件错误,改为GUI_StoreKeyMsg解决问题了。
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2019-12-5 10:15:06 | 显示全部楼层
xiaomeng 发表于 2019-12-4 23:22
我也遇到过,我是有三个窗口GUI,只在一个窗口中时,外部按键通过GUI_SendKeyMsg发送按键会进硬件错误, ...

找到原因了吗?我试了好多方式,都不行,放弃了,现在都改成 GUI_StoreKeyMsg了。
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-5 11:30:18 | 显示全部楼层
kokoromi 发表于 2019-12-5 10:15
找到原因了吗?我试了好多方式,都不行,放弃了,现在都改成 GUI_StoreKeyMsg了。

没有。用GUI_StoreKeyMsg了,没再去找原因了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 14:30 , Processed in 0.389709 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表