FreeRTOS笔记【一】 任务的创建(动态方法和静态方法)

FreeRTOS基础(三):动态创建任务 通过上一讲我们知道动态创建任务的API函数如下:其实,我们需要定义的入口参数就是这个API函数的参数,提前定义好,然后传入参数,他就会自动的为我们创建好对应的任务,并且处于一种就绪态。其实就是函数名,我们知道函数名就是函数的入口地址,就是一个函数指针其实也就是函数名对应的字符串,要用双引号括起来动态创建任务,#define START_TASK_STACK_SIZE 128 //定义任务堆栈大小为128字(1字等于4字节)不需要传参,我们直接给NULL即可; 阅读详情
AI摘要

文章详细介绍了FreeRTOS中的任务创建API,包括动态创建(xTaskCreate)及其宏定义、函数原型和示例,以及静态创建(xTaskCreateStatic)的原理、所需配置和示例。还讨论了任务控制块(TCB)和堆栈管理的重要性。

一、任务创建和删除API函数

函数描述
xTaskCreate()使用动态的方法创建一个任务
xTaskCreateStatic()使用静态的方法创建一个任务
xTaskCreateRestricted()创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
vTaskDelete()删除一个任务

二、动态创建任务

2.1 宏定义

使用 xTaskCreate()  函数是在 FreeRTOS 中创建任务的一种方法,使用该函数所需的 RAM 会自动从 FreeRTOS的堆中自动分配。因此需要开启 FreeRTOSConfig.h 中的一个宏定义为1,就可以创建任务了。

#define configSUPPORT_DYNAMIC_ALLOCATION        1     //支持动态内存申请

2.2 函数原型

xTaskCreate() 函数原型如下:

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
                        const char * const pcName,
                        const uint16_t usStackDepth,
                        void * const pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t * const pxCreatedTask )
参数描述
pxTaskCode任务函数
pcName任务名字,一般用于追踪和调试,任务名字长度不能超过configMAX_TASK_NAME_LEN
usStackDepth任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE
pvParameters传递给任务函数的参数
uxPriotiry任务优先级,范围0~ configMAX_PRIORITIES-1
pxCreatedTask任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其他API函数可能会使用到这个句柄。
返回值描述
pdPASS任务创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY任务创建失败,因为堆内存不足! 

2.3 示例代码

TaskHandle_t Task1_Handler;         //任务句柄
void task_1(void *pvParameters);    //任务函数

TaskHandle_t Task2_Handler;         //任务句柄
void task_2(void *pvParameters);    //任务函数

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
	delay_init(180);                //初始化延时函数
    LED_Init();                     //初始化LED 
    KEY_Init();
    uart_init(115200);              //初始化串口
    //创建task1任务
    xTaskCreate((TaskFunction_t )task_1,     	  //任务函数
                (const char*    )"task_1",   	  //任务名称
                (uint16_t       )50,              //任务堆栈大小
                (void*          )NULL,		      //传递给任务函数的参数
                (UBaseType_t    )2,	              //任务优先级
                (TaskHandle_t*  )&Task1_Handler); //任务句柄        
    //创建task2任务
    xTaskCreate((TaskFunction_t )task_2,     
                (const char*    )"task_2",   
                (uint16_t       )50, 
                (void*          )NULL,
                (UBaseType_t    )2,
                (TaskHandle_t*  )&Task2_Handler);
    vTaskStartScheduler();          //开启任务调度
}

//task_1任务函数 
void task_1(void *pvParameters)
{
    while(1)
        printf("1");
}   

//task_2任务函数
void task_2(void *pvParameters)
{
    while(1)
        printf("2");
}

 效果:

 

对于 FreeRTOS 来说,同等优先级的任务会在时间片反复切换。在上述代码中,task1 和 task2 的优先级都是2,所以每一个时间片上就会切换一次任务,导致这样的效果。

  2.4 FreeRTOS 内部实现

在图上三个是我们需要编写的,下三步是 FreeRTOS 替我们完成的。

2.5 TCB 任务控制块

本篇暂时不解析其他的流程,我们来详解 TCP 任务控制块。他是一个结构体,可以看成是任务的身份证,每一个任务都有自己任务控制块,结构体成员保存了任务的特征,任务、优先级、任务状态等。

