1. 摘要

        将FreeRTOS移植到新硬件平台的过程中,对时钟管理相关文件的修改是至关重要且往往需要细致调整的核心环节。这主要涉及配置系统时钟节拍来源,确保其稳定可靠地驱动内核调度器和时间管理功能。在STM32中,一般采用SysTick时钟作为RTOS的时基,本文将以FreeRTOS移植到STM32上为例,讲解移植过程中对时钟管理文件的修改。

2. 修改详解

2.1 SysTick定时器驱动函数

        驱动代码如图2.1.1所示:

图2.1.1 滴答定时器初始化函数代码

        从图2.2.1可以看到,先定义一个变量reload,然后将外部时钟(72M Hz)选择为滴答定时器的时钟源;接下来计算延时1 us的时钟数保存在fac_us变量中(这里的值为72,是因为72M Hz代表的是1s计数72M下,那么1 us就计数72下,此时72就为1 us的时钟数);

        下一行代码将1 us的时钟数赋给变量reload,接下来根据RTOS的时钟频率设定滴答定时器的重装值(此处的configTick_RATE_HZ为裁剪文件里边的RTOS时钟频率,一般设置为1000 Hz,代表1s钟有000次时钟节拍,发生一个时钟节拍为1 ms;那么这里的reload值=1 us的时钟数乘以10的6次方再除以RTOS时钟频率,得到的是RTOS发生一个时钟节拍时的计数值,因为根据定时器的原理,我们知道计数值*分频系数/时钟频率等于时间,因此这里知道了一个时钟节拍的时间,就可以反推计数值)。

        fac_ms=1000/configTICK_RATE_HZ;    这一行代码得到是RTOS可以延时的最小单位,当configTICK_RATE_HZ为1000 Hz时,此时可以延时的最小时间fac_ms为1 ms。

        最后,开启滴答定时器中断,将计算得到的reload值赋给滴答定时器的重装寄存器,再开启滴答定时器。此时RTOS时钟开始运行。

2.2 SysTick定时器中断函数

        代码如图2.2.1所示。

图2.2.1 滴答定时器中断函数

        关于图2.2.1代码不再做细致讲解,简单来说,当1 ms时间到达以后,进入该中断函数,此时判断RTOS是否已经开始运行,如果已经运行,就执行xPortSysTickHandler函数,该函数主要是为了统计时钟节拍次数,以及计算被阻塞任务的解除阻塞时间,防止有任务一直霸占CPU,更加具体的分析请看RTOS合集。

2.3 us级延时函数

        代码如图2.3.1所示。

图2.3.1 us级延时函数源码

        如图2.3.1所示,首先将滴答定时器SysTick的重装载值保存在reload变量中,然后将要延时的us数转换成时钟数保存在ticks变量中(转换原理是n us*1 us的时钟数=n个时钟数);

        接下来记录此时的滴答定时器计数值保存在told变量中,接下来进入死循环,再次记录此时的滴答定时器计数值,保存再tnow变量中。        

        比较tnow和told,因为SysTick定时器是一个24位的倒计数定时器。因此随着时间的推移,tnow会小于told,在这种情况下,此时的时间变化量统计在tcnt变量中为told-tnow;

        如果tnow大于told,这种情况下只有一种解释就是滴答定时器发生了溢出,因为滴答定时器是一个24位定时器,最大计数为2的24次方;当倒计数到0时,就会发生溢出,此时滴答定时器会被重装,重装值为reload。因此,此时的时间变化量tcnt=reload-tnow+told。

        最后,将要延时的us时钟数与时间变化量(也是时钟数)进行比较,如果相等,说明延时的时间到了,退出死循环,函数执行完毕。

2.4 ms级延时函数

        代码如图2.4.1所示.

图2.4.1 ms级延时函数源码

        如图2.4.1所示,先判断RTOS有没有在运行,如果在运行,就再去判断要延时的ms数是否小于RTOS能延时的最小时间(也就是延时的时间是否小于1 ms);

        只有延时的时间大于1ms,才能用RTOS的相对延时函数,引发任务调度。如果不大于1 ms,则采用us延时函数,无法引发任务调度。

3.总结

        当RTOS运行的时候,delay_ms函数将先判断延时时长是否大于等于1个RTOS时钟节拍(fac_ms),当大于这个值的时候,就通过调用OS的延时函数来实现(此时任务可以调度),不足1个时钟节拍的时候,直接调用delay_us函数实现(此时任务无法调度)。

ps:需要stm32+rtos项目源码,或者FreeRTOS开发手册,请联系1840813505@qq.com,备注csdn。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