【百问网】7天物联网智能家居实战 Day4

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的枚举类型。
详细解析见代码注释。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值