全网最详细的FreeRTOS移植教程
1、硬件平台:STM32F103C8T6,FreeRTOS版本:FreeRTOSv202212.01,开发环境:Keil5
2、把下面文件放到目标工程中:
FreeRTOS -> Source :所有.c文件(7个)、include文件夹(里面的.readme文本可以删除)、portable兼容文件()
FreeRTOS -> Demo:CORTEX_STM32F103_Keil:FreeRTOSConfig.h(裁剪文件)
3、FreeRTOS运行原理:调用中断,操作系统能够实现多任务的调度,其实就是频繁的在调用中断,在中断里面实现任务的上下文切换
用到3个中断,其中两个为stm32芯片本来就生成的内部中断,pendSV、SVC,以及系统滴答定时器中断Systick,操作系统一直灵活的运用这三个中断不断的去触发中断,来判断是不是需要任务的切换,从而能够实现多个任务同时运行的效果
下面就是修改移植过来的底层代码,让操作系统能够调用这三个中断
FreeRTOS用到的三个中断:
void xPortPendSVHandler( void );
void xPortSysTickHandler( void );
void vPortSVCHandler( void );
把FreeRTOS的三个中断函数和stm32对接有两个
1.把这两个函数写入it.c的对应两个异常里面,实现任务切换等处理
void xPortPendSVHandler( void );
void vPortSVCHandler( void );
2.在操作系统的裁剪文件用宏定义替代
2.1:也就是在FreeRTOSConfig.h文件中
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
然后在stm32f1xx_it.c文件中把这两个内核异常处理函数注释掉
2.2:
在stm32f1xx_it.c中引入头文件:#include "FreeRTOS.h" #include "task.h",
//操作系统在裁剪文件需要打开能够查询freeRTOS调度状态,#define INCLUDE_xTaskGetSchedulerState 1
void SysTick_Handler(void)
{
//手动调用FreeRTOS的systick中断
if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
//判断操作系统调度器是否已经启动,如果启动,使用FreeRTOS操作系统的systick:xPortSysTickHandler();
xPortSysTickHandler(); //调用这个函数需要在这个文件里面引用进来这个函数 extern void xPortSysTickHandler( void );
}
HAL_IncTick();
}
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)