硬汉嵌入式论坛

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

[emWin] 请教下,发现使用emwin v5.40版本刷屏程序比较容易假死 ?

[复制链接]

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
发表于 2018-6-1 09:37:22 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2018-6-1 10:30 编辑

请教下,发现使用emwin v5.40版本刷屏程序比较容易假死 ?
在使用 emwin v5.40 这个版本, 带 argb 与 不带 argb 的都是一样的结果
具体描述如下:

使用图片旋转功能,有时程序会出现假死的情况,但是整个系统是没有死机的,当屏幕不会刷新显示时,触摸屏还是有反应的,而且也正常,

这个问题更换为 emwin v5.32 版本的就不会出现,出现这个假死的现象是我的 emwin 底层没有搞好还是 这个 v5.40 版本的库有问题呀 ??

底层驱动是移植官网的
使用 emwin v5.40 与 v5.32 版本的,底层驱动接口都是一模一样的,没有做任何更改


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-1 10:01:13 | 显示全部楼层
作为对比使用MDK安装目录里面的emWin测试下。
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-1 10:32:59 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-1 10:35 编辑
eric2013 发表于 2018-6-1 10:01
作为对比使用MDK安装目录里面的emWin测试下。

刚刚看了,keil 的安装目录里面使用的是 v5.32 版本的,
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-1 20:49:58 | 显示全部楼层
eric2013 发表于 2018-6-1 10:01
作为对比使用MDK安装目录里面的emWin测试下。

估计应该还是 emwin v5.40 版本库的问题,只要使用 v5.40 版本的就不行,使用 v5.32 版本的,死活都不会死
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-2 01:43:13 | 显示全部楼层
hpdell 发表于 2018-6-1 20:49
估计应该还是 emwin v5.40 版本库的问题,只要使用 v5.40 版本的就不行,使用 v5.32 版本的,死活都不会 ...

不是,已经5.46了,在MDK5.25里面,你从这里下载吧
https://forum.anfulai.cn/forum.p ... &highlight=5.46
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-2 11:04:30 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-2 12:27 编辑
eric2013 发表于 2018-6-2 01:43
不是,已经5.46了,在MDK5.25里面,你从这里下载吧
https://forum.anfulai.cn/forum.php?mod=viewthread& ...

已经下载了 5.46e 的版本,貌似还是会出现 emwin 假死的现象,就唯独 emwin v5.32 版本的不会,有点想不明白啊,底层驱动都是一模一样的,

emwin v5.40, v5.46 v5.32 版本之间,他们不够是带 os 还是不带 os的,最终都只有 v5.32 (包含os版本与不带os版本的)版本的工作不会出现问题
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-3 00:19:12 | 显示全部楼层
系统工作都是正常的,貌似 显示屏 不会更新显示了 ,不知道是怎么回事 ?

而且 emwin 的定时器工作也是正常的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-3 02:18:07 | 显示全部楼层
hpdell 发表于 2018-6-3 00:19
系统工作都是正常的,貌似 显示屏 不会更新显示了 ,不知道是怎么回事 ?

而且 emwin 的定时器工作也是 ...

明天有时间我把我们V6板子的万年历例子换成5.40测试下。
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-3 08:08:23 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-3 08:43 编辑
eric2013 发表于 2018-6-3 02:18
明天有时间我把我们V6板子的万年历例子换成5.40测试下。

好的,多谢多谢了,另外绘制日历时,不使用emwin 自带的 日历函数,

建议使用如下函数测试一下看看,

模拟日历程序:

typedef struct
{
        U16 X;                                           // X
        U16 Y;                                           // Y

        U16 X_x;                                         // X显示阴历 x 坐标
        U16 Y_y;                                         // Y显示阴历 y 坐标
        U32 Color;                                       // 颜色
        U8  Date;                                        // 日期

} CLD_DAY;


/**************************************************************************************
* FunctionName   : _DateToWeek()
* Description    : 通过日期获取周
* EntryParameter : year,  输入年 10进制
                   month, 输入月 10进制
                   day    输入日 10进制, day 固定输入为 1,切记切记
* ReturnValue    : 返回周
**************************************************************************************/
U8 _DayToWeek(U8 year, U8 month, U8 day)
{
        U8  i, y, m, d, weekDay;
        U16 ti = 2000;
        U32 days = 0;

        y = (year / 10)  * 10 + (year % 10);
        m = (month / 10) * 10 + (month % 10);
        d = (day / 10)   * 10 + (day % 10);

        for (i = 0; i<y; i++)
        {
                if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
                {
                        days += 366;
                }
                else
                {
                        days += 365;
                }
                ti++;
        }

        for (i = 1; i<m; i++)
        {
                switch (i)
                {
                        case 1:
                        case 3:
                        case 5:
                        case 7:
                        case 8:
                        case 10:
                        case 12:
                        {
                                days += 31;
                                break;
                        }

                        case 2:
                        {
                                ti = 2000 + y;
                                if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
                                {
                                        days += 29;
                                }
                                else
                                {
                                        days += 28;
                                }
                                break;
                        }

                        case 4:
                        case 6:
                        case 9:
                        case 11:
                        {
                                days += 30;
                                break;
                        }
                }
        }

        days    += d;
        weekDay  = (days % 7) + 5;
        weekDay %= 7;

        return weekDay;
}




