基于TC3XX的FreeRTOS移植
一、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这个函数,它是表示相对延迟,就是任务运行时间再加上这个延迟时间才是任务的周期运行时间,它会随着任务运行时间的变化而变化,不是绝对的周期运行时间,一般不用这个函数。

更多推荐

所有评论(0)