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();
}

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