首页 > 其他分享 >【FreeRTOS复盘】3-FreeRTOS系统的时钟节拍和延时函数

【FreeRTOS复盘】3-FreeRTOS系统的时钟节拍和延时函数

时间:2023-06-27 09:44:40浏览次数:54  
标签:FreeRTOS 中断 节拍 延时 SysTick 复盘 时钟

参考文章1:《FreeRTOS的学习(六)——系统时钟》

参考文章2:【FreeRTOS】04 系统的时钟节拍和延时函数

 

原理

reeRTOS使用裸机自带的滴答定时器中断,使用其主频或者外部频率作为时钟基准。由于定时器的功能作为FreeRTOS的核心,所以正常情况下必须是一个一直运行着的中断,那么就意味着FreeRTOS庞大的代码量也必须与此中断相互配合,保证实时性和可靠性,因此滴答定时器的中断时间必然是不能太短的,否则将大大影响FreeRTOS的实时性。我们直接来看配置的代码:

 1 void delay_init()
 2 {
 3     u32 reload;
 4     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择内部时钟  HCLK
 5     fac_us=SystemCoreClock/1000000;                //不论是否使用OS,fac_us都需要使用
 7     reload=SystemCoreClock/configTICK_RATE_HZ;            //根据configTICK_RATE_HZ设定溢出时间
 8                                                 //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右    
 9     fac_ms=1000/configTICK_RATE_HZ;                //代表OS可以延时的最少单位       
10 
11     SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;       //开启SYSTICK中断
12     SysTick->LOAD=reload;                         //每1/configTICK_RATE_HZ秒中断一次    
13     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;       //开启SYSTICK    
14 }

通过控制SysTick寄存器的几个地址可以实现开启中断,设定中断频率,开启/关闭SysTick的功能。
其中,reload作为中断的频率,其计算过程较为重要,需要根据系统时钟设定。本人使用的是stm32f103,系统主频为72M,那么也就意味着,stm32在1s内可以计数72M个。那么只要控制reload的值,每次计数结束后产生一次中断就可以了。所以引入configTICK_RATE_HZ的变量,用于方便调整滴答定时器的中断频率。具体的计算相对简单,可自行尝试。

FreeRTOS通过全局变量xTickCount的计数以及在SysTick的中断函数里的操作与逻辑之间形成了联系。下面给出了**SysTick_Handler()**的中断内部函数:

1 void SysTick_Handler(void)
2 {
3     if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//判断系统是否已经运行
4     {
5         xPortSysTickHandler();
6     }
7 }
 1 void xPortSysTickHandler( void )
 2 {
 3     //执行SysTick_Handler中断函数时,为了保证在freertos中属于最低优先级的此中断能顺利执行,
 4     //故要关闭FreeRTOS的所有可管理中断,保证系统计数时不被打断。
 5     vPortRaiseBASEPRI();  //关中断
 6     {
 7         if( xTaskIncrementTick() != pdFALSE )  //判断返回值,如果为pdTURE就要进行一次上下文切换
 8         {
 9             portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
10         }
11     }
12     vPortClearBASEPRIFromISR();  //开中断
13 }

 

为了保证计数的正常执行,需要先关闭系统中断,但是值得注意的是,FreeRTOS系统可关闭的中断都是系统级的,一般还有优先级在5以上的几个中断不受其管理,具体可见之前写的中断机制相关内容。那么也就不可避免地,计数会被这种情况打断,至少目前为止,以我学习到的内容来考虑,使用了RTOS就不太适合使用其他高优先级的大段大段主体内容的中断函数了,会对RTOS的运行产生极大的影响。所以系统外的高优先级中断一般都是短且对实时性要求高的,用于诸如一些紧急情况,需要紧急处理的。

系统的滴答定时器中断像是定时检查的功能,主要是列表溢出检查,任务唤醒检查,是否唤醒的任务要进行调度或者抢占式任务要进行调度等功能。

应用

操作系统的时钟节拍,是用于系统计时的;有了时钟节拍这个计时器,操作系统就能知道时间过去了多少周期,便于处理延时、超时等等与时间相关的操作。

一般情况下,时钟节拍是一个定时器中断,周期性地进入中断更新计数器,以计数器的值去指示走过了多少节拍。

