waterx3 发表于 2022-6-7 10:23:49

请教任务的绝对延时问题

一个任务,希望的绝对延时时间是100ms,在任务里调用一个含信号量超时等待的函数,这个函数的超时时间设置为1000ms,用于判定外部设备是否连接,实际运行中无超时。现在的问题,在任务循环的头尾处,增加了2个osKernelGetTickCount,做减法计算任务的延时时间,并不是100,有多也有少,这种情况怎么才能做的绝对延时100ms。

eric2013 发表于 2022-6-7 13:34:31

waterx3 发表于 2022-6-7 13:44:42

eric2013 发表于 2022-6-7 13:34


就是用的osDelayUntil这个API。

waterx3 发表于 2022-6-7 13:48:19

      uint32_t t;
        uint32_t tick;
        tick = osKernelGetTickCount();                       
        while(1)
        {
                t = osKernelGetTickCount();
                tick += 100U;       
                osDelayUntil(tick);               
                osSemaphoreAcquire(sem, 1000);
                t = osKernelGetTickCount() - t;               
        }

waterx3 发表于 2022-6-7 13:49:11

程序结构上就是这样,t不是100,有多有少

waterx3 发表于 2022-6-7 14:26:16

修改为t++,注释掉减法,在另一个1秒的任务里观察t,t每次有10个数的变化,说明延时是对的,那么原来的减法有什么问题?

eric2013 发表于 2022-6-7 15:57:19

waterx3 发表于 2022-6-7 13:48
uint32_t t;
        uint32_t tick;
        tick = osKernelGetTickCount();                       


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

caicaptain2 发表于 2022-6-17 09:48:50

可以试试使用任务调度锁。 在绝对延时的时候,禁止任务调度。
页: [1]
查看完整版本: 请教任务的绝对延时问题