FreeRTOS 两个 CPU 时钟

Posted

技术标签:

【中文标题】FreeRTOS 两个 CPU 时钟【英文标题】:FreeRTOS two CPU clocks 【发布时间】:2021-06-13 02:59:49 【问题描述】:

取决于硬件组件变体,我的固件应该以 2.1 或 4.2 MHz 运行。在 FreeRTOS 中,configCPU_CLOCK_HZ 已在编译时设置。有没有可能在初始化时间设置这个频率?

【问题讨论】:

【参考方案1】:

configCPU_CLOCK_HZ 似乎在vPortSetupTimerInterrupt() 函数中使用,它只是配置 SysTick 硬件寄存器(如果您不使用 tickless 模式)。我想即使调度程序正在运行,也应该可以手动配置这些寄存器(但我不确定)。

但可能有更好的方法:vPortSetupTimerInterrupt() 在源代码中用__attribute__((weak)) 定义。这意味着,如果您提供自己的vPortSetupTimerInterrupt() 版本,它将替换原来的版本。在您自己的版本中,只需使用适当的值加载 SysTick CTRL 和 LOAD 寄存器。

这里是 vPortSetupTimerInterrupt() 的原始版本(这可能会因 uC 模型而异):

/*
 * Setup the systick timer to generate the tick interrupts at the required
 * frequency.
 */
__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void )

    /* Calculate the constants required to configure the tick interrupt. */
    #if ( configUSE_TICKLESS_IDLE == 1 )
        
            ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
            xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
            ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
        
    #endif /* configUSE_TICKLESS_IDLE */

    /* Stop and clear the SysTick. */
    portNVIC_SYSTICK_CTRL_REG = 0UL;
    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;

    /* Configure SysTick to interrupt at the requested rate. */
    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

您可以只复制原始的(当然没有 weak 属性)并将configCPU_CLOCK_HZ 替换为您在代码中设置的一些全局变量。

【讨论】:

以上是关于FreeRTOS 两个 CPU 时钟的主要内容,如果未能解决你的问题,请参考以下文章

FreeRTOS - 调度器

FreeRTOS 系统时钟节拍和时间管理

全志R128芯片 在FreeRTOS下如何查看并更改RISC-V 和 ARM 两个CPU核的默认运行频率?

freeRtos学习笔记 移植和CPU利用率统计

NXP iMX8M Plus M7核心FreeRTOS开发

NXP iMX8M Plus M7核心FreeRTOS开发