硬汉嵌入式论坛

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

[FreeRTOS] emWin任务对FreeRTOS时间的影响

[复制链接]

8

主题

29

回帖

53

积分

初级会员

积分
53
发表于 2018-5-9 10:59:45 | 显示全部楼层 |阅读模式
本帖最后由 fendoushuai 于 2018-5-9 11:22 编辑

在FreeRTOS中创建了8个任务,包括一个emWin显示的任务和任务运行计时任务,emWin任务优先级最低,为1;时间统计任务优先级最高,为8
正常运行时FreeRTOS的计时时间和RTC时间总是会差一些,大概每分钟差4秒左右,但是关闭emWin任务后,FreeRTOS的计时时间和RTC时间会保持一致。

麻烦大神帮忙分析下,谢谢。

emWin任务函数如下:
void TASK1(void *pvParameters)        //ZLJ GUI
{
        #if GUI_WINSUPPORT
                WM_SetCreateFlags(WM_CF_MEMDEV);
        #endif
        GUI_Init();
        #if GUI_WINSUPPORT
                WM_MULTIBUF_Enable(1);
        #endif
        MainTask_ZLJ();
        for(;;)
        {                        
                GUI_Delay(5);
                vTaskDelay(30);
        }
}




FreeRTOS时间统计任务如下:
void TASK2(void *pvParameters)        //GUI Time Update
{        
        for(;;)
        {
                WM_InvalidateArea(&Circle_Rect_time);//更新时间显示区域
//                WM_InvalidateWindow(hPage[page_no]);
                second++;
                if(second>59)
                {second=0;minute++;}
                if(minute>59)
                {minute=0;hour++;}
                if(hour>99)
                {hour=0;}
                vTaskDelay(1000);
        }
}

测试的时候我将WM_InvalidateArea(&Circle_Rect_time);//更新时间显示区域注释掉了,那么FreeRTOS的时间也和RTC一致了,但是界面显示的实现没法实时更新了!



回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2018-5-9 11:54:04 | 显示全部楼层
现在问题就是emWin刷新界面时会影响FreeRTOS的计时,这是什么原因啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2018-5-9 13:31:01 | 显示全部楼层
1、GUI_Delay(5);
     vTaskDelay(30); 仅需要调用GUI_Delay即可。

2、更新时间无需 WM_InvalidateArea(&Circle_Rect_time);这种方式,你在给emWin的窗口创建emWin自己支持的定时器即可。
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2018-5-9 14:33:53 | 显示全部楼层
eric2013 发表于 2018-5-9 13:31
1、GUI_Delay(5);
     vTaskDelay(30); 仅需要调用GUI_Delay即可。

使用emWin定时器的话,如何将定时器与FreeRTOS的时间进行同步呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2018-5-9 15:00:35 | 显示全部楼层
fendoushuai 发表于 2018-5-9 14:33
使用emWin定时器的话,如何将定时器与FreeRTOS的时间进行同步呢?

不用同步,emWin的定时器是基于FreeRTOS的时间基准的,即systick中断。
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2018-5-9 16:29:24 | 显示全部楼层
eric2013 发表于 2018-5-9 15:00
不用同步,emWin的定时器是基于FreeRTOS的时间基准的,即systick中断。

时间还是不统一,每分钟差2秒左右。我把emWin任务的优先级设置为最高了,也还是不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2018-5-10 01:42:23 | 显示全部楼层
fendoushuai 发表于 2018-5-9 16:29
时间还是不统一,每分钟差2秒左右。我把emWin任务的优先级设置为最高了,也还是不行

你这种运行的任务做计数,RTC的时间和FreeRTOS不统一是正常的,你要统一的话,获取FreeRTOS的系统时钟节拍做为计数即可。
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2018-5-10 09:08:35 | 显示全部楼层
eric2013 发表于 2018-5-10 01:42
你这种运行的任务做计数,RTC的时间和FreeRTOS不统一是正常的,你要统一的话,获取FreeRTOS的系统时钟节 ...

循环获取时钟节拍进行判断的话那就无法进行任务切换了,别的任务执行会受影响
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2018-5-10 10:59:33 | 显示全部楼层
fendoushuai 发表于 2018-5-10 09:08
循环获取时钟节拍进行判断的话那就无法进行任务切换了,别的任务执行会受影响

延迟继续调用,不影响你延迟的调用的。
回复

使用道具 举报

8

主题

29

回帖

53

积分

初级会员

积分
53
 楼主| 发表于 2018-5-10 11:19:08 | 显示全部楼层
eric2013 发表于 2018-5-10 10:59
延迟继续调用,不影响你延迟的调用的。

我把时间统计直接通过用systemstick计算得到了,atime是在程序启动时读取的值,btime是每500ms读一次值

second=((btime-atime)/20000)%60;
minute=(((btime-atime)/20000)/60)%60;
hour=(((btime-atime)/20000)/3600)%24;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 07:45 , Processed in 0.175849 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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