typedef struct tskTaskControlBlock             
    {
        // 这里栈顶指针必须位于TCB第一项是为了便于上下文切换操作,详见xPortPendSVHandler中任务切换的操作。
        volatile StackType_t    *pxTopOfStack;    
        // 表示任务状态,不同的状态会挂接在不同的状态链表下
        ListItem_t            xStateListItem;    
        // 事件链表项,会挂接到不同事件链表下
        ListItem_t            xEventListItem;        
        // 任务优先级,数值越大优先级越高
        UBaseType_t            uxPriority;            
        // 指向堆栈起始位置,这只是单纯的一个分配空间的地址,可以用来检测堆栈是否溢出
        StackType_t            *pxStack;            
        // 任务名
        char                pcTaskName[ configMAX_TASK_NAME_LEN ];
        //...省略一些条件编译的成员
} tskTCB;

三、静态创建任务函数

3.1 宏定义

使用函数 xTaskCreateStatic() 来创建任务,也就是静态方法,任务的堆栈、任务控制块就需要由用户来指定了。使用静态方法创建任务的时候需要将宏configSUPPORT_STATIC_ALLOCATION设置为1,在文件FreeRTOSConfig.h中设置。

#define configSUPPORT_STATIC_ALLOCATION 1 //静态内存 

3.2 函数原型

xTaskCreateStatic() 函数原型如下:

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,  
    const char * const pcName,  
    const uint32_t ulStackDepth,  
    void * const pvParameters,  
    UBaseType_t uxPriority,  
    StackType_t * const puxStackBuffer,  
    StaticTask_t * const pxTaskBuffer ) 
参数描述
pxTaskCode任务函数
pcName任务名字,一般用于追踪和调试,任务名字长度不能超过
usStackDepth任务堆栈大小,由于本函数是静态方法创建任务,所以任务堆栈由用户给出,一般是个数组,此参数就是这个数组的大小
pvParameters传递给任务函数的参数
uxPriotiry任务优先级,范围0~ configMAX_PRIORITIES-1
puxStackBuffer任务堆栈,一般为数组,数组类型要为StackType_t类型
pxTaskBuffer任务控制块
返回值描述
NULL任务创建失败,puxStackBuffer或pxTaskBuffer为NULL的时候会导致这个错误的发生
其他值任务创建成功,返回任务的任务句柄。

对比 xTaskCreate() 来说, xTaskCreateStatic() 需要多自定添加 任务堆栈 (puxStackBuffer) 和任务控制块 (pxTaskBuffer),也就是说在在静态任务中 TCB 结构体是需要自己定义的。而且在 xTaskCreateStatic() 中,任务句柄并不是作为参数填入,而是返回值。

3.3 定义两个接口函数

开启静态内存的同时需要实现两个函数:(使用静态内存分配任务堆栈和任务控制块内存)

vApplicationGetIdleTaskMemory():空闲任务堆栈函数。实现该函数是为了给内核提供空闲任务关于空闲任务控制块和空闲任务堆栈的相关信息。

vApplicationGetTimerTaskMemory():定时器任务堆栈函数。实现该函数是为了给内核创建定时器任务时提供定时器任务控制块和定时器任务堆栈的相关信息。

//获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
//静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
//有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
//实现此函数即可。
//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
	*ppxIdleTaskStackBuffer=IdleTaskStack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}

//获取定时器服务任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer:任务控制块内存
//ppxTimerTaskStackBuffer:任务堆栈内存
//pulTimerTaskStackSize:任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&TimerTaskTCB;
	*ppxTimerTaskStackBuffer=TimerTaskStack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

3.4 示例代码

//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;

//定时器服务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
//定时器服务任务控制块
static StaticTask_t TimerTaskTCB;

//获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
//静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
//有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
//实现此函数即可。
//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
	*ppxIdleTaskStackBuffer=IdleTaskStack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}

//获取定时器服务任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer:任务控制块内存
//ppxTimerTaskStackBuffer:任务堆栈内存
//pulTimerTaskStackSize:任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&TimerTaskTCB;
	*ppxTimerTaskStackBuffer=TimerTaskStack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