#define USER_X_BASE_ADDR   1024-367
#define USER_Y_BASE_ADDR   32+332

/**************************************************************************************
* FunctionName   : _DrawCalendar()
* Description    : 绘制日历表格
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
//static const U8 cstWek[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
const char *cstWek[] = { "日\0", "一\0", "二\0", "三\0", "四\0", "五\0", "六\0" };
void _DrawCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay)
{
        WM_HWIN  hWinOld;
        U8 i;
        U8 n ;
        int x1,x2,y;
        GUI_RECT  pRect;
        char pData[4];
        hWinOld = WM_SelectWindow(pMsg->hWin);
        
        GUI_SetBkColor(GUI_GRAY_C8);  //矩形区域背景色
        pRect.x0 = USER_X_BASE_ADDR;
        pRect.y0 = USER_Y_BASE_ADDR;
        pRect.x1 = 1024;
        pRect.y1 = 600;
    GUI_ClearRectEx      (&pRect);  //绘制矩形框背景色

        GUI_SetColor(GUI_WHITE);
        
        for ( i = 0; i < 7; i++)  
        {
    sprintf((char *)&pData[0],
                "%s",
                cstWek
                );
                GUI_SetFont(&GUI_FontHZ16);  //显示中文字体
                GUI_DispStringAt((const char *) & pData[0], USER_X_BASE_ADDR+4+8+(i*52), USER_Y_BASE_ADDR);  // 显示星期
        }

        y = (USER_Y_BASE_ADDR+16+1) ;  //24是年、月高度,16是星期高度
        x1 = USER_X_BASE_ADDR;
        x2 = 1024;
        GUI_SetColor(GUI_BROWN);      // 设置线条颜色
        GUI_SetFont(&GUI_Font16_ASCII);
        GUI_DrawHLine(y, x1, x2);    // 画水平线


// 设置日期显示坐标值

        for ( i = 0; i < 7; i++)        // 设置显示 阳历的 y坐标
        {
                for ( n = 0; n < 7; n++)
                {
                        {
                                pDay[i * 7 + n].Y = (USER_Y_BASE_ADDR +16+4 + (i * 36));  // 39 = (600-32-332-24-16-1)/5
                        }
                }
        }


        for ( i = 0; i < 7; i++)        // 设置显示 阳历的 x坐标
        {
                for ( n = 0; n < 6; n++)   // 显示 6行
                {
                        pDay[i + 7 * n].X = (12 + USER_X_BASE_ADDR + (i * 52));  // 12 是为了显示在每格的中间位置
                }
        }
        
        /* 配置回之前选择的目标窗口 */
        WM_SelectWindow(hWinOld);
}


/**************************************************************************************
* FunctionName   : _FillCalendar()
* Description    : 日历填写
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
//        static const U8 cstmonth[][4] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEQ", "OCT", "NOV", "DEC" };
static const U8 monthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
void _FillCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay, U8 year, U8 month, U8 day)
{
        WM_HWIN  hWinOld;

        U8 tmpWek;
    U8 i;
hWinOld = WM_SelectWindow(pMsg->hWin);
        tmpWek = _DayToWeek(year, month, 0x01);                       // 获取星期

        for ( i = 0; i < tmpWek; i++)                               // 存储上月的
        {
                if (month == 0x01)
                {
                        pDay.Date = monthDay[12 - 1] - tmpWek + i + 1;
                }
                else
                {
                    pDay.Date = monthDay[month - 2] - tmpWek + i+1;      
            }

                pDay.Color = GUI_GRAY;
        }
        
        for ( i = 0; i < monthDay[month-1]; i++)
        {
                pDay[i + tmpWek].Date  = i+1;                               // 存储本月的
                pDay[i + tmpWek].Color = (day == i + 1) ? GUI_WHITE : GUI_MAGENTA;
        }

        for ( i = 0; i < 42 - tmpWek - monthDay[month-1]; i++)
        {
                if (month == 0x12)
                {
                        pDay[i + tmpWek + monthDay[1-1]].Date = i + 1;
                }
                else
                {
                        pDay[i + tmpWek + monthDay[month - 1]].Date = i + 1;    // 存储下月的
                }

                pDay[i + tmpWek + monthDay[month-1]].Color = GUI_GRAY;
        }

        for ( i = 0; i < 42; i++)
        {
                GUI_SetFont(&GUI_Font16B_ASCII);
                GUI_SetColor(pDay.Color);
                GUI_DispDecAt(pDay.Date, pDay.X, pDay.Y, ((pDay.Date > 10) ? 2 : 1));
        }
        /* 配置回之前选择的目标窗口 */
        WM_SelectWindow(hWinOld);
}



