STM32F103C8T6上基于Keil的FreeRTOS源码移植教程
创作时间:
作者:
@小白创作中心
STM32F103C8T6上基于Keil的FreeRTOS源码移植教程
引用
CSDN
1.
https://m.blog.csdn.net/Mr_ybfqw/article/details/132178458
本文将详细介绍如何在STM32F103C8T6微控制器上使用Keil开发环境移植FreeRTOS。与使用CubeMX自动生成FreeRTOS代码不同,本教程将直接基于FreeRTOS官网的源码构建工程文件。通过创建三个不同闪烁频率的LED任务,验证FreeRTOS的正确运行。
下载FreeRTOS源码
- 访问FreeRTOS官网,搜索并下载最新版本的源码(不带LTS后缀)。
- 下载完成后,解压得到FreeRTOSv202212.01文件。
构建工程文件夹
总述
将开发所需的FreeRTOS文件分为两类,分别存放在src(存放.c文件)和include(存放.h文件)文件夹中。这两个文件夹都位于名为FreeRTOS的主文件夹下。
src文件夹
- 在桌面创建名为FreeRTOS的文件夹。
- 在FreeRTOS文件夹中创建include和src子文件夹。
- 从FreeRTOSv202212.01\FreeRTOS\Source路径下,将框选的.c文件拷贝到src文件夹。
- 进入FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3目录,将其中的.c和.h文件分别拷贝到src和include文件夹。
- 进入FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang目录,将heap_4.c拷贝到src文件夹。
include文件夹
- 进入FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录,将FreeRTOSConfig.h文件拷贝到include文件夹。
- 进入FreeRTOSv202212.01\FreeRTOS\Source\include目录,将所有文件拷贝到include文件夹。
创建工程文件
使用点灯任务来验证FreeRTOS配置是否正确。硬件驱动配置使用PA0、PA1、PA2三个IO口。选择Serial作为Debug,时基源选择TIM1定时器。
在Keil中进行配置
- 将FreeRTOS文件夹拷贝到工程目录中。
- 在Keil中,通过魔术棒图标进入C/C++设置,添加src和include文件夹的路径到IncludePath。
- 在工程目录中添加组,命名为FreeRTOS,将src和include文件夹中的所有.c和.h文件添加进来。
- 在main文件中包含必要的头文件:
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
- 修改FreeRTOSConfig.h文件,启用所需的功能:
#define configUSE_PREEMPTION 1
#define configUSE_TICKLESS_IDLE 0
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES 5
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 0
#define configUSE_COUNTING_SEMAPHORES 0
#define configQUEUE_REGISTRY_SIZE 10
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY 3
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xResumeFromISR 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
#define INCLUDE_pcTaskGetTaskName 0
#define INCLUDE_eTaskGetState 0
#define INCLUDE_xEventGroupSetBitFromISR 1
#define INCLUDE_xTimerPendFunctionCall 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 1
#define configKERNEL_INTERRUPT_PRIORITY 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15
- 在STM32F1XX.it.c文件中添加以下代码:
extern void xPortPendSVHandler(void);
extern void xPortSysTickHandler(void);
extern void vPortSVCHandler(void);
并在相应位置添加中断服务函数调用:
void SVC_Handler(void)
{
vPortSVCHandler();
}
void PendSV_Handler(void)
{
xPortPendSVHandler();
}
void SysTick_Handler(void)
{
xPortSysTickHandler();
}
- 在main函数中创建三个LED任务:
void led1_task(void* arg)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
vTaskDelay(300);
}
}
void led2_task(void* arg)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
vTaskDelay(500);
}
}
void led3_task(void* arg)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);
vTaskDelay(1000);
}
}
并在main函数中创建任务并启动调度器:
xTaskCreate(led1_task, "led1_task", 64, NULL, 3, NULL);
xTaskCreate(led2_task, "led2_task", 64, NULL, 4, NULL);
xTaskCreate(led3_task, "led3_task", 64, NULL, 4, NULL);
vTaskStartScheduler();
连接硬件电路,下载烧录,观察三个LED灯是否按照设定的频率闪烁,以验证FreeRTOS的正确运行。
热门推荐
硫磺皂PK其他洁面神器:谁更胜一筹?
《哪吒2》给教育者的启发
夏层铺镇村务监督员:打通基层治理最后一公里
健康画像:你的私人健康顾问
Devin教你如何用用户画像规划职业发展
知识图谱中如何做种子对齐?
中国非物质文化遗产保护的现状、挑战与对策
春节申遗成功:从中华文化符号到人类共同财富
故宫博物院太平有象:探索古代皇家文化、历史背景与象征意义
中国式浪漫的元宵节
文化企业出海成功的企业文化密码——以阅文集团为例
资金池会计处理:康得新造假启示录
资金池:集团企业资金管理的利器
解密深圳经济持续向上向好:两大“秘密”三大重视
北海:中国下一个养老胜地,气候宜人、生活成本低、配套完善
孕期焦虑?专家教你克服分娩恐惧!
四个小窍门,轻松缓解孕期焦虑
历史上出将入相的五位全能人才,谁才是第一人
留学生在美国购买二手车的价格情况如何
二手车买家必备:如何安全购车并避开事故车和水泡车?
分辨率1k2k3k4k是什么意思,1k 2k 3k 4k分辨率分别是多少
如何选择合适的电脑屏幕分辨率?这5个步骤让你轻松应对!
秋冬养生必备:川芎的神奇功效
冬季滋补首选:川芎当归鸡汤
2025年新交规:教你避免交通事故
交通事故后如何快速自救?
车险理赔流程全攻略:从报案到赔付的完整指南
拔完智齿后吃冰淇淋,止痛又美味!
东京新宿齿科推荐:智齿拔除后快速消肿秘籍
超声骨刀拔智齿,黑科技了解一下?