TaskHandle_t Task1_Handler;         //任务句柄
void task_1(void *pvParameters);
StackType_t Task1TaskStack[128];    //任务堆栈
StaticTask_t Task1TaskTCB;          //任务控制块  

TaskHandle_t Task2_Handler;         //任务句柄
void task_2(void *pvParameters);
StackType_t Task2TaskStack[128];    //任务堆栈
StaticTask_t Task2TaskTCB;          //任务控制块

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
	delay_init(180);                //初始化延时函数
    LED_Init();                     //初始化LED 
    KEY_Init();
    uart_init(115200);              //初始化串口
    //创建开始任务
     taskENTER_CRITICAL();           //进入临界区
    //创建task1任务
    Task1_Handler = xTaskCreateStatic((TaskFunction_t )task_1,     	
                (const char*    )"task_1",   	
                (uint16_t       )50, 
                (void*          )NULL,				
                (UBaseType_t    )2,	
                (StackType_t*   )Task1TaskStack,	
				(StaticTask_t*  )&Task1TaskTCB);   
    //创建task2任务
    Task2_Handler = xTaskCreateStatic((TaskFunction_t )task_2,     
                (const char*    )"task_2",   
                (uint16_t       )50, 
                (void*          )NULL,
                (UBaseType_t    )2,
                (StackType_t*   )Task2TaskStack,	
				(StaticTask_t*  )&Task2TaskTCB);        
    taskEXIT_CRITICAL();            //退出临界区
                
    vTaskStartScheduler();          //开启任务调度
}


//LED0任务函数 
void task_1(void *pvParameters)
{
    while(1)
    {
        printf("1");
    }
}   

//LED1任务函数
void task_2(void *pvParameters)
{
    while(1)
    {
        printf("2");
    }
}

3.5 实现流程

嵌入式FreeRTOS学习八,xTaskCreate创建任务的细节以及恢复中断任务实现 xTaskCreate创建任务以及恢复中断任务实现 阅读详情

相关推荐

FreeRTOS学习三(任务相关API函数)

1.xTaskCreate() 创建任务(动态内存) 此函数用来创建一个任务,任务需要RAM来保存与任务相关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话,那么任务所需要的RAM就会自动的从FreeRTOS的堆中分配。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行,那么此任务就会立即进入运行态开始运行。不管在任务调度器启动前还是启动后,都可以创建任务。 函数原型如下: BaseType_t xT...

qq_26226375的博客 3532

FreeRTOS入门--任务

要注意的是:这个函数不能返回同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数函数内部,尽量使用局部变量:每个任务都有自己的栈每个任务运行这个函数时任务A的局部变量放在任务A的栈里、任务B的局部变量放在任务B的栈里不同任务的局部变量,有自己的副本/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 *//* 任务函数通常实现为一个无限循环 */for(;;/* 任务的代码 */

weixin_57604904的博客 5990

FreeRTOS之xTaskCreate()

xTaskCreate()函数解析 task. h BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, configSTACK_DEPTH_TYPE usStackDepth...

5念since 2万+

FreeRTOS之xTaskCreateStatic()

xTaskCreateStatic()函数解析 task. h BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, configSTACK_DEPTH_TYPE usStac...

5念since 8138

1.FreeRTOS之任务的创建

本篇文章将介绍FreeRTOS任务的创建(动态方法和静态方法),了解什么是任务和任务的具体创建方法。

sycc512的博客 1252

FreeRTOS动态创建任务

FreeRTOS的动态任务创建与删除

qq_23852045的博客 3178

FreeRTOS从入门到精通 第三章(任务创建和任务删除)

(1)任务的创建和删除本质就是调用FreeRTOS的API函数。API函数描述动态方式创建任务静态方式创建任务删除任务(2)动态创建任务与静态创建任务:①动态创建任务——任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配。②静态创建任务——任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供。(3)任务控制块:/* 任务栈栈顶,必须为TCB的首个成员 *//* 任务状态列表项 *//* 任务事件列表项 */

Zevalin的博客 3089

FreeRTOS任务的创建(动态方法和静态方法)

