硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2406|回复: 6
收起左侧

[FreeRTOS] FreeRTOS 中的 delay 函数

[复制链接]

14

主题

38

回帖

80

积分

初级会员

积分
80
发表于 2024-9-30 15:13:28 | 显示全部楼层 |阅读模式
本帖最后由 shiinakaze 于 2024-10-1 21:05 编辑

在 FreeRTOS 中,SysTick 被用于作为调度器的一部分进行任务调度,那么如果我需要使用软件模拟通信,例如软件 I2C,需要使用 delay,就无法使用 SysTick 实现的 delay

[C] 纯文本查看 复制代码
void Delay_us(uint32_t usec)
{
    if (usec > 0)
    {

        SysTick->LOAD = SYSTICK_LOAD * usec;          // Set systick reload value
        SysTick->VAL = 0x00;                                  // Set SysTick Current Value to 0
        SysTick->CTRL = 0x00000005;                          // Set SysTick clock source to use processor clock and enable timer
        while (!(SysTick->CTRL & 0x00010000)) // Wait for the timer to count to 0
        {
        }
        //    SysTick->CTRL = 0x00000004; // Disable timer
    }
}



我的方法是另外开一个定时器 TIM2,来帮忙实现 delay 函数,那么是否有更好的办法呢?

[C] 纯文本查看 复制代码

void Delay_us(uint32_t usec)
{
    if (usec > 0)
    {

        TIM2->CNT = usec - 1;          // Load the counter with the number to decrement. When it is reduced to 0, the TIM_FLAG_UpDate flag of the timer is triggered
        TIM2->CR1 |= TIM_CR1_CEN; // Enable counter
        while ((TIM2->SR & TIM_FLAG_Update) != SET)
        {
            // Wait until the counter goes down to 0
        }
        TIM2->CR1 &= ~TIM_CR1_CEN;          // Disable counter
        TIM2->SR &= ~TIM_FLAG_Update; // Clear TIM_FLAG_UpDate
    }
}








回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2024-9-30 17:51:50 | 显示全部楼层
RTOS把Systick占了,常见的作法是给你的delay另外开一个时基,可以用定时器来当这个时基。
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2024-9-30 17:52:44 | 显示全部楼层
硬汉哥在其他贴里回答过类似的问题,他的做法好像是用dwt。。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-9-30 19:26:04 | 显示全部楼层
1000008612.png

可以参考一下这个,每次延时时没有重置Systick,也不用进中断
ms级延时很准,但个位数us延时要比给定的数字稍大一点

评分

参与人数 1金币 +1 收起 理由
shiinakaze + 1 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-10-1 01:06:29 | 显示全部楼层
DWT实现一个精确微秒延迟的参考例程
https://forum.anfulai.cn/forum.p ... 9128&fromuid=58
(出处: 硬汉嵌入式论坛)

评分

参与人数 1金币 +1 收起 理由
shiinakaze + 1 很给力!

查看全部评分

回复

使用道具 举报

4

主题

412

回帖

424

积分

高级会员

积分
424
发表于 2024-10-1 23:58:27 | 显示全部楼层
用perf_counter吧,支持RTE添加

超级嵌入式系统“性能/时间”工具箱
https://mp.weixin.qq.com/s?__biz ... 3306887377436672#rd

https://github.com/GorgonMeducer/perf_counter.git
回复

使用道具 举报

14

主题

38

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2024-10-3 12:38:31 | 显示全部楼层
cctv180 发表于 2024-10-1 23:58
用perf_counter吧,支持RTE添加

超级嵌入式系统“性能/时间”工具箱

这是大佬写的吗?太强了,还顺便写了 CMSIS-Pack
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 03:20 , Processed in 0.045991 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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