当前位置:   article > 正文

百问网七天物联网智能家居第7篇_滴答定时器的时钟总线

滴答定时器的时钟总线

1. freeRTOS移植

     FreeRTOSConfig.h里面关于时钟的配置:

   首先是CPU的时钟,也就是我们当前处理器的系统时钟,要注意的是,这个地方的系统时钟是我们配置好处理器时钟之后的系统时钟,如果没有配置,那么这里就应该是上电复位后默认的时钟,比如F103,上电复位后默认的系统时钟是内部高速时钟8MHz,那么这里就要填8000000,而如果我们后续会配置系统时钟到别的值,比如我们的工程中配置了系统时钟是其支持的最大值72MHz,那么这里的宏定义值就是72000000。接着是滴答定时器的时钟,我们看下官网的解释:

      这段话的意思是:在大多数cortex-m内核的mcu中,滴答定时器的时钟和MCU的时钟是一样的,此时不需要配置configSYSTICK_CLOCK_HZ。如果不一样,则需要进行配置。STM32F103的参考手册,时钟树下对于内核滴答定时器的时钟有这样一段描述:

      意思是,STM32F103的RCC可以把AHB总线时钟 8分频或者不分频的时钟信号 ,  反馈给内核滴答定时器当作自己的时钟源,用哪一个,依靠的是滴答定时器的控制和状态寄存器的配置。在默认情况下,HAL库中对于滴答定时器的配置是放到了HAL_InitTick()这个函数中的。这个函数中,选择了滴答定时器的时钟源SysTick_CTRL_CLKSOURCE_Msk。

 是1<<2,意思就是将滴答定时器的CTRL寄存器的第2位写了1,我们再去手册中看下,滴答定时器的CTRL第2位代表了什么意思。

可以看到,如果将CTRL寄存器的第2位写1,那么滴答定时器的时钟源就是AHB总线上的时钟,如果写0就是AHB 8分频后的时钟。也就是说默认的HAL_InitTick会将滴答定时器的时钟源配置为AHB总线时钟。但是我们的程序中,因为在移植的时候我们用了另外一个外设定时器当作了HAL库的时基源,那么就重新定义实现了HAL_InitTick,而且这个函数中还没有调用原来默认函数中对于滴答定时器配置的那个HAL库函数,由于没有配置滴答定时器的寄存器,其复位后的值使用的就是默认值,CTRL复位后的值是0。

 也就是将AHB总线时钟8分频后的时钟才是滴答定时器的时钟。那么AHB总线的时钟又是多少?

       在我们的时钟配置函数中,我们是将系统时钟不分频就直接给了AHB,也就是说,AHB的时钟频率是72MHz,那么滴答定时器的时钟频率就是9MHz。所以我们的FreeRTOSConfig.h文件中对于滴答定时器时钟那个宏定义的值,不应该是8000000,而是9000000。接着是滴答定时器的计数频率配置宏定义,我们选用了和官方默认值一样的频率,将滴答定时器的计数频率定为1KHz。

       任务的最大优先级数值configMAX_PRIORITIES,不要把这个值设置的太高,脱离了我们的实际应用。这个值支持的最大值,取决于另一个任务调度算法配置的宏定义:configUSE_PORT_OPTIMISED_TASK_SELECTION

它在这里介绍了两种调度下一个任务的方法:通用算法和指定端口的方法。通用算法就是将这个宏定义的值设置为0,这种情况下任务最大优先级的值是没有限制的; 而指定端口的方法是将这个宏定义的值设置为1,会限制任务的最大优先级数值,典型值是32。虽然我们将该宏设为0,没有对最大任务优先级数值进行限制,但是还是不要脱离实际应用,设置的太高,够用就行了,比如我们的应用中最多也就控制七八个外设,即便每隔外设都有一个任务负责,且每隔任务的优先级还都不一样,那最多也只要七八个优先级就好。

        在STM32中最大值是15=0xF,在cortex-m3内核中允许的最大值是255=0xFF,因为STM32是在cortex-m3基础上阉割后的中断优先级配置,只用到了16个中断优先级,因而对于STM32而言0xFF和0xF是一样的中断优先级,都是0xF,第15级优先级,也就是最低级的中断优先级。

 如果我们的应用程序中有其他地方实现了这几个中断服务函数,需要将其弱化,在MDK中就是用__weak或者WEAK修饰。这几个内核中断负责的是对FreeRTOS任务的调度、软件定时器的计数等,相对于其它的内核中断或者外设中断而言,调度任务和计数软件定时器这些FreeRTOS软件上的机制,一般都没有我们的硬件外设触发中断需要CPU及时处理更重要。因而我们应该将这几个FreeRTOS会使用的内核中断的中断优先级设置为内核允许的中断优先等级的最低等级,也就是设置为最大值。

移植所必须的工程文件目录:

       以上展示的是适用于Keil MDK这个IDE所需的port.c文件,如果是别的平台,比如GCC就要选择对应平台的port.c文件。内存管理算法源文件,heap_1基本不用了,heap_4常用,heap_5是优化了heap_4的内存碎片产生,所以heap_4或者heap_5,都是推荐的内存管理算法的源文件。移植到这里基本就完成了。注意:即便我们一个任务也没有创建,那么一旦调用vTaskStartScheduler开启任务调度,FreeRTOS也会为我们创建一个空闲任务。那么我们在外面自己创建了3个任务,实际上FreeRTOS中创建的有4个任务。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/725015
推荐阅读
相关标签
  

闽ICP备14008679号