时钟节拍的周期需要依据具体任务的特点来确定,一般为1ms~100ms。如果实时性要求高,需要任务响应较快,则节拍设置得短一些;如果实时性要求低,可以设置得长一些。如果设置的节拍短,那么系统对时间的控制更精确,比如设置成1ms,那么延时的精度可以达到最小1ms;设置成10ms节拍,系统就无法实现1ms的延时;但是,时钟节拍设置得越短,则系统自身的开销会越大。

FreeRTOS的时钟节拍可以在keil工程中的FreeRTOSConfig.h文件中设置:

 

图中设置成了1000Hz,也就是1ms一个节拍。

 

在使用cubemx生成keil工程时,也可以在这里修改,最后同样会体现在生成的FreeRTOSConfig.h文件中:

 

标签:FreeRTOS,中断,节拍,延时,SysTick,复盘,时钟
From: https://www.cnblogs.com/FBsharl/p/17507819.html

相关文章

  • Freertos学习05-Task状态打印
    一、前言TaskList()是FreeRTOS中的一个函数,它可以列出所有当前正在运行的任务。这个函数可以用于调试和监视系统中的任务。它返回一个指向任务列表的指针,其中包含每个任务的名称、状态、优先级和堆栈使用情况等信息。二、函数介绍该函数的输入参数为数据缓存区的地址,可......
  • Freertos学习03-Task状态
    一、前言FreeRTOS是一个流行的实时操作系统,它支持多任务处理。在FreeRTOS中,任务有不同的状态,这些状态反映了任务在系统中的行为。二、状态特点任务可以存在于以下状态中:运行当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS的处理器只......
  • Freertos学习03-Task优先级
    一、前言FreeRTOS是一个流行的实时操作系统,它允许用户创建多个任务并在它们之间共享处理器时间。在FreeRTOS中,任务的优先级别是非常重要的,因为它决定了任务在系统中的执行顺序。二、任务优先级特点FreeRTOS中的任务优先级别是一个整数,范围从0到configMAX_PRIORITIES-1,其......
  • Freertos学习02-Task传入参数
    一、前言介绍了freertos具有许多特点,其中的任务调度将有助提高系统的实时性,并将各任务解耦,有助于产品的后续维护与开发,上一节介绍了freertos中关于任务的创建与删除,这一节介绍如何在创建函数的同时并传递参数。二、传递参数再次回顾xTaskCreate()函数的用法以及各输入参数,其中......
  • embos vs freertos
    embOS和FreeRTOS都是实时操作系统(RTOS),它们用于嵌入式系统开发。这两个系统都提供了用于管理任务、时间和资源的功能,以便在有限的硬件资源下实现实时性能。embOS是由SEGGER公司开发的专有软件,它提供了用于多种微控制器和微处理器的版本。FreeRTOS是一个开源的实时操作系统......
  • 集成AMD Xilinx的standalone的例子到FreeRTOS时,关于中断的注意事项
    集成AMDXilinx的standalone的例子到FreeRTOS时,关于中断的注意事项。FreeRTOS也可以说是standalone的程序。因此可以方便的把AMDXilinx的standalone的例子,集成到FreeRTOS。但是对于中断的处理,要小心。FreeRTOS会初始化中断控制器。对于使用中断模式的standalone的程序,也会初始......
  • FreeRTOS在STM32中是如何使用内存的
    转载自:《FeeRTOS在STM32中是如何使用内存的》没有FreeRTOS的时候:STM32资源的分配: 有FreeRTOS后(注意FreeRTOS的任务栈空间位于FreeRTOS的堆之中): STM32无OS编程Stack_Size和Heap_Size大小设置的意义其中STACK_SIZE和HEAP_SIZE在STM32的启动文件startup_stm32fxx.s......
  • 初识FreeRTOS
    FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 一、FreeRTOS收费问题1.FreeRTOS是一款“开源免费”的实时操作系统。遵循的是GPLv2+的许......
  • Freertos学习01-Task Creat & Delete
    一、Freertos介绍FreeRTOS是一个开源的实时操作系统内核,它是由英国的RealTimeEngineersLtd.开发的。它提供了一些基本的内核功能,如任务管理、时间管理、信号量、队列和软件定时器等,可以帮助开发人员更容易地构建嵌入式系统。FreeRTOS是一个非常流行的实时操作系统内核,因为它是......
  • 2023-6-15 面试笔试复盘总结
    四川君迪能源后端笔试2023-6-15简答题:线程和进程的区别本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。资源开销:每个进程都有独立的地址空......