FreeRTOS创建多任务:LED与LCD并行运行学习笔记
/任务句柄,以后使用它来操作这个任务。两个任务都是死循环,需要freertos,需要一个任务a运行一个任务b运行一个。void*const pvParameters, //调用任务函数时传入的参数。TaskFunction_tpxTaskCode, //函数指针,任务函数。创建两个任务,任务A运行Led_Test,任务B运行LCD_Test。const char*const pcName, //任
# 创建第1个多任务程序
## 1. 目标
创建两个任务,任务A运行Led_Test,任务B运行LCD_Test。
## 2. 接口函数
参考《FreeRTOS入门与工程实践(基于DshanMCU-103)》里《9.2.2 创建任务》,关键信息如下:
```c
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask );
```
## 3. 编程
## 4. 测试
两个任务都是死循环,需要freertos,需要一个任务a运行一个任务b运行一个
freertos.c文件中默认任务

osThreadId_t函数定义在 CMSIS-RTOS V2 的头文件 cmsis_os2.h 中,osThreadId_t 是一个「抽象类型」,定义形式如下(不同编译器 / RTOS 下底层实现略有差异,但对外接口统一):
它的核心作用是:屏蔽不同 RTOS 对「任务句柄」的底层定义差异。
| 类型 | 所属体系 | 底层定义(示例) | 适用范围 |
|---|---|---|---|
osThreadId_t |
CMSIS-RTOS V2 标准 | typedef void *osThreadId_t; |
FreeRTOS/RTX5/ThreadX 等所有 V2 兼容 RTOS |
TaskHandle_t |
FreeRTOS 原生 | typedef struct tskTaskControlBlock *TaskHandle_t; |
仅 FreeRTOS |
现在使用freertos来创建任务,所以关注freertos原生;

使用动态分配内存的函数如下:
BaseType_txTaskCreate(
TaskFunction_tpxTaskCode, //函数指针,任务函数
const char*const pcName, //任务的名字
const configSTACK_DEPTH_TYPEusStackDepth, //栈大小,单位为word,10表示40字节
void*const pvParameters, //调用任务函数时传入的参数
UBaseType_t uxPriority, //优先级
TaskHandle_t*const pxCreatedTask ); //任务句柄,以后使用它来操作这个任务
| 参数 | 描述 |
| pvTaskCode | 函数指针,可以简单地认为任务就是一个C函数。 它稍微特殊一点:永远不退出,或者退出时要调用"vTaskDelete(NULL)" |
| pcName | 任务的名字,FreeRTOS内部不使用它,仅仅起调试作用。 长度为:configMAX_TASK_NAME_LEN |
| usStackDepth | 每个任务都有自己的栈,这里指定栈大小。 单位是word,比如传入100,表示栈大小为100word,也就是400字节。 最大值为uint16_t的最大值。 怎么确定栈的大小,并不容易,很多时候是估计。 精确的办法是看反汇编码。 |
| pvParameters | 调用pvTaskCode函数指针时用到:pvTaskCode(pvParameters) |
| uxPriority | 优先级范围:0~(configMAX_PRIORITIES–1) 数值越小优先级越低, 如果传入过大的值,xTaskCreate会把它调整为(configMAX_PRIORITIES-1) |
| pxCreatedTask | 用来保存xTaskCreate的输出结果:taskhandle。 以后如果想操作这个任务,比如修改它的优先级,就需要这个handle。 如果不想使用该handle,可以传入NULL。 |
| 返回值 | 成功:pdPASS; 失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因只有内存不足) 注意:文档里都说失败时返回值是pdFAIL,这不对。 pdFAIL是0,errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY是-1。 |
定义自己的任务(一个是任务要干嘛,一个是创建任务)

void MyTask(void *argument)
{
while(1)
{
Led_Test();
}
}
xTaskCreate(MyTask,"myfirsttask",128,NULL,osPriorityNormal,NULL);
默认任务执行屏幕,创建的新任务执行灯
默认任务:
默认任务创建: defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)