FreeRTOS移植到STM32F103C8T6

百度网盘里给的FreeRTOSConfig.h文件不是很全面,可以下载我绑定的资源里的FreeRTOSConfig.h,那里面更全面。

准备好FreeRTOS源码文件夹和标准库工程模板。

FreeRTOS移植资料https://pan.baidu.com/s/1Ezk-B-y0R8-dobE6wdNMlQ?pwd=1234

步骤:

1.在工程模板中新建一个“FreeRTOS”文件夹

2.在“FreeRTOS”文件夹中新建“src”“inc”“port”3个文件夹;

src:存放源码     inc:存放头文件     port:存放移植平台的相关文件

3.复制FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang中的所有文件到port文件夹中

4.复制FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3中的所有文件到port文件夹中

5.复制FreeRTOSv202212.01\FreeRTOS\Source中的文件夹以外的所有单独文件至src

6.复制FreeRTOSv202212.01\FreeRTOS\Source\include中所有文件至inc

7."C:\Users\W\Desktop\FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h"复制到FreeRTOS_工程模板\FreeRTOS文件夹下

所有复制内容已完成。

8.用KEIL打开工程点击魔术棒,把4个文件夹全部添加进来:

9.新建组,把文件添加进来:

SRC:添加所有src文件夹下的文件

INC:添加inc文件夹下除了readme之外的所有文件

PORT:添加heap_4.c和port.c文件

10.在FreeRTOS/INC组中添加FreeRTOSConfig.h文件。并将其移动到最顶端,方便之后使用。

11.注释掉stm32f10x_it.c文件中的3个空的中断函数:

//void SVC_Handler(void)
//{
//}

//void PendSV_Handler(void)
//{
//}


//void SysTick_Handler(void)
//{
//}

13.在FreeRTOSConfig.h文件的#endif之前加上:

#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler
#define xPortSysTickHandler SysTick_Handler

12. 复制以下代码到main.c,编译运行,可以看到PB5上的LED每500毫秒闪烁一次,可以插一个LED上去试试。

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"

TaskHandle_t myTaskHandler;
void myTask( void * arg)
{
       while(1)
       {
              GPIO_ResetBits(GPIOB,GPIO_Pin_5);
              vTaskDelay(500);
              GPIO_SetBits(GPIOB,GPIO_Pin_5);
              vTaskDelay(500);
       }
}
int main(void)
{
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
       GPIO_InitTypeDef GPIO_InitStructure;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOB, &GPIO_InitStructure);
       xTaskCreate(myTask,"myTask",512,NULL,2,&myTaskHandler);
       vTaskStartScheduler();
       while(1)
       {}
}

### 将FreeRTOS移植STM32F103C8T6 #### 准备工作 为了成功将FreeRTOS移植STM32F103C8T6,需要准备如下材料: - STM32系列开发板(本指南使用的是STM32F103C8T6) - 已经搭建好的标准库工程环境 - Keil MDK集成开发环境用于编译和调试程序[^3] #### 获取并解压FreeRTOS源码包 下载最新的FreeRTOS版本,并将其解压缩至本地磁盘。确保获取的版本兼容目标硬件平台。 #### 配置FreeRTOSConfig.h文件 编辑`FreeRTOSConfig.h`以适应特定的应用需求。对于STM32F103C8T6而言,特别需要注意调整以下几个参数设置: - `configTOTAL_HEAP_SIZE`: 定义系统的总堆大小;考虑到该型号MCU资源有限,建议初始设定较小值如\(8 * 1024\)字节。 - 启用动态内存分配功能:通过将`configSUPPORT_DYNAMIC_ALLOCATION`设为1来允许运行时创建任务和其他对象[^5]. ```c #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) #define configSUPPORT_STATIC_ALLOCATION 0 #define configSUPPORT_DYNAMIC_ALLOCATION 1 ``` #### 修改中断处理函数 根据具体应用情况更新`stm32f10x_it.c`内的相关中断服务例程(ISRs),使其能够正确响应来自内核的任务调度请求。这一步骤通常涉及对SysTick定时器ISR进行适当修改以便于实现上下文切换机制[^1]。 #### 创建简单的测试应用程序 编写一段基础代码用来验证移植是否成功完成。最简单的方式就是让LED按照一定周期闪烁,以此证明多线程环境下基本I/O操作可以正常运作。 ```c #include "FreeRTOS.h" #include "task.h" void vTaskBlink(void *pvParameters){ while(1){ GPIO_SetBits(GPIOA,GPIO_Pin_1); // Turn on LED connected to PA1 pin. vTaskDelay(pdMS_TO_TICKS(500)); // Delay for half a second. GPIO_ResetBits(GPIOA,GPIO_Pin_1);// Turn off the same LED again after delay period ends. vTaskDelay(pdMS_TO_TICKS(500)); } } int main(){ /* Initialization code here */ xTaskCreate(vTaskBlink,"BLINK",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1,&handle); vTaskStartScheduler(); for (;;); } ``` 上述例子展示了如何在一个新创建的任务中控制外部设备的状态变化,从而直观地展示出实时操作系统的核心特性——并发执行多个独立进程的能力[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值