这个实现方式,即使不超过1个OS Tick,也会出现问题。
比如下面的情况:us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND));
之后,`us=500;
delta = SysTick->VAL;之后,
delta=300;`
那么,while(delta - SysTick->VAL< us);
等效于while (300 - SysTick->VAL < 500);
SysTick->VAL
是一个非负数,所以(300 - SysTick->VAL < 500)
总是成立,这个whiel()
不会再退出。
“delta就是获取当前开始的tick数记录下来假如是50,”,是运行到“delta = SysTick->VAL;”的时候delta = 50。
假设运行到“delta = SysTick->VAL;”的时候delta = 5,请问这种情况下rt_hw_us_delay()什么时候退出?
运行到“delta = SysTick->VAL;”的时候,有可能delta > us,也有可能delta < us。
你假设的只是delta > us的情况。
RTT的后续代码已经更新了rt_hw_us_delay()的实现,考虑了delta < us的情况。
请参考此帖最新rt_hw_us_delay异常
我反馈的问题只是“代码更新了,文档没有相应更新”。