vb2002 发表于 2025-1-12 19:04:25

定时器分时任务调度怎么清零task里面的某一个函数

定时器分时任务调度怎么清零task里面的某一个函数

比如说我定时器是1ms进入一次
有三个任务,
第一个任务1ms进一次.这个没问题
第二个任务100ms进一次,勉勉强强也没问题, 误差也就是1-9ms
第三个任务如果我设置5000ms 进一次. 现在我就是这里出了个问题

有时候4955ms进一次.有时候200ms进一次. 导致这第一次计时会有5秒内的误差
问题在于第一次进中断的时候, 我控制不了这个5000ms到哪里了.想半天也没想到在哪里可以让这5000ms 从0开始

vb2002 发表于 2025-1-12 19:07:03

任务开始时我清零了计数器
任务结束后我也清零了计数器
但是这个task里面的5000ms 始终是个随机值

vb2002 发表于 2025-1-12 19:24:52

类似于这样子按键扫描没问题, adc采集也没问题
按键我是什么时候开始按,就有误差了.
比如我要定时1分钟, 那就是设置个变量 time_out ++. 到达12就是一分钟 (有个解决办法就是把time 不要设置5000 ,就50行了. 把time_out变量增大.这个可以解决问题. )
那当我按下按键的时候, 定时1分钟有时候是 55秒,有时候是59秒
没办法让第三个任务从我开始按下那个时候清零.
他从开机就一直0-5000的计数

{0,      1,    1,    Key_Scan},                /* task 1 Period: 按键扫描*/         
{0,      1,   2,   ADC_Isr},         /* task 2 Period: ADC采集数据*/
{0,      5000,5000,    time},      /* task 3 Period: 按键开启定时开关*/

小飞侠 发表于 2025-1-13 07:21:57

这是数据原子操作的问题,看我以前的帖子https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11928

VCC 发表于 2025-1-15 19:23:41

楼上说得对。

楼主要不发一下完整代码?

vb2002 发表于 2025-1-15 19:39:06

VCC 发表于 2025-1-15 19:23
楼上说得对。

楼主要不发一下完整代码?

主要是按键开始计时,那个开始task.c那里

中断值是随机的

lzzasd 发表于 2025-2-21 22:20:20

你说的不可能发生    延时也就是延时下一个任务周期而已   任务延时不可能这么长时间   
所有的任务计数都是中断中全部刷新的    每次减一减到0就在任务格构体第一位置1   表示任务就绪   任务完成后切换主程序会依次巡检下一个任务有没有就绪    就绪了就进入执行    所以说延时很长时间的说法不成立   最有可能是上一任务有阻塞延时   任务一直没有结束而没有进入任务切换程序   

vb2002 发表于 2025-2-22 10:00:01

lzzasd 发表于 2025-2-21 22:20
你说的不可能发生    延时也就是延时下一个任务周期而已   任务延时不可能这么长时间   
所有的任务计数都 ...

解决方案就是把定时任务周期缩短,让这个误差变小.
确实是没办法

王昱顺 发表于 2025-2-22 12:24:59

vb2002 发表于 2025-2-22 10:00
解决方案就是把定时任务周期缩短,让这个误差变小.
确实是没办法

因为这个不是使用操作系统的那种做现场保护然后切换任务,仅仅是软定时器调用对应的函数而已。
如果函数内使用了堵塞操作,一样是会影响到其他让任务的执行的。
页: [1]
查看完整版本: 定时器分时任务调度怎么清零task里面的某一个函数