/**************************************************************************************
* FunctionName   : DisCalendar()
* Description    : 日历显示
* EntryParameter : year,  输入年 10进制
                   month, 输入月 10进制
                   day    输入日 10进制
* ReturnValue    : None
**************************************************************************************/
static CLD_DAY tmpDay[42];
void DisCalendar(WM_MESSAGE * pMsg, U8 year, U8 month, U8 day)
{
        _DrawCalendar(pMsg, tmpDay);
        _FillCalendar(pMsg, tmpDay, year, month, day);
}


// 在需要使用的地方使用

main()
{
WM_MESSAGE * pMsg;
... ...


switch(xx)
{

         /* 定时1秒更新一次时间 */
                case WM_TIMER:                     或者在 WM_PAINT 这个消息里面调用也行  ??????????
                        WM_InvalidateRect(hWin, &rRTC);   //指定区域无效化
                        GUI_ClockUpdate(pMsg);  
    //       DisCalendar( pMsg, 53, 11, 29);       //日期设置为 2053.11.29 日

        break;



            case WM_PAINT :    // 此处 跟新或者上面跟新都不行,此时貌似程序比较容易死掉 ?????????????????
               DisCalendar( pMsg, 53, 11, 29);       //日期设置为 2053.11.29 日
             break;

}
}

回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-6 15:22:17 | 显示全部楼层
eric2013 发表于 2018-6-3 02:18
明天有时间我把我们V6板子的万年历例子换成5.40测试下。

你好,有没有时间 帮我试试看啦,使用 emwin v5.40 版本的库,在窗口里面调用  gui 开头的函数 效果如何啊 ??

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-7 02:51:36 | 显示全部楼层
hpdell 发表于 2018-6-6 15:22
你好,有没有时间 帮我试试看啦,使用 emwin v5.40 版本的库,在窗口里面调用  gui 开头的函数 效果如何 ...

今天白天了就给你测试下
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-7 12:49:53 | 显示全部楼层
eric2013 发表于 2018-6-7 02:51
今天白天了就给你测试下

多谢多谢了啊,期待中 ... ...

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-7 14:10:45 | 显示全部楼层
hpdell 发表于 2018-6-7 12:49
多谢多谢了啊,期待中 ... ...

已经使用我们V6板子的万年历例子,升级到STemWin5.40,用的ABGR格式库,F4版本的,无问题。
回复

使用道具 举报

692

主题

3581

回帖

5682

积分

论坛元老

积分
5682
 楼主| 发表于 2018-6-7 15:01:00 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-7 15:26 编辑
eric2013 发表于 2018-6-7 14:10
已经使用我们V6板子的万年历例子,升级到STemWin5.40,用的ABGR格式库,F4版本的,无问题。

怎么我同样的 应用程序,使用 v5.40 版本的 不管是 argb还是 abgr 的都不行啊 ?
使用 v5.32版本的就完全木有问题,底层驱动不用做任何更改

能否发一个 历程给我参考看看啊 ?????

就是需要使用 v5.40 版本的,在窗口里面使用 gui 开头的函数进行 划线、矩形 、显示字符等操作的历程就可以了
或者你把你们使用的 v5.40版本的库发给我一下也行啊,想看看是不是我的这个  v5.40 版本的库有问题 ?

先多谢多谢了


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-7 19:56:55 | 显示全部楼层
hpdell 发表于 2018-6-7 15:01
怎么我同样的 应用程序,使用 v5.40 版本的 不管是 argb还是 abgr 的都不行啊 ?
使用 v5.32版本的就完 ...

就是这个帖子里面的万年历例子:
https://forum.anfulai.cn/forum.p ... &extra=page%3D1

emWin库是用的这个,我用的MDK带OS,带优化的,也就是带字母ot
https://forum.anfulai.cn/forum.p ... &highlight=5.40

移植的时候,我仅替换了lib库文件和inc头文件
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 15:40 , Processed in 0.049533 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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