硬汉嵌入式论坛

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

[RL-RTX] 请教任务的绝对延时问题

[复制链接]

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2022-6-7 10:23:49 | 显示全部楼层 |阅读模式
一个任务,希望的绝对延时时间是100ms,在任务里调用一个含信号量超时等待的函数,这个函数的超时时间设置为1000ms,用于判定外部设备是否连接,实际运行中无超时。现在的问题,在任务循环的头尾处,增加了2个osKernelGetTickCount,做减法计算任务的延时时间,并不是100,有多也有少,这种情况怎么才能做的绝对延时100ms。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2022-6-7 13:34:31 | 显示全部楼层
image.png
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
 楼主| 发表于 2022-6-7 13:44:42 | 显示全部楼层

就是用的osDelayUntil这个API。
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
 楼主| 发表于 2022-6-7 13:48:19 | 显示全部楼层
        uint32_t t[2];
        uint32_t tick;
        tick = osKernelGetTickCount();                       
        while(1)
        {
                t[0] = osKernelGetTickCount();
                tick += 100U;       
                osDelayUntil(tick);               
                osSemaphoreAcquire(sem, 1000);
                t[1] = osKernelGetTickCount() - t[0];               
        }
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
 楼主| 发表于 2022-6-7 13:49:11 | 显示全部楼层
程序结构上就是这样,t[1]不是100,有多有少
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
 楼主| 发表于 2022-6-7 14:26:16 | 显示全部楼层
修改为t[1]++,注释掉减法,在另一个1秒的任务里观察t[1],t[1]每次有10个数的变化,说明延时是对的,那么原来的减法有什么问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2022-6-7 15:57:19 | 显示全部楼层
waterx3 发表于 2022-6-7 13:48
uint32_t t[2];
        uint32_t tick;
        tick = osKernelGetTickCount();                       

绝对延迟玩法不适合在里面在倒腾其它API了、
回复

使用道具 举报

332

主题

2031

回帖

3032

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3032
发表于 2022-6-17 09:48:50 | 显示全部楼层
可以试试使用任务调度锁。 在绝对延时的时候,禁止任务调度。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 16:30 , Processed in 0.278484 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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