硬汉嵌入式论坛

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

[emWin] ucGUI的存储设备功能和uCOSIII的延时函数OSTimeDlyHMSM之间的冲突问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2019-4-13 12:40:28 | 显示全部楼层 |阅读模式
在ucosIII中使用了ucGUI的存储设备功能GUI_MEMDEV_DrawAuto()之后,uCOS的延时函数就相当不准确了,比如我想延时个10ms,结果延时的结果可能之后5ms,并且这个延时的时间值来回跳动不稳定。
代码如下
task1()
{
    while(1)
    {
        P00_L;
        OSTimeDlyHMSM(0, 0, 0, 10,OS_OPT_TIME_HMSM_STRICT,&err);
        P00_H;
        OSTimeDlyHMSM(0, 0, 0, 100,OS_OPT_TIME_HMSM_STRICT,&err);
    }
}

static void _Draw()
{
//这个函数里只有一个画图函数
GUI_DrawBitmap(...);
}
task2()
{
    while(1)
    {
        OSTimeDlyHMSM(0, 0, 0, 50,OS_OPT_TIME_HMSM_STRICT,&err);
        GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, _Draw, &Param);
    }
}

如果只有任务1,则延时一切正常。如果开启了任务2,则任务1中的延时时间就在10ms附近来回跳动,如果延时时间比10ms大,我还能理解。但是延时时间少于10ms的,我理解不了。。。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2019-4-13 12:41:19 | 显示全部楼层
有没有高人知道这是什么情况?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-13 13:43:09 | 显示全部楼层
上uC/Probe,检测所有任务执行情况。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2019-4-13 13:58:04 | 显示全部楼层
eric2013 发表于 2019-4-13 13:43
上uC/Probe,检测所有任务执行情况。

我真正的程序中,Task2和Task3中用了GUI的存储设备,Task9中是测试OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err)延时10ms,在这延时内stm32的一个管脚我给置低电平。
360截图20190413135111389.jpg

cb29733a34568e22b1df7627dac19c15.mp4

2.31 MB, 下载次数: 13

示波器测量的管脚电平,延时10ms

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-13 14:01:21 | 显示全部楼层
看你的uCOS时钟节拍整的多少,是不是整了个100Hz的
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2019-4-13 14:12:10 | 显示全部楼层
eric2013 发表于 2019-4-13 14:01
看你的uCOS时钟节拍整的多少,是不是整了个100Hz的

时钟节拍这些没问题,加入我把Task2和Task3中的关于emWin的使用存储设备的函数(GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, _Draw, &Param))给注销掉,这个10ms的延时就一点问题没有,完美的很。
360截图20190413140852092.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-13 14:21:25 | 显示全部楼层
看了半天终于明白你问题了。

你的GUI任务优先级太高了,你看看你的CPU刷新率,基本一直在90%左右,其它任务基本没有执行的机会。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2019-4-13 14:31:37 | 显示全部楼层
eric2013 发表于 2019-4-13 14:21
看了半天终于明白你问题了。

你的GUI任务优先级太高了,你看看你的CPU刷新率,基本一直在90%左右,其它 ...

我等会儿改下代码,降低下gui的CPU占有率。其实我比较好奇一点就是:Task9中我明明用OSTimeDlyHMSM()延时了10ms,即使其它任务中优先级较高且占有CPU时间太长,那我Task9中的延时应该高于10ms才是,但为什么我测试时发现还会出现少于10ms的情况呢,并且少了不仅一点点,一半都有了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-13 14:38:06 | 显示全部楼层
WISH.东阳 发表于 2019-4-13 14:31
我等会儿改下代码,降低下gui的CPU占有率。其实我比较好奇一点就是:Task9中我明明用OSTimeDlyHMSM()延时 ...

强烈建议所有GUI任务优先级仅仅比空闲和统计任务高即可,其它任务都要比GUI任务高,这样你再测试就正常,如果这样还不正常就是你程序设计有问题了。

GUI的很多操作都是比较耗时间,严重影响系统实时性。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2019-4-13 16:24:32 | 显示全部楼层
eric2013 发表于 2019-4-13 14:38
强烈建议所有GUI任务优先级仅仅比空闲和统计任务高即可,其它任务都要比GUI任务高,这样你再测试就正常, ...

把GUI的CPU占用率降低后果真好了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 19:27 , Processed in 0.540442 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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