我正在学习 Udemy RTOS 课程,它是关于如何在 stm32 上从头开始构建 RTOS,因此在观看视频时,我调用了 SystemCoreClockUpdate() 函数,但编译器无法识别它,我将这些路径添加到项目中坐次: -CMSIS/包括 -CMSIS/核心/包括 -CMSIS/设备/ST/STM32L4xx/包括 该函数在 system_stm32l4xx.c 中声明,并在 system_stm32l4xx.h 文件中声明为 extern 原型 我应该包括什么才能使这项工作有效? 这是代码
#include "stm32l476xx.h"
#include "uart.h"
#include <stdint.h>
#include <stdio.h>
void SystemClockConfig(void);
void DelayS(uint32_t seconds);
volatile uint32_t tick;
volatile uint32_t _tick;
int main(void) {
SystemClockConfig();
while(1)
{
printf("hello");
DelayS(1);
}
}
void SystemClockConfig(void) {
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock / 100U);
__enable_irq();
}
void SysTick_Handler(void) {
++tick;
}
uint32_t getTick(void) {
__disable_irq();
_tick = tick;
__enable_irq();
return _tick;
}
void DelayS(uint32_t seconds) {
seconds *= 100;
uint32_t temp = getTick();
while ((getTick() - temp) < seconds) {
}
}
我尝试包含 system_stm32xx.h 和 core_cm4.h 但没有任何改变
我应该包括什么才能使这项工作成功?我尝试过包括 system_stm32xx.h 和 core_cm4.h 但没有任何改变
由于该函数不打算从应用程序代码中调用,因此没有标头包含其原型。
只需在 main 之前添加原型即可。
void SystemCoreClockUpdate(void);
Udemy老师有建议你这样做吗?:
uint32_t getTick(void) {
__disable_irq();
_tick = tick;
__enable_irq();
return _tick;
}
32 位读取在 Cortex-M 目标上是原子的,您不必禁用中断(顺便说一句,只有在极其必要时才应该这样做)
如果您使用 freeRTOS,请勿自行禁用中断 -
taskENTER_CRITICAL()
和 taskEXIT_CRITICAL()