硬汉嵌入式论坛

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

[emWin] 裸机跑emwin Graph控件,去掉while,数据越刷越慢直到卡死卡死?

[复制链接]

14

主题

34

回帖

76

积分

初级会员

积分
76
发表于 2023-4-8 00:40:26 | 显示全部楼层 |阅读模式

        //while(1)
        //{
            for(DataN = 0;DataN < 128;DataN ++)
            {
                //GRAPH_DATA_YT_AddValue(Graphdata,  ((short)tp) * 2);//测试语句,单片机ADC内部温度测试
                GRAPH_DATA_YT_AddValue(Graphdata,  rand() % 160);
            }
            /* 向GRAPH数据对象添加数据 */
          GUI_Delay(10);   
        //}
F103裸机跑emwin,MainTask()函数放在大循环里,
如果去掉注释就是有while循环的条件下,随机函数波形曲线刷新正常,定时串口不打印,换测试语句,单片ADC DMA中断不更新数据,定时打印串口信息也没了;
如果注释,随机函数波形曲线刷新或测试语句都开始正常,但是后面越刷新越慢,直至数据没了,刻度线还在刷新,很慢。
1.GUI_Delay这个函数是死等还是像系统定时会继续执行别的程序?
2.为什么加了while循环就可以一直刷新数据也不会出现越刷越慢,啥原因?去掉while 把这个MainTask放在while大循环里有,也能执行到GUI_Delay,有啥不同吗?
3.求解决
部分代码缩进了
02.jpg 01.jpg



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-4-8 01:53:57 | 显示全部楼层
貌似是程序设计有问题,你这个是每个if里面都创建一个FrameWin吗,然后你这个Graph控件是创建到那个对话框上的。
回复

使用道具 举报

14

主题

34

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2023-4-8 10:12:47 | 显示全部楼层
eric2013 发表于 2023-4-8 01:53
貌似是程序设计有问题,你这个是每个if里面都创建一个FrameWin吗,然后你这个Graph控件是创建到那个对话框 ...

