FreeRTOS中时钟理解

文章详细介绍了STM32微控制器的时钟配置,特别是SYSCLK如何通过PLL达到72MHz,以及AHB分频器的工作。接着,重点讨论了Cortex-M3的FCLK(CPU主频)和嘀嗒定时器(SYSTICK)在FreeRTOS中的应用,包括其时钟源选择、中断频率和寄存器配置。同时,提到了任务调度相关的函数如xTaskDelay及其工作原理。
摘要由CSDN通过智能技术生成

 先看下stm32时钟树

 虽然SYSCLK有多种时钟源,但一般不用我们管,ST提供的标准库函数已经配置了,选择的时钟源是外部8MHZ晶振经过PLL锁相环9倍频,即SYSCLK默认是72MHZ,然后过AHB分频器,对应寄存器默认为0,即1分频(不分频),即AHB默认也是72MHZ。

其余分支不管,看Cortex系统时钟(SYSTICK)和FCLK自由运行时钟(内核时钟SystemCoreClock)

Cortex系统时钟就是SysTick,即系统嘀嗒定时器,时钟源有两个,外部时钟源STCLK和内核时钟源FCLK。FreeRTOS默认是内核时钟源,就不用除以8,而FCLK又和HCLK同步,所以一般为72MHZ。如果选择外部时钟源,就要除以8,所以一般为72/8=9MHZ。

Fclk为供给CPU内核的时钟信号,我们所说的cpu主频为XXXXMHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期;

 FCLK 为处理器的自由振荡的处理器时钟,用来采样中断和为调试模块计时。在处理器休眠时,通过FCLK 保证可以采样到中断和跟踪休眠事件。 Cortex-M3内核的“自由运行时钟(free running clock)”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK 也继续运行。FCLK和HCLK 互相同步。FCLK 是一个自由振荡的HCLK。FCLK 和HCLK 应该互相平衡,保证进入Cortex-M3 时的延迟相同。

好了,看一下FreeRTOS里的配置

在FreeRTOSConfig.h里 ,configCPU_CLOCK_HZ是CPU主频,即FCLK,72MHZ。configTICK_RATE_HZ,是 抵达定时器的中断频率。

查看configCPU_CLOCK_HZ的引用,跳转到port.c如下,第一个是配置嘀嗒定时器的LOAD寄存器,第二个是配置CTRL寄存器。1UL 表示 无符号长整型 1。,在keil编译器里long是4字节,即32位。还有一个清除当前数字寄存器

 下面是对应宏定义,刚好对应嘀嗒定时器寄存器地址,一个重装寄存器,一个配置寄存器。还有一个当前数字寄存器。这些地址宏定义在port.c里定义的。

先看第一个LOAD寄存器,转到configSYSTICK_CLOCK_HZ定义,发现configSYSTICK_CLOCK_HZ是configCPU_CLOCK_HZ的宏定义,即72MHZ。(72M/1000)-1UL=72K-1UL

再看CTRL寄存器,跳转到对应参数的定义,CLK_BIT对应CTRL的第2位,即时钟源选择,1UL<<2UL就是选择内核时钟FCLK作为嘀嗒定时器的时钟源,

 INT_BIT和ENABLE_BIT分别对应寄存器第1位和第0位,这里都设为了0,分别表示SYSTICK计数器数到0产生异常请求、使能嘀嗒定时器。

再看当前数值寄存器,读取就会返回当前计数器的值,写它就清零,这个可能与获取当前嘀嗒数有关。

xTaskGetTickCount() :用于查询任务调度器从启动到现在时间计数器xTickCount的值。xTickCount是系统的时钟节拍值,并不是真实的时间值。每个滴答定时器中断xTickCount就会加一,中断周期取决于系统时钟节拍数

关于xTaskDelay和Delay,我还没研究,猜想xTaskDelay是当前任务进入阻塞状态,其他任务可以运行,Delay是延时,所有任务都无法执行。

xTaskDelay和xTaskDelayUtil

任务只能一次执行一个tick,说的是没有调用vTaskDelay或其他中断的时候,当下一个tick中断发生,就会发生一次调度,当然,调度后可以依旧是那个任务运行,调度其实就是对任务状态的链表进行操作。

下面是xTaskDelay函数,先将所有任务放入SusPend链表,然后将需要阻塞的任务放入Delay链表,再恢复任务。然后触发一次任务调度。

 portYIELD触发一次任务调度,这个函数在空闲任务里也调用了,用于礼让

 

 

 

FreeRTOS时钟节拍是通过滴答定时器来实现的。滴答定时器是FreeRTOS的一个组件,它以一定的时间间隔产生一个信号,作为操作系统的时钟节。这个断信号触发后,操作系统会执行相应的任务调度和时间管理操作。通过配置主PLL,我们可以得到系统的主时钟SYSCLK,然后可以使用这个时钟来驱动滴答定时器。 关于系统时钟的设置流程,在STM32F407这款处理器上,主PLL时钟是通过将两个时钟源(HIS信号和HSE信号)经过倍频、分频等操作来产生更高频率的时钟信号。然后,一般会选择主PLL产生的时钟作为系统时钟(SYSCLK)。因此,操作系统的时钟节拍也就是由这个系统时钟来驱动的。 综上所述,FreeRTOS时钟节拍是通过滴答定时器来实现的,而滴答定时器的时钟源是系统的主时钟SYSCLK,它是通过配置主PLL来获得的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [FreeRTOS系列二:FreeRTOS系统配置](https://blog.csdn.net/qq_51519091/article/details/131363918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [FreeRTOS的学习(六)——系统时钟](https://blog.csdn.net/qq_39397153/article/details/124609008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值