FreeRTOS 两个 CPU 时钟
FreeRTOS two CPU clocks
取决于硬件组件变体,我的固件应该以 2.1 或 4.2 MHz 运行。在 FreeRTOS 中 configCPU_CLOCK_HZ
已在编译时设置。有没有可能在初始化时设置这个频率?
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
。
取决于硬件组件变体,我的固件应该以 2.1 或 4.2 MHz 运行。在 FreeRTOS 中 configCPU_CLOCK_HZ
已在编译时设置。有没有可能在初始化时设置这个频率?
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
。