我只是Graph 用了Framewin,其余的都是直接简单的文本图片
详细代码如下
void MainTask(void)
{
    if(timestate == 1)
    {
        GUI_SetBkColor(GUI_LIGHTGRAY);
        if(rst1 == 0)
        {
            GUI_Clear();
            /* 初始化Graph控件 */
            rst1 = 1;
            rst2 = 0;
            rst3 = 0;
            rst4 = 0;
            rst5 = 0;
            rst6 = 0;  
        }
        CreateFramewin();
    /* 在这两个函数之间实现波形绘制 */
        while(1)
        {
            for(DataN = 0;DataN < 128;DataN ++)
            {
                //GRAPH_DATA_YT_AddValue(Graphdata,  ((short)tp) * 2);
                GRAPH_DATA_YT_AddValue(Graphdata,  rand() % 160);
            }
            /* 向GRAPH数据对象添加数据 */
          GUI_Delay(10);   
        }
    }
    else if(timestate == 2)
    {
//        GUI_EndDialog(pMsg->hWin, 0);
        GUI_SetBkColor(GUI_BLUE);
        if(rst2 == 0)
        {
            GUI_Clear();
            rst1 = 0;
            rst2 = 1;
            rst3 = 0;
            rst4 = 0;
            rst5 = 0;      
            rst6 = 0;              
        }
        GUI_SetColor(GUI_BLACK);
        GUI_SetFont(&GUI_Font8x16);        
        /* 设置正常模式 */
        GUI_SetTextMode(GUI_TM_NORMAL);
        GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 0, 10);
        /* 翻转文本 */
        GUI_SetTextMode(GUI_TM_REV);
        GUI_DispStringHCenterAt("GUI_TM_REV" , 0, 26);
        /* 透明文本 */
        GUI_SetTextMode(GUI_TM_TRANS);
        GUI_DispStringHCenterAt("GUI_TM_TRANS" ,0, 42);
        /* 异或文本 */
        GUI_SetTextMode(GUI_TM_XOR);
        GUI_DispStringHCenterAt("GUI_TM_XOR" , 0, 58);
        /* 设置文本模式 */
        GUI_SetTextMode(GUI_TM_TRANS | GUI_TM_REV);
        GUI_DispStringHCenterAt("GUI_TM_TRANS | GUI_TM_REV", 0, 74);
        
    }
    else if(timestate == 3)
    {
        GUI_SetBkColor(GUI_BLUE);
        if(rst3 == 0)
        {
            GUI_Clear();
            rst1 = 0;
            rst2 = 0;
            rst3 = 1;
            rst4 = 0;
            rst5 = 0;   
            rst6 = 0;              
        }       
        GUI_SetColor(GUI_BLACK);
        GUI_SetFont(&GUI_Font8x18);
        GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
        GUI_GotoXY(0,1);
        GUI_DispString("Temp ADC:\n");
        GUI_DispDec(ADC_ConvertedValue[0],4);
        GUI_DispString("\n");

        GUI_DispString("Temp Value:\n");                       
        GUI_DispFloat(tp, 10);                             GUI_DispString("  C");
        GUI_DispString("\n");

        GUI_DispString("VREF ADC:\n");
        GUI_DispDec(ADC_ConvertedValue[1],4);
        GUI_DispString("\n");

        GUI_DispString("VREF Value:\n");                       
        GUI_DispFloat(VrefVot, 10);                         GUI_DispString("  V");
        GUI_DispString("\n");                
    }
    else if(timestate == 4)
    {
        if(rst4 == 0)
        {
            GUI_Clear();
            rst1 = 0;
            rst2 = 0;
            rst3 = 0;
            rst4 = 1;
            rst5 = 0;   
            rst6 = 0;              
        }
        GUI_DrawBitmap(&bmgirl, 0, 0);         
    }
    else if(timestate == 5)
    {
        GUI_SetBkColor(GUI_LIGHTGRAY);       
        if(rst5 == 0)
        {
            GUI_Clear();
            rst1 = 0;
            rst2 = 0;
            rst3 = 0;
            rst4 = 0;
            rst5 = 1;     
            rst6 = 0;         
        }
        GUI_SetColor(GUI_BLACK);
        GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
        GUI_SetFont(&GUI_Font8x16_ASCII);
        GUI_GotoXY(0,1);
        GUI_DispString("Temp ADC:\n");
        GUI_DispDec(ADC_ConvertedValue[0],4);
        GUI_DispString("\n");

        GUI_DispString("Temp Value:\n");                       
        GUI_DispFloat(tp, 10);                             GUI_DispString("  C");
        GUI_DispString("\n");

        GUI_DispString("VREF ADC:\n");
        GUI_DispDec(ADC_ConvertedValue[1],4);
        GUI_DispString("\n");

        GUI_DispString("VREF Value:\n");                       
        GUI_DispFloat(VrefVot, 10);                         GUI_DispString("  V");
        GUI_DispString("\n");                
    }
    else if(timestate == 6)
    {
        GUI_SetBkColor(GUI_LIGHTGRAY);
        if(rst6 == 0)
        {
            GUI_Clear();
            rst1 = 0;
            rst2 = 0;
            rst3 = 0;
            rst4 = 0;
            rst5 = 0;   
            rst6 = 1;              
        }
        GUI_SetColor(GUI_RED);
        /* 显示汉字*/               
        GUI_SetTextMode(GUI_TM_NORMAL);  
        GUI_SetFont(&GUI_Fontyahei24);            
        GUI_GotoXY(45,0);  
        GUI_DispString("\xe7\xab\xb9\xe7\x9f\xb3");
        GUI_GotoXY(35,24);  
        GUI_DispString("\xe6\xb8\x85\xc2\xb7\xe9\x83\x91\xe7\x87\xae");
        GUI_GotoXY(0,48);
        GUI_DispString("\xe5\x92\xac\xe5\xae\x9a\xe9\x9d\x92\xe5\xb1\xb1\xe4\xb8\x8d\xe6\x94\xbe\xe6\x9d\xbe\xef");
        GUI_GotoXY(0,72);
        GUI_DispString("\xe7\xab\x8b\xe6\xa0\xb9\xe5\x8e\x9f\xe5\x9c\xa8\xe7\xa0\xb4\xe5\xb2\xa9\xe4\xb8\xad\xe3");
        GUI_GotoXY(0,96);
        GUI_DispString("\xe5\x8d\x83\xe7\xa3\xa8\xe4\xb8\x87\xe5\x87\xbb\xe8\xbf\x98\xe5\x9d\x9a\xe5\x8a\xb2\xef");
        GUI_GotoXY(0,120);
        GUI_DispString("\xe4\xbb\xbb\xe5\xb0\x94\xe4\xb8\x9c\xe8\xa5\xbf\xe5\x8d\x97\xe5\x8c\x97\xe9\xa3\x8e\xe3");            
   
    }
    else
    {       
    }
    //GUI_Delay(10);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-4-8 10:26:36 | 显示全部楼层
