硬汉嵌入式论坛

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

[emWin] 分段存储调用一次以上会死机,求教

[复制链接]

10

主题

8

回帖

38

积分

新手上路

积分
38
发表于 2018-11-19 08:58:51 | 显示全部楼层 |阅读模式
大家好:
    因为编辑需要我调用分段存储功能,同一个函数,当我第一次跳转到该界面调用时正常,但是已经处于该界面下,当按键触发,第二次调用这个函数就出现异常,也不是真的死机或者异常中断这种。程序好像在运行,但是界面再无反应,所有按键不能触发。如果不二次调用这个函数就一切正常。我猜肯定是我哪里违规了,但是我不清楚,求教一下。
/*********************************************************************
*      显示信息
***********************************************************************/
static void _DrawIt(void * pData)
{
                GUI_SetColor(GUI_YELLOW);//设置前景色
                GUI_FillRect(edit.xpoint_start,edit.ypoint_start,edit.xpoint_stop,edit.ypoint_stop);//绘制填充矩形
                GUI_SetColor(GUI_BLUE);//设置前景色
                Edit_Draw_Char(edit.xpoint_start, edit.ypoint_start, edit.matrix, (char *)edit.content,FileMsg.PenSize);//自己封装的描点显示函数,经测试,只要不使用分段存储,怎么调用都可以
}

#define USE_BANDING_MEMDEV 1//启用分段存储
void Edit_Dis_String(WM_HWIN hWin)
{
       
        WM_HWIN hWinOld;
        GUI_RECT Rect = {EDIT_T1_STARTX, EDIT_T1_STARTY, EDIT_T1_ENDX,EDIT_T1_ENDY};//使用的区域
        GUI_Delay(100);//用于刷新界面
        hWinOld = WM_SelectWindow(WM_GetClientWindow(hWin));
        GUI_SetPenSize(1);
        GUI_SetColor(GUI_BLUE);//设置前景色
        #if USE_BANDING_MEMDEV//如果使用分段存储
                       
                        GUI_MEMDEV_Draw(&Rect,&_DrawIt,&edit,0,0);//使用分段存储绘制
        #else
                        _DrawIt(&edit);
        #endif
        WM_SelectWindow(hWinOld);
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-19 14:57:01 | 显示全部楼层
GUI_MEMDEV_Draw有个参数是配置段大小的,设置下不同值看看。
回复

使用道具 举报

10

主题

8

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2018-11-22 15:35:02 | 显示全部楼层
配置无效果。oid Edit_Dis_String(WM_HWIN hWin)这个函数在窗口创建的时候调用一次是没问题的,但是不能调用第二次,所以我觉得可能是某些句柄返回错了,但是查不出来
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-22 15:36:10 | 显示全部楼层
andiwxz 发表于 2018-11-22 15:35
配置无效果。oid Edit_Dis_String(WM_HWIN hWin)这个函数在窗口创建的时候调用一次是没问题的,但是不能调 ...

发个完整点的测试代码,我我测试下,仅测试你这部分程序即可,其它部分不需要。
回复

使用道具 举报

10

主题

8

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2018-11-27 12:20:56 | 显示全部楼层
eric2013 发表于 2018-11-22 15:36
发个完整点的测试代码,我我测试下,仅测试你这部分程序即可,其它部分不需要。

代码我整理好发上来,嵌入东西比较多,我正好也分离出来测试一下。目前我怀疑两个地方,一个是WM_SelectWindow();函数调用,每次进入函数选定窗口一次,退出时恢复一次,但是我没找到关于这个函数过多的资料,这个函数反复调可以吗?因为刷一次界面调用两次,再刷就要调用四次了,第二个问题是,我写这个分段存储函数,第一次是创建完窗口调用,代码如下,第二次调用是在ucos的循环里边。不是事件触发的,会不会有差别?

WM_HWIN CreateFramewin_edit(void)
{
        hWin = GUI_CreateDialogBox(_aDialogCreate_edit, GUI_COUNTOF(_aDialogCreate_edit), _cbDialog_edit, WM_HBKWIN, 0, 0);       
        GUI_Exec();//
        DisMsg.type = DIS_ALL;
        Edit_Dis_String(hWin);//调用分段存储
        return hWin;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115777
QQ
发表于 2018-11-28 01:57:04 | 显示全部楼层
andiwxz 发表于 2018-11-27 12:20
代码我整理好发上来,嵌入东西比较多,我正好也分离出来测试一下。目前我怀疑两个地方,一个是WM_SelectW ...

可以这么搞。
回复

使用道具 举报

10

主题

8

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2018-11-28 09:32:50 | 显示全部楼层
谢了,现在基本锁定问题了。但是理解不够透彻。我认为原因是我在程序主循环调用了这个子函数,不是在窗口活动的时候,所以退出子函数,调用WM_SelectWindow(hWinOld);恢复窗口时,就跑了,不知道恢复到哪里去了。我现在改为必须按键才能触发这个动作,因为实在窗口里调用的,就没事了。正在做更详细的测试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 11:51 , Processed in 0.268918 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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