想在拉高电平后延时20ms, 使用示波器查看发现并没有20ms的延时, 故直接打印看了一下.
发现tick的值没有20ms的变化. 这是什么造成的呢?
没有在中断中使用.
这是打印的两次tick的值:
rt-thread 4.0.3
使用类似:
用这个rt_thread_delay_until
,
然后测试用例在rtt仓库都有,我摘取一段如下:
做了个测试:
打印的内容如下:
12-08 08:07:43 D/TASK: 463334
12-08 08:07:43 D/TASK: 463334
12-08 08:07:43 D/TASK: 11111111111
12-08 08:07:43 D/TASK: 463374
12-08 08:07:43 D/TASK: 463374
12-08 08:07:43 D/TASK: 11111111111
12-08 08:07:43 D/TASK: 463414
12-08 08:07:43 D/TASK: 463414
12-08 08:07:43 D/TASK: 11111111111
走了40ms!!!!’
怎样才能中间停20ms去做其他的事再接着这个task继续跑呢?
又做了个测试, 没有加while(1), 结果就是对的
打印如下:
01-01 00:00:00 D/S: 168
01-01 00:00:00 D/S: 469
12-08 08:00:01 D/S: 1472
12-08 08:00:01 D/S: 1672
昨天弄的时候, 专门看了一下, 优化等级为0
@ZMJJ_5836 你看一下汇编,是不是 rt_tick_get 的返回值放在某寄存器里,第二次仍然用的这个寄存器的值,并没有再次调用 rt_tick_get
@出出啊
怎么只保留delay的情况下, 还让那20ms生效?
是先用示波器看时序, 发现的拉高pin A后, 没有delay,直接拉高pin B, 后面才加的打印信息找问题.
@ZMJJ_5836 你这么说不是 rt_tick_get 返回值一样,是 rt_thread_mdelay 调用没有睡眠直接返回了?
@出出啊 对对对对, rt_tick_get那个, 是后面用了查问题的, 用示波器看电平拉高后确实没有任何delay直接进行下一个引脚的控制. 最后delay补在了while(1)里最后的那个里面
@ZMJJ_5836 上面所有的例子都是在线程里跑的吗?不会是在中断里跑的延时吧
@出出啊 对, 找打问题了, 在thread中跑, 但是加了临界区😨