反馈:文档中[高精度延时]的函数rt_hw_us_delay()实现代码没有更新

发布于 2020-11-16 15:51:24

QQ截图20201116153456.jpg

这个实现方式,即使不超过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()不会再退出。

查看更多

关注者
0
被浏览
100
1 个回答
crystal
crystal 2020-11-24

不是你这么理解的,首先这个tick计数器是递减的,其次假如你延时10个us对应的tick数是10,那么从现在开始,delta就是获取当前开始的tick数记录下来假如是50,由于tick是递减的,也就是减到40就退出了,40怎么来的?就是不停的判断delta-当前tick是否大于10,大了就退出,小了就循环判断。之所以不超出一个OStick是因为可能存在tick计数器递减溢出的情况

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览