本篇文章将介绍FreeRTOS任务的创建(动态方法和静态方法),了解什么是任务和任务的具体创建方法。本篇文章我们详细的介绍了FreeRTOS任务的创建,并介绍了这两种方法创建任务的区别,希望大家好好理解并多加练习。

m0_49476241的博客 7108

FreeRTOS学习笔记02-任务创建和删除(动态方法和静态方法)

FreeRTOS任务创建和删除(动态方法和静态方法)1 前言1.1 任务创建参数描述返回值用法举例1.2 任务删除函数描述参数描述2 FreeRTOS任务创建分析创建任务堆栈和任务TCB初始化任务TCB必要的字段初始化任务堆栈进入临界区当前任务数量增加1为第一次运行做必要的初始化更新当前正在运行的任务TCB指针将新创建的任务加入就绪列表数组退出临界区3 任务创建和删除(动态方法)3.1 任务创建示例(动态方法) 1 前言 任务创建和删除API函数位于文件task.c中,需要包含task.h头文件。 1.1

宁静致远的博客 2850

PX4自定义uORB消息与MAVLink消息映射实战:从飞控到QGC地面站完整流程解析

本文详细解析PX4飞控中自定义uORB消息与MAVLink消息映射的完整流程,涵盖从飞控内部消息定义、MAVLink消息创建到QGC地面站接收显示的全链路实践。重点介绍如何使用mavlink inspector工具进行调试,解决版本兼容性和多实例消息处理等常见问题,为无人机开发者提供可靠的实时数据监控方案。

ll5678的博客 1068

Python海康摄像头SDK二次开发

摘要:为解决海康威视摄像头RTSP拉流延迟严重的问题,本文提出改用海康私有SDK直接取流的方案。通过下载海康设备网络SDK并调用其Python接口,实现了低延迟的视频流获取。文中详细介绍了SDK配置流程,并提供了优化版的Python代码示例,重点解决回调函数处理、队列缓冲和CPU占用等问题。测试结果表明,该方案显著降低了延迟,同时保持了较高的帧率(30FPS以上)和较低的CPU占用率(约2%)。相较于传统OpenCV+FFmpeg的RTSP方案,海康SDK直接取流在实时性方面具有明显优势。

xiaohouzi112233的博客 2608

基于STM32F103的FreeRTOS系列(九)·任务创建函数的使用·静态方法和动态方法

来实现的,这个值可以随意设置,但是设置完后需要根据这个值来初始化系统滴答定时器,在这里,我们使用的是STM32F1系列的,其SysTick 有两种模式:一种是 8 分频模式(AHB/8),一种是 FCLK 模式(AHB)。对于任务函数“start_task”,为了确保在创建任务的过程中,任务调度不会被中断,可以调用taskENTER_CRITICAL();进行进入和退出临界区,先进行任务的创建,防止中断服务例程调用调度函数,导致任务调度在任务创建过程中进行,从而导致潜在的错误或资源争用。

时光の尘的博客 1207

工创赛智能搬运小车实战:视觉定位、底盘控制与RTOS调度

智能搬运系统是嵌入式控制与机器视觉融合的典型工程实践,其核心在于视觉定位精度、运动控制稳定性与实时任务调度能力。在有限算力(如STM32H7)、低功耗约束和结构化场景下,传统CV方法(如FAST+RANSAC)比轻量级深度学习更具鲁棒性与实时性;而底盘控制需穿透PID表层,直击死区补偿、编码器硬件滤波与负载自适应等物理层细节;RTOS则不是炫技工具,而是保障多模块时序确定性的刚需——尤其在视觉-控制-执行强耦合链路中,任务优先级、事件组通信与栈安全直接影响系统存活。本文聚焦全国大学生工程训练竞赛(工创赛)真

weixin_29194693的博客 274

【2】STM32·FreeRTOS·任务创建和删除

动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由 FreeRTOS 从 FreeRTOS 管理的堆中分配。静态创建任务:任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供。:更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务。将设计四个任务:start_task、task1、task2、task3。将设计四个任务:start_task、task1、task2、task3。

Cute758的博客 1618

硬全桥副边钳位管Vds电压凸台揭秘——寄生参数引发的导通异常

