FreeRTOS下载地址
选择V9.0.0版本
点击FreeRTOSv9.0.0.zip下载
FreeRTOS移植
将下载到的资料进行解压得到一个名为FreeRTOS的文件夹,里面包含了两个文件夹FreeRTOS和FreeRTOS-Plus
1.我们需要在一个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 "Task.h"
#include "led.h"
#include "Delay.h"
void Task1Funtion(void* param);
void Task2Funtion(void* param);
int main(void)
{
LED_Init();
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)
{
LED1_ON();
vTaskDelay(1000);
LED1_OFF();
vTaskDelay(1000);
}
}
void Task2Funtion(void* param)
{
while(1)
{
bee_on();
vTaskDelay(2000);
bee_off();
vTaskDelay(2000);
}
}
效果:蜂鸣器响2秒,停止2秒,led灯亮1秒,灭1秒,蜂鸣器和led的工作互补干扰。