硬汉嵌入式论坛

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

[emWin] WM_SendMessageNoPara()一发就死机!?

[复制链接]

79

主题

191

回帖

428

积分

高级会员

积分
428
发表于 2014-9-2 15:02:48 | 显示全部楼层 |阅读模式
基于FreeRTOS+ucGUI3.98+T6963单色屏的人机界面基本完工了,还有最后一个问题没有解决。。。。
就是关于定时发消息刷新状态栏时间,我是这样做的:
FreeRTOS创建一个大约1秒钟触发一次的定时器,然后在定时器的回调函数里给状态栏发一个无参数信息:
static void vTimer1Callback( xTimerHandle pxTimer )
{
PCF8563_Read_Time();  //读PCF8563时钟芯片
WM_SendMessageNoPara(hStatusBar,RTC_MESSAGE);
}
以上代码编译下载,开机就死掉了,连图形界面都进不了。于是改用103的通用定时器来做,还是一样!!
思来想去,无参数的消息一发就死机,咱就给它发个带参数的消息呗,于是把上面的代码改成:
static void vTimer1Callback( xTimerHandle pxTimer )
{
PCF8563_Read_Time();
WM_MESSAGE Msg_Tmp;
Msg_Tmp.Data.v = 1;
Msg_Tmp.hWinSrc = WM_HBKWIN;
Msg_Tmp.MsgId = RTC_MESSAGE;
WM_SendMessage(hStatusBar,&Msg_Tmp);
}
嘿嘿。。。。居然不死机了,状态栏的时间也能正常刷新显示了。。。。。正当我心里暗自高兴的时候,接下来发生的一切又
让我转喜为悲。。。。。以前没有加这些刷新时间消息的时候,菜单界面之间切换很顺畅自然,从未发生过界面切换死机的,自从加
了这个刷时间的消息,界面切换老死机,尤其是那个动态显示56X5个数据的LISTVIEW,不进则好,进则必死!有时候能进,出来也死!
把上面那些刷时间的消息注释掉,一切又恢复正常。。。。。。。。。怎么能这样呢?这是神马情况??

顺便说一下开发的大致情况:
STM32F103ZET6 + FreeRTOS + ucGUI + 240x128单色屏,没有外扩RAM。
FreeRTOS动态内存:12*1024
UCGUI动态内存:18*1024
FreeRTOS 任务:1个外设初始化任务
                             1个实体按键扫描任务
                             1个人机界面任务
                              1个MODBUS主任务
                              1个MODBUS从任务
                              3个带互斥的AD采集任务
F103的那点64K的RAM已经被我用的所剩无几了,稍不注意KEIL编译就报内存不够。。。。
哪位碰到过类似的情况??能否给说说??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115693
QQ
发表于 2014-9-2 15:08:41 | 显示全部楼层
不需要在定时器任务里面搞,你可以直接使用emWin的定时器消息实现更简单可靠,实现方法看我的emWin 60期教程里面的定时器部分。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-9-2 15:13:29 | 显示全部楼层
可是UCGUI里没有ENWIN里的那个定时器啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115693
QQ
发表于 2014-9-2 15:14:39 | 显示全部楼层

回 天马行空 的帖子

天马行空:可是UCGUI里没有ENWIN里的那个定时器啊 (2014-09-02 15:13) 
怎么不用STemWin,你用UCGUI还涉及到版权的。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-9-2 15:22:24 | 显示全部楼层
STemWin包罗万象,且无法裁剪,我把UCGUI里没有用到的字体、颜色转换、WIDGET、抗锯齿等等一切没用到的东西全扔了。。。。
至于版权。。。。。。我会慎重考虑这个问题的。。。。。。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115693
QQ
发表于 2014-9-2 15:28:48 | 显示全部楼层

回 天马行空 的帖子

天马行空:STemWin包罗万象,且无法裁剪,我把UCGUI里没有用到的字体、颜色转换、WIDGET、抗锯齿等等一切没用到的东西全扔了。。。。
至于版权。。。。。。我会慎重考虑这个问题的。。。。。。。。 (2014-09-02 15:22) 
STemWin基本不用裁剪的,如果没有用到的控件等,编译器会把这些冗余函数滤除掉的。觉得不放心设置相应的宏定义。你可以试试看。
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
 楼主| 发表于 2014-9-2 16:50:46 | 显示全部楼层
搞定了。。。。。。
仔细找了下UCGUI的源代码,发现在GUITimer.c文件里发现有GUI_TIMER_Create();GUI_TIMER_Delete();GUI_TIMER_Restart()。。。。
等等功能完善的定时器实现,只是命名和EMWIN里的不一样,难怪EMWIN里的定时函数放到UCGUI里都不认了呢。。。查4.04的手册,上面也没有
关于这些定时器函数的介绍,看来有时候手册也不靠谱。。。。还是看源码实在点。。。。
另外。。。我发现UCGUI的定时器在定时溢出后不会发WM_TIMER消息,这实在蛋疼。。。。。还得搞个定时器回调函数。。。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115693
QQ
发表于 2014-9-2 19:19:16 | 显示全部楼层

回 天马行空 的帖子

天马行空:搞定了。。。。。。
仔细找了下UCGUI的源代码,发现在GUITimer.c文件里发现有GUI_TIMER_Create();GUI_TIMER_Delete();GUI_TIMER_Restart()。。。。
等等功能完善的定时器实现,只是命名和EMWIN里的不一样,难怪EMWIN里的定时函数放到UCGUI里都不认了呢。。。查4.04的手册 .. (2014-09-02 16:50) 
不是的,你得在WM_TIMER消息里面GUI_TIMER_Restart()一下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115693
QQ
发表于 2014-9-2 19:19:41 | 显示全部楼层
emWin中的定时器就是这么用的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 11:28 , Processed in 0.665983 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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