OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4978|回复: 3

ucos和FreeRtos的us级别延时问题

[复制链接]

12

主题

21

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2022-10-18
在线时间
13 小时
发表于 2022-10-23 16:36:06 | 显示全部楼层 |阅读模式
3金钱
ucos中能利用sistick实现us级别的延时吗?FreeRtos中我知道不能利用系统时钟的重装载功能。
今天看到室友在看原子的代码,貌似delay_us是用的系统时钟写的,有大佬讲解一下吗。

最佳答案

查看完整内容[请看2#楼]

us的延时 不用RTOS的情况下 原子的延时是用systick的轮询做的 把延时的时间交给systick 数到0关闭定时器 用RTOS的时候 因为定时器不能关掉 原子就改成延时前记录VAL值 然后在此基础上计算延时后的值 在这里循环等待这个值或者超过这个值就代表延时时间已到 这是FreeRTOS例程里的delay函数 //延时nus //nus:要延时的us数. //nus:0~204522252(最大值即2^32/fac_us@fac_us=168) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-10-23 16:36:07 | 显示全部楼层
zzr在这里 发表于 2022-10-24 14:05
那再FreeRtos里面,实现us级别的延时是不是不能运用滴答定时器来写。ucos里面可以写哎,我就是想知道一下 ...

us的延时 不用RTOS的情况下 原子的延时是用systick的轮询做的 把延时的时间交给systick 数到0关闭定时器
用RTOS的时候 因为定时器不能关掉 原子就改成延时前记录VAL值 然后在此基础上计算延时后的值 在这里循环等待这个值或者超过这个值就代表延时时间已到

这是FreeRTOS例程里的delay函数
//延时nus
//nus:要延时的us数.        
//nus:0~204522252(最大值即2^32/fac_us@fac_us=168)                                                                              
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        ticks=nus*fac_us;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;        
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };                                                                                    
}  
回复

使用道具 举报

17

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2022-7-21
在线时间
446 小时
发表于 2022-10-24 10:59:37 | 显示全部楼层
freertos的时钟是滴答定时器的
Snipaste_2022-10-24_10-59-10.png
回复

使用道具 举报

12

主题

21

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2022-10-18
在线时间
13 小时
 楼主| 发表于 2022-10-24 14:05:45 | 显示全部楼层
还在忙 发表于 2022-10-24 10:59
freertos的时钟是滴答定时器的

那再FreeRtos里面,实现us级别的延时是不是不能运用滴答定时器来写。ucos里面可以写哎,我就是想知道一下这是为啥,,,好奇
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 22:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表