一、FreeRTOS概述

二、FreeRTOS对多核处理器的支持

三、FreeRTOS单核移植流程

1、移植FreeRTOS协议栈

这部分是我经过适配修改后的协议栈源码,移植到不同的硬件平台协议栈源码基本不用变化,简单点就是复制这文件夹到你的工程下

2、移植OSTasks文件夹

这个文件夹下是FreeRTOSConfig.h和OsTasks.c文件

FreeRTOSConfig.h根据不同芯片需要进行适配,以下文件是适配TC387芯片的配置截图,因为我们使用的芯片是300M,所以将CPU时钟频率修改为300000000Hz,心跳为1ms,设置堆栈大小,根据实际调整,选用STM0作为系统的心跳定时器,也可以选用其他定时器。

3、实现OSTasks.c应用

1)在1ms系统定时器中调用vPortSystemTickHandler(),它是任务调度的核心;

2)创建5ms、10ms等周期的任务,创建好任务后启动STM0定时器以及任务调度,OS_Tasks_init(void)函数在初始化中调用即可

创建任务的函数是

	BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,		/*lint !e971 Unqualified char types are allowed for strings and single characters only. */
							const configSTACK_DEPTH_TYPE usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )

TaskFunction_t pxTaskCode,这个是任务执行的函数

const char * const pcName,    任务的名字,可随意定义

const configSTACK_DEPTH_TYPE usStackDepth,配置任务的堆栈大小,这里设置的是512byte,可根据实际需求调整每个任务的堆栈,这个堆栈大小设置无准确计算方法,依据经验根据变量和函数大小、嵌套深度等预估一个大小

void * const pvParameters,向新创建的任务传递初始化数据的入口指针,这个参数会传递给任务的void *arg这个参数,不需要传递参数时写入NULL即可。

UBaseType_t uxPriority,任务优先级,如果任务优先级一样,它会按照时间片轮转进行调度,值越小优先级越低

TaskHandle_t * const pxCreatedTask ) 任务控制块(TCB)的引用标识符,对该任务进行一些控制操作比如 vTaskSuspend(xMotorTaskHandle); // 挂起任务,vTaskResume(xMotorTaskHandle); // 恢复任务等需要用到这个句柄,不需要进行任务控制的话写NULL即可。

3)任务执行函数

任务执行函数的结构如下,其中vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(OS_CONTROL_TASK1_PERIOD_5MS));是保证任务周期运行的核心,此处表示按照5ms的绝对周期时间运行;另外还有vTaskDelay这个函数,它是表示相对延迟,就是任务运行时间再加上这个延迟时间才是任务的周期运行时间,它会随着任务运行时间的变化而变化,不是绝对的周期运行时间,一般不用这个函数。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