yijianshechuan 发表于 2023-4-8 10:12
我只是Graph 用了Framewin,其余的都是直接简单的文本图片
详细代码如下
void MainTask(void)

还是不合理,你这里每次刷新Graph都会调用一次创建 CreateFramewin();
回复

使用道具 举报

14

主题

34

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2023-4-8 11:06:43 | 显示全部楼层
eric2013 发表于 2023-4-8 10:26
还是不合理,你这里每次刷新Graph都会调用一次创建 CreateFramewin();

确实如你所说的,我把CreateFramewin()做了一次判断就对了不卡了,谢谢
    {
        GUI_SetBkColor(GUI_LIGHTGRAY);
        if(rst1 == 0)
        {
            GUI_Clear();
            CreateFramewin();
            /* 初始化Graph控件 */
            rst1 = 1;
            rst2 = 0;
            rst3 = 0;
            rst4 = 0;
            rst5 = 0;
            rst6 = 0;  
        }
    /* 在这两个函数之间实现波形绘制 */
     //   while(1)
     //   {
            for(DataN = 0;DataN < 128;DataN ++)
            {
                //GRAPH_DATA_YT_AddValue(Graphdata,  ((short)tp) * 2);
                GRAPH_DATA_YT_AddValue(Graphdata,  rand() % 160);
            }
            /* 向GRAPH数据对象添加数据 */
       //   GUI_Delay(10);   
       // }
    }
回复

使用道具 举报

14

主题

34

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2023-4-8 12:19:24 | 显示全部楼层
eric2013 发表于 2023-4-8 10:26
还是不合理,你这里每次刷新Graph都会调用一次创建 CreateFramewin();


本来想结帖了,又出现另外一个问题了,想干脆就一并麻烦硬汉了,就不另开贴了,代码还是延续以上的,增加为4个曲线,问题是4条曲线开始不闪屏,为啥结尾就开始整个屏幕闪烁了,是什么原因呢?有什么办法解决吗?
刷屏闪烁.gif

代码如下

    if(timestate == 1)
    {
        //GUI_SetBkColor(GUI_LIGHTGRAY);
        if(rst1 == 0)
        {
            GUI_Clear();
            CreateFramewin();
            /* 初始化Graph控件 */
            rst1 = 1;
            rst2 = 0;
            rst3 = 0;
            rst4 = 0;
            rst5 = 0;
            rst6 = 0;  
        }
    /* 在这两个函数之间实现波形绘制 */
     //   while(1)
     //   {
            //for(DataN = 0;DataN < 128;DataN ++)
            //{
                GRAPH_DATA_YT_AddValue(Graphdata,  ((short)tp));
                GRAPH_DATA_YT_AddValue(Graphdata1,  ((short)tp) + 20);
                GRAPH_DATA_YT_AddValue(Graphdata2,  ((short)tp) + 60);
                GRAPH_DATA_YT_AddValue(Graphdata3,  ((short)tp) + 100);
            //}
            /* 向GRAPH数据对象添加数据 */
       //   GUI_Delay(10);   
       // }
    }

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-4-9 03:56:09 | 显示全部楼层
yijianshechuan 发表于 2023-4-8 12:19
本来想结帖了,又出现另外一个问题了,想干脆就一并麻烦硬汉了,就不另开贴了,代码还是延续以上的,增 ...

窗口存储设备开启了吧,如果开启了应该不会闪烁。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 18:20 , Processed in 0.178542 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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