源码下载
1:从官网获取freeRTOS源码
freeRTOS官网
2:FreeRtos源码文件阐述
3:移植FreeRtos源码
FreeRTOS移植步骤 |
1:添加FreeRTOS源码,将FreeRTOS源码添加到基础工程,头文件等路径 |
2:添加FreeRTOSConfig.h文件,添加FreeRTOSConfig.h配置文件 |
3:修改SYSTEM文件夹,主要包含sys,delay,和usart |
4:修改中断相关文件, 修改Systick中断,SVC中断,PendSV中断 |
5:添加应用程序,验证移植是否成功 |
1 -> 在基础例程中创建一个freeRTOS文件夹,该文件夹包含三个子文件夹,分别是ins,src,port分别用于存放freeRTOS的c语言文件,头文件和RTOS的内存操作文件。
在例程src文件夹复制粘贴源码目录下的c语言文件
src文件夹粘贴后的结果展示
在例程inc文件中复制粘贴源码中的头文件,该文件包含在源码中的include文件夹中
粘贴后的结果展示
后面还有两个文件夹一个是FreeRTOS的内存管理文件在\FreeRTOS\Source\portable\MemMang路径下共有5个,我们使用到的主要是heap_4.c文件,一个是FreeRTOS的RVDS文件夹里面包含的是不同芯片的移植文件我们F103C8T6选择的是ARM_CM3下的两个c文件,把heap_4.c文件和ARM_CM3下的文件复制到我们移植例程的port文件夹中。
复制后结果展示
2 -> 在freeRTOS这个文件夹路径下添加FreeRTOS的配置文件
FreeRTOS问价夹的路径是\FreeRTOS\Demo\CORTEX_STM32F103_Keil
3 -> 打开项目例程将文件的路径添加进去(这个组文件是我们自己创建的)
把组文件中包含的子文件全部添加到keil的工程目录中去
4:配置FreeRTOSConfig
在FreeRTOSConfig文件中把这三行配置文件添加进去
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
打开stm32f10x_it.c源文件注释掉以下三行代码
测试main.c文件中编写测试用例(暂时还不需要知道这个代码表示的是什么意思仅用于测试)
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "freeRTOS.h"
#include "task.h"
TaskHandle_t myTaskHandler;
void myTask(void * arg){
while(1){
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
vTaskDelay(500);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
vTaskDelay(500);
}
}
int main(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出
/*设置GPIO初始化后的默认电平*/
GPIO_SetBits(GPIOA, GPIO_Pin_1); //设置PA1和PA2引脚为低电平
xTaskCreate(myTask,"myTask",512,NULL,2,&myTaskHandler);
vTaskStartScheduler();
while(1){
}
}
编译
使用st-link将程序下载到F103最下系统班上查看结果:有实验现象FreeRTOS移植成功