FreeRTOS内核移植&完善程序框架
目录
前言
第一部分是对FreeRTOS内核的移植,由于之前移植过RT-Thread Nano,所以看完今天的视频发现,其实FreeRTOS的移植与RTT的移植大同小异,在我看来,难点在于将内核源码文件拷贝到工程文件夹里以及在工程中添加源文件和添加编译路径后,对相关文件内容的修改,配置tim2作为新的systick时基定时器。
第二部分是对于设备层和平台层代码的补充,完善驱动框架。
一、FreeRTOS内核移植
移植步骤
1.将“FreeRTOS-LTS\FreeRTOS\FreeRTOS-Kernel” 拷贝到工程目录“SmartHome\4_MiddleWare”下;
2.新建FreeRTOSConfig.h,并根据官方参考和实际需求添加修改;
3.宏定义与弱化内核中断服务函数;
4.按需添加FreeRTOS的内核源码;
5.验证:创建任务并开启调度器
源码获取
通过FreeRTOS官网www.freertos.org
在官网下载稳定版本源码“FreeRTOSv202012.04-LTS”
以及参考手册“FreeRTOS_Reference_Manual_V10.0.0”
重要文件:FreeRTOSConfig.h
FreeRTOSConfig.h文件里主要是一些对于FreeRTOS可选功能的配置,包括:
时钟的配置、
RTOS里相关功能的使能与失能、
线程(在这里叫做任务)相关的使能与失能、
堆空间的配置、
钩子函数的配置、
软件定时器,系统调用中断优先级的配置、
在这里有些功能的配置自由度是很高的,完全根据自身需求来裁剪配置。
stm32f1xx_it.c:
... ... ... ...
... ... ... ...
/**
* @brief This function handles PendSVC exception.
* @param None
* @retval None
*/
__weak void PendSV_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
__weak void SysTick_Handler(void)
{
KeyShakeProcess_Callback();
HAL_IncTick();
}
... ... ... ...
... ... ... ...
driver_hal_timebase.c:
#include "stm32f1xx_hal.h"
extern void KeyShakeProcess_Callback(void);
static TIM_HandleTypeDef htim2;
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
uint32_t uwTimclock = 0;
uint32_t uwPrescalerValue = 0;
__HAL_RCC_TIM2_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM2_IRQn, TickPriority, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
uwTimclock = HAL_RCC_GetPCLK1Freq() * 2;
uwPrescalerValue = uwTimclock / 1000000;
htim2.Instance = TIM2;
htim2.Init.Prescaler = uwPrescalerValue - 1;
htim2.Init.Period = 1000 - 1; // TIM2 Freq = 72MHz / 72 /1000 = 1Khz
htim2.Init.ClockDivision = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
if(HAL_TIM_Base_Init(&htim2) == HAL_OK)
{
return HAL_TIM_Base_Start_IT(&htim2);
}
return HAL_ERROR;
}
void HAL_SuspendTick(void)
{
__HAL_TIM_DISABLE_IT(&htim2, TIM_IT_UPDATE);
}
void HAL_ResumeTick(void)
{
__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);
}
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
KeyShakeProcess_Callback();
HAL_IncTick();
}
二、设备层与平台层代码的完善
程序框架的完善需要厘清上下层之间的逻辑关系
对于IO设备,核心内容是dev_io.h里的设备结构体以及表示IO Type的枚举类型。
详细解析见代码注释。