定时器分时任务调度怎么清零task里面的某一个函数
定时器分时任务调度怎么清零task里面的某一个函数比如说我定时器是1ms进入一次
有三个任务,
第一个任务1ms进一次.这个没问题
第二个任务100ms进一次,勉勉强强也没问题, 误差也就是1-9ms
第三个任务如果我设置5000ms 进一次. 现在我就是这里出了个问题
有时候4955ms进一次.有时候200ms进一次. 导致这第一次计时会有5秒内的误差
问题在于第一次进中断的时候, 我控制不了这个5000ms到哪里了.想半天也没想到在哪里可以让这5000ms 从0开始
任务开始时我清零了计数器
任务结束后我也清零了计数器
但是这个task里面的5000ms 始终是个随机值 类似于这样子按键扫描没问题, 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: 按键开启定时开关*/ 这是数据原子操作的问题,看我以前的帖子https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11928 楼上说得对。
楼主要不发一下完整代码? VCC 发表于 2025-1-15 19:23
楼上说得对。
楼主要不发一下完整代码?
主要是按键开始计时,那个开始task.c那里
中断值是随机的
你说的不可能发生 延时也就是延时下一个任务周期而已 任务延时不可能这么长时间
所有的任务计数都是中断中全部刷新的 每次减一减到0就在任务格构体第一位置1 表示任务就绪 任务完成后切换主程序会依次巡检下一个任务有没有就绪 就绪了就进入执行 所以说延时很长时间的说法不成立 最有可能是上一任务有阻塞延时 任务一直没有结束而没有进入任务切换程序
lzzasd 发表于 2025-2-21 22:20
你说的不可能发生 延时也就是延时下一个任务周期而已 任务延时不可能这么长时间
所有的任务计数都 ...
解决方案就是把定时任务周期缩短,让这个误差变小.
确实是没办法 vb2002 发表于 2025-2-22 10:00
解决方案就是把定时任务周期缩短,让这个误差变小.
确实是没办法
因为这个不是使用操作系统的那种做现场保护然后切换任务,仅仅是软定时器调用对应的函数而已。
如果函数内使用了堵塞操作,一样是会影响到其他让任务的执行的。
页:
[1]