# 创建第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);

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