官网下载FreeRTOS™ - FreeRTOS™ 

自动适应本地(无需魔法,且下载速度与github一致或稍快)

下载带LTS(长期支持,功能稳定)的两个

下载后文件夹操作方式

FreeRTOS/FreeRTOS_Kernel/Source:复制所有.c    粘贴至新工程创建FreeRTOS/Source

FreeRTOS/FreeRTOS_Kernel/portable/RVDS(与Keil5一致)/ARM_CM3: port.c和portmacro.h粘贴至新工程创建FreeRTOS/portable/ARM_CM3

FreeRTOS/FreeRTOS_Kernel/include:复制所有文件 粘贴至新工程创建FreeRTOS/Source

FreeRTOS\FreeRTOS\Demo\CORTEX_STM32F103_Keil:复制FreeRTOSConfig.h 粘贴至工程User(main.c所在文件夹)

├── include/
  ├── CMakeLists.txt
  ├── FreeRTOS.h
  ├── StackMacros.h
  ├── atomic.h
  ├── croutine.h
  ├── deprecated_definitions.h
  ├── event_groups.h
  ├── list.h
  ├── message_buffer.h
  ├── mpu_prototypes.h
  ├── mpu_syscall_numbers.h
  ├── mpu_wrappers.h
  ├── newlib-freertos.h
  ├── picolibc-freertos.h
  ├── portable.h
  ├── projdefs.h
  ├── queue.h
  ├── semphr.h
  ├── stack_macros.h
  ├── stdint.readme
  ├── stream_buffer.h
  ├── task.h
  └── timers.h
├── portable/
  ├── ARM_CM3/
    ├── port.c
    └── portmacro.h
  └── heap_4.c
└── source/
  ├── croutine.c
  ├── event_groups.c
  ├── list.c
  ├── queue.c
  ├── stream_buffer.c
  ├── tasks.c
  └── timers.c

stm32f10x_it.c 注释这三段函数(阅读该博主的博客更改:Freertos-CSDN博客

/在FreeRTOSConfig.h中添加如下宏定义,让FreeRTOS接手系统
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
 

main.c demo (可以自己编写)

#include "stm32f10x.h"                  // 设备头文件
#include "LED.h"
#include "FreeRTOS.h"
#include "task.h"
#include "OLED.H"

// 任务优先级
#define START_TASK_PRIO 1
#define LED1_TASK_PRIO 2

// 任务堆栈大小
#define START_STK_SIZE 128
#define LED1_STK_SIZE 50

// 任务句柄
TaskHandle_t StartTask_Handler;
TaskHandle_t LED1Task_Handler;

// 任务函数声明
void start_task(void *pvParameters);
void led1_task(void *pvParameters);

void LED_Init(void)
{
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);        //开启GPIOC的时钟
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13  ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);                        //将PA13引脚初始化为推挽输出
    GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
 

int main()
{
    // 初始化LED
    LED_Init();

    // 创建开始任务
    xTaskCreate(
        (TaskFunction_t)start_task,    // 任务函数
        (const char*)"start_task",      // 任务名称
        (uint16_t)START_STK_SIZE,      // 任务堆栈大小
        (void*)NULL,                   // 传递给任务函数的参数
        (UBaseType_t)START_TASK_PRIO,  // 任务优先级
        (TaskHandle_t*)&StartTask_Handler  // 任务句柄
    );

    // 开启任务调度,创建一个空闲任务
    vTaskStartScheduler();
}

// 开始任务函数
void start_task(void *pvParameters)
{
    // 进入临界区,禁止中断
    taskENTER_CRITICAL();

    // 创建LED1任务
    xTaskCreate(
        (TaskFunction_t)led1_task,    // 任务函数
        (const char*)"led1_task",      // 任务名称
        (uint16_t)LED1_STK_SIZE,      // 任务堆栈大小
        (void*)NULL,                   // 传递给任务函数的参数
        (UBaseType_t)LED1_TASK_PRIO,  // 任务优先级
        (TaskHandle_t*)&LED1Task_Handler  // 任务句柄
    );

    // 删除开始任务
    vTaskDelete(StartTask_Handler);

    // 退出临界区,允许中断
    taskEXIT_CRITICAL();
}

// LED1任务函数
void led1_task(void *pvParameters)
{
    while (1)
    {
        // 点亮LED
        GPIO_SetBits(GPIOC, GPIO_Pin_13);
        // 任务延迟1000个时钟节拍
        vTaskDelay(1000);
        // 熄灭LED
        GPIO_ResetBits(GPIOC, GPIO_Pin_13);
        // 任务延迟1000个时钟节拍
        vTaskDelay(1000);
    }
}

板载LED闪烁表示运行成功
 

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