将FreeRTOS移植到STM32F103C8T6(库函数版)
-
下载最新版 FreeRTOS源码。
-
新建keil项目之后将最基本的所需的(根据项目需求添加相应文件)FreeRTOS文件添加到项目中
..\FreeRTOSv202212.01\FreeRTOS\Source\queue.c + list.c + task.c
..\FreeRTOSv202212.01\FreeRTOS\Source\include(整个文件夹)
..\FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c + portmacro.h
..\FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang\heap_4.c(最好heap_4.c)
..\FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h
在Keil项目中建议设置好项目结构,便于查看。
3.修改文件
(1)将FreeRTOSConfig.h中的堆栈大小设置为10k,该项设置根据相应的芯片进行修改
(2)注释掉stm32f10x_it.c中对应的三个中断服务函数,并在FreeRTOSConfig.h进行宏定义。之所以注释掉,是因为freertos中的port.c已经为我们实现了以上三个中断服务函数。
4.编写测试文件
#include "stm32f10x.h"
#include "freertos.h"
#include "task.h"
TaskHandle_t MyTaskHandler;
void MyTask(void *arg)
{
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
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);
// GPIO_SetBits(GPIOC, GPIO_Pin_13);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
xTaskCreate(MyTask,"mytask",512,NULL,2,&MyTaskHandler);
vTaskStartScheduler();
}
程序效果