FreeRTOS学习笔记(一)
一.在stm32f10x上的移植(vet6)
1.源文件的获取
官方网站:https://www.freertos.org/
2.源文件的拷贝和理解
1. FreeRTOS系统层源代码
-
/Source下的.c文件
在工程目录下创建freeRTOS_core文件夹,用来存放/Suorce文件里的.c文件
-
/Source/include下的.h文件
直接将整个文件夹放入freeRTOS_core文件夹里
2. FreeRTOS接口层代码
-
/Source/portable/RVDS
在工程目录下创建freeRTOS_port文件夹整个文件夹放入工程目录下的freeRTOS_port文件夹中
3. FreeRTOS内存管理方案
-
/Source/portable/MemMang
heap_1~5.c,表示freeRTOS的5种内存管理方案,通常选择heap_4.c,整个文件夹考入port文件夹中
4. FreeRTOS系统配置文件
-
FreeRTOSConfig.h
需要自己创建或者从Demo中拷贝,主要用于配置系统相关功能
3.在startcode中重定向中断入口函数
port.c文件中,有3个freeRTOS的Exception handlers函数需要被设置为相应的中断入口
1.xPortPendSVHandler
2.xPortSysTickHandler
3.vPortSVCHandler
这三个函数是连接硬件设备的重要桥梁,需要在statrtcode将相应中断入口中重新定向至这三个函数
*****1和3是由内联汇编编写的函数,主要用于上下文切换,使用汇编能大大提高切换速率,减少切换过程中关闭中断的时间,增强系统的稳定性
4.freeRTOSConfig.h的编写或修改
添加Demo中的freeRTOSConfig.h后,编译会发现xTaskGetCurrentTaskHandle() 没有被定义,导致编译无法通过。这个函数的主要作用是获取当前任务的句柄,报错的地方出现在stream_buffer.c中。这时候转到定义,发现有一个条件宏
#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )
TaskHandle_t xTaskGetCurrentTaskHandle( void )
{
TaskHandle_t xReturn;
/* A critical section is not required as this is not called from
* an interrupt and the current TCB will always be the same for any
* individual execution thread. */
xReturn = pxCurrentTCB;
return xReturn;
}
#endif
原因是 INCLUDE_xTaskGetCurrentTaskHandle 和 configUSE_MUTEXES 都没有被定义导致函数没有定义,只要在freeRTOSConfig.h前加入相关宏定义即可编译通过
5.freeRTOS移植测试
做一个简单的bsp(板级支持包),初始化一个led或者串口
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
static void LED_TestApp(void*ptr); //声明任务函数
static TaskHandle_t LED_Handle = NULL; //任务句柄
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //任务分组
BSP_LED_Init(); //LED初始化
//创建一个led闪烁的任务
xTaskCreate((TaskFunction_t )LED_TestApp,
(const char* )"LED_Test",
(uint16_t )256 ,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )&LED_Handle);
vTaskStartScheduler(); //开启任务调度
while(1);
}
void LED_TestApp(void*ptr) //移植成功验证任务
{
while(1)
{
BSP_LED_CTR(0,LED_Off);
vTaskDelay(500/portTICK_RATE_MS);
BSP_LED_CTR(0,LED_On);
vTaskDelay(500/portTICK_RATE_MS);
}
}
led按照预定时间闪烁,freeRTOS移植成功