本文深入分析了硬全桥副边钳位管Vds电压凸台现象,揭示了寄生参数如何引发导通异常。通过波形分析和工程实践,详细解析了走线电感的蓄能效应和体二极管的接力作用,并提供了PCB布局优化、元件选型和驱动电路调整等解决方案,帮助工程师有效应对这一常见问题。

weixin_30825581的博客 430

6、Cocos2D游戏开发:精灵添加与角色实现

本文详细介绍了在Cocos2D游戏开发中如何添加背景精灵和玩家角色精灵。通过创建GameScene场景、组织项目资源、使用多分辨率图像适配不同设备,并深入讲解了将角色拆分为上下半身以实现更真实瞄准效果的原理。文章还解析了Cocos2D的图像搜索机制、锚点概念及其应用,以及如何通过父子节点关系管理复合角色。最终实现了猎人角色在场景中的正确显示与定位,为后续动画和交互功能打下基础。

e3f4g5的博客 90

五、FreeRTOS之FreeRTOS的任务创建和删除

任务的创建和删除本质就是调用FreeRTOS的API函数。

王同学 1770

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1173

FreeRTOS动态 / 静态创建和删除任务

FreeRTOS的动态 / 静态创建和删除任务

m0_73931287的博客 1702

Chamfer Loss

ChamferLoss是一种常用于3D点云(pointcloud)处理的损失函数,特别是在点云生成和对齐任务中。它的目的是度量两个点集之间的相似度,特别是在点云重建、配准或生成等任务中,常用于优化模型使得生成的点云更接近真实的点云。

夜空中明亮的星的专栏 455

mjlab MuJoCo 人形机器人强化学习入门教程(一)安装配置使用

mjlab是融合IsaacLab API与MuJoCo物理引擎的强化学习工具,提供轻量级GPU加速仿真方案。当前处于测试阶段,支持Linux系统(推荐)和有限macOS支持。核心优势包括:1)直接集成MuJoCo Warp实现裸机性能;2)保留IsaacLab成熟的RL抽象层;3)简化安装流程。与IsaacLab相比更专注于MuJoCo生态,适合刚体机器人RL研究。文档包含详细安装指南、平台兼容性说明、与IsaacLab的API差异对比及常见问题解答。项目正在积极开发中,欢迎社区贡献和反馈。

2506_90492529的博客 2002

FreeRTOS 的任务创建和删除

在 FreeRTOSConfig.h 中。/* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/ # define START_TASK_PRIO 1 /* 任务优先级 */ # define START_TASK_STACK_SIZE 128 /* 堆栈大小,单位字,乘以 4 变成字节 */ TaskHandle_t start_task_handler;/* 任务句柄 */ void start_task(void * pvParameters);

ma123456542的博客 2289

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【03】FreeRTOS的任务创建(静态和动态)和删除

* 任务栈栈顶,必须为TCB的第一个成员 *//* 任务状态列表项 *//* 任务事件列表项 *//* 任务优先级,数值越大,优先级越大 *//* 任务栈起始地址 *//* 任务名字 */省略很多条件编译的成员} tskTCB;任务控制块是一个结构体,结构体存在很多的成员变量,就好比任务的身份证,保留了任务的一些特征。参数介绍:任务栈顶指针。必须为TCB的第一个成员,因为和任务切换、任务上下文保存、任务恢复都息息相关。:任务状态列表项。

小浪宝宝的博客 2443

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

FreeRTOS的静态方法创建任务和删除(标准库)

本文以FreeRTOS的静态方法创建任务和删除(标准库),使用的电路板为STM32F103C8T6

qq_63796876的博客 1145

FreeRTOS动态任务和静态任务创建

去task.c中将任务参数复制到main中然后将const去掉,它会限制参数类型,任务大小、任务优先级、任务句柄需要去宏定义,任务句柄是指针类型要取地址//开启任务调度,.c中1900多行创建了任务函数就要去定义,在task.h定义,在.c中通过动态任务函数跳转到.h中,将vTaskCode复制过去for(;;然后把vTaskCode改成任务名,之后去声明,之后我在函数中写两个任务,这两个任务和之前任务的创建过程一样,这个任务需要删除任务。

2202_75840803的博客 1299
上一篇: 电子器件 二极管
下一篇: ESP32 freeRTOS笔记 参数传递、任务优先级
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值