FreeRTOS下载
选择V9.0.0版本
点击FreeRTOSv9.0.0.zip下载
FreeRTOS移植
将下载到的资料进行解压得到一个名为FreeRTOS的文件夹,里面包含了两个文件夹FreeRTOS和FreeRTOS-Plus
1.我们需要在一个Keil工程上移植FreeRTOS,以这个工程为例新建一个名为FreeRTOS的文件夹
我们需要在一个Keil工程上移植我们的FreeRTOS,以下以这个工程为例新建一个名为FreeRTOS的文件夹
2.在FreeRTOS文件夹里面再新建三个文件夹src、port、include
3.将下载解压的FreeRTOS\Source中的.c文件复制到新建的FreeRTOS\src文件夹下
4.将FreeRTOS\Source\portable中的MemMang和RVDS文件复制到新建的FreeRTOS\port文件夹下
5.将FreeRTOS\Source\include中的所有文件复制到新建的FreeRTOS\include文件夹中
6.我使用的是STM32f103c8t6的芯片,这里则选择了FreeRTOSv9.0.0\FreeRTOS\Demo目录下的CORTEX_STM32F103_Keil文件夹,将其中的FreeRTOSConfig.h移植到我们的工程文件夹中,这里移植到了工程中的apps文件夹
7.打开工程中的组文件夹管理,新建FreeRTOS/port组,添加的FreeRTOS\port\RVDS\ARM_CM3下的port.c文件和FreeRTOS\port\MemMang下的heap_4.c文件
8.新建FreeRTOS/src组,添加的FreeRTOS\src下的.c文件
9.还需要将头文件路径引用进来
FreeRTOS测试
1.修改FreeRTOSConfig.h文件,添加相应的头文件(UART.h为自己编写的文件,里面进行了USART1的初始化配置和重写了fputc函数用于打印串口信息进行调试)和添加
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
在创建任务进行调试的过程中,若不添加这两个宏定义,可能会时vTaskStartScheduler()函数无法执行
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif
}
2.修改 stm32f10x_it.c文件,将其中的SVC_Handler(void)和PendSV_Handler(void)函数注释掉,然后实现SysTick_Handler(void)函数
main.c
#include "FreeRTOS.h"
#include "UART.h"
#include "Task.h"
void Task1Funtion(void* param);
void Task2Funtion(void* param);
int main(void)
{
USART_Init_Config(115200);
TaskHandle_t xHandleTask1;
TaskHandle_t xHandleTask2;
xTaskCreate(Task1Funtion,"Task1", 100, NULL, 1, &xHandleTask1);
xTaskCreate(Task2Funtion,"Task2", 100, NULL, 1, &xHandleTask2);
vTaskStartScheduler();
return 0;
}
void Task1Funtion(void* param)
{
while(1)
{
printf("1");
}
}
void Task2Funtion(void* param)
{
while(1)
{
printf("2");
}
}
创建两个动态任务Task1和Task2,选择使用模拟器进行调试,调试结果如下