0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS任务如何创建和删除?

安芯教育科技 来源:极术社区 作者:朱工 2021-03-11 18:08 次阅读

FreeRTOS移植到Cortex-M3硬件平台的文章中,我们已经见过任务创建API,但那篇文章的重点在于如何移植FreeRTOS,本文将重点放在任务的创建和删除API函数上面。

任务创建和删除API函数位于文件task.c中,需要包含task.h头文件。

1. 任务创建

1.1 函数描述

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t * pvCreatedTask );

创建新的任务并加入任务就绪列表。

如果使用FreeRTOS-MPU(在官方下载包中,为Cortex-M3内核写了两个移植方案,一个是普通的FreeRTOS移植层,还有一个是FreeRTOS-MPU移植层。后者包含完整的内存保护),那么推荐使用函数xTaskCreateRestricted()来代替xTaskCreate()。在使用FreeRTOS-MPU的情况下,使用xTaskCreate()函数可以创建运行在特权模式或用户模式(见下面对函数参数uxPriority的描述)的任务。当运行在特权模式下,任务可以访问整个内存映射;当处于用户模式下,任务仅能访问自己的堆栈。无论在何种模式下,MPU都不会自动捕获堆栈溢出,因此标准的FreeRTOS堆栈溢出检测机制仍然会被用到。xTaskCreateRestricted()函数具有更大的灵活性。

1.2 参数描述

pvTaskCode:指针,指向任务函数的入口。任务永远不会返回(位于死循环内)。该参数类型TaskFunction_t定义在文件projdefs.h中,定义为:typedefvoid (TaskFunction_t)( void )。

pcName:任务描述。主要用于调试。字符串的最大长度由宏configMAXTASKNAMELEN指定,该宏位于FreeRTOSConfig.h文件中。

usStackDepth:指定任务堆栈大小,能够支持的堆栈变量数量,而不是字节数。比如,在16位宽度的堆栈下,usStackDepth定义为100,则实际使用200字节堆栈存储空间。堆栈的宽度乘以深度必须不超过sizet类型所能表示的最大值。比如,sizet为16位,则可以表示的最大值是65535。

pvParameters:指针,当任务创建时,作为一个参数传递给任务。

uxPriority:任务的优先级。具有MPU支持的系统,可以通过置位优先级参数的portPRIVILEGEBIT位,随意的在特权(系统)模式下创建任务。比如,创建一个优先级为2的特权任务,参数uxPriority可以设置为( 2 | portPRIVILEGE_BIT )。

pvCreatedTask:用于回传一个句柄(ID),创建任务后可以使用这个句柄引用任务。

1.3 返回值

如果任务成功创建并加入就绪列表函数返回pdPASS,否则函数返回错误码,具体参见projdefs.h。

1.4 用法举例

/* 创建任务。 */void vTaskCode( void * pvParameters ){ for( ;; ) { /* 任务代码放在这里 */ }} /* 创建任务函数 */void vOtherFunction( void ){ static unsigned char ucParameterToPass; xTaskHandlexHandle; /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期, 因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为 中断和高优先级任务可能会用到它。*/ xTaskCreate( vTaskCode, “NAME”, STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); /* 使用句柄删除任务。 */ if( xHandle !=NULL ) { vTaskDelete( xHandle ); }}

2. 任务删除

2.1 任务描述

voidvTaskDelete( TaskHandle_t xTask );

RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。

注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。

2.2 参数描述

xTask:被删除任务的句柄。为NULL表示删除当前任务。

原文标题:FreeRTOS系列第10篇---FreeRTOS任务创建和删除

文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119410
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61988

原文标题:FreeRTOS系列第10篇---FreeRTOS任务创建和删除

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    freertos最多支持多少个任务

    FreeRTOS是一个轻量级的实时操作系统(RTOS),其设计初衷就是为了提供简单、可靠且高效的实时任务管理。关于FreeRTOS最多支持多少个任务的问题,实际上并没有一个固定的上限,
    的头像 发表于 09-02 14:21 671次阅读

    esp8266的freertos+lwip不支持在多个任务创建多个不同的socket吗?

    的socket fd。也就是说每个socket都是在各自的任务创建、读写和close的,按照道理应该是互相独立的,但是为啥会互相影响? 难道乐鑫的esp8266的freertos+lwip不支持在多个
    发表于 07-11 07:29

    vTaskDelete()删除正在打印日志的任务导致esp32卡死无法恢复要怎么处理?

    实际的应用场景是录音的时候创建了一个任务去读i2s数据,放到一个ringbuf里,然后主任务从ringbuf里取数据进行降噪编码处理。 长跑测试发现设备在执行录音时偶然会发生死机现象,排查发现是读
    发表于 06-17 07:48

    请问一下FREERTOS只能创建4个任务,修改哪个宏定义可以增加创建任务的数量?

    请问一下FREERTOS只能创建4个任务,修改哪个宏定义可以增加创建任务的数量?解决方法:增加FREER
    发表于 05-13 06:44

    基于STM32Cubemx创建FreeRTOS创建UART任务遇到的两个问题求解

    基于STM32Cubemx创建FreeRTOS创建UART任务,经过测试发现有以下两个问题: 1、串口波特率问题: 在STM32Cubemx中串口设置如下: /* USART3 in
    发表于 05-10 07:33

    用STM32CubeMX中的FreeRTOS创建3任务无法运行的原因?

    用STM32CubeMX中的FreeRTOS 创建3任务 Task Priority =osPrioirityNoral 等级的任务,无法运行。 如果
    发表于 05-09 07:02

    HarmonyOS开发案例:【Stage模型下Ability的创建和使用】

    基于Stage模型,对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability,并使用UIAbilityContext启动
    的头像 发表于 05-08 14:41 676次阅读
    HarmonyOS开发案例:【Stage模型下Ability的<b class='flag-5'>创建和</b>使用】

    freertos系统如何划分任务

    正在看freertos方面的教程,想请教下如何划分任务? 比如之前做的一个数据采集板,用到了单片机以下功能: 1,单片机通过SPI1和ADC芯片通讯,同时还要通过SPI控制ADC电路部分的其他外围
    发表于 05-08 07:16

    freertos任务创建,每一个任务分配的内存是多大才好,怎么计算呢?

    小白刚刚接触freertos,想问一下就创建任务而言,每一个任务分配的内存是多大才好,怎么计算呢? 另外,每个任务的执行周期怎么确定?在
    发表于 04-23 06:39

    请问FreeRTOS同一个任务多次创建会有什么后果?

    比如在初始创建任务时就创建任务1、2、3、4、5 然后在任务2过程中又再次创建
    发表于 04-15 06:36

    FreeRTOS任务无故进入挂起状态的原因?

    请教大家一个问题,我子啊使用FreeRTOS的时候创建了一个以太网的任务任务在使用的过程中被无故挂起,请问一下出现这种现象有哪几种原因呢?
    发表于 04-09 07:20

    FreeRTOS如何删除clib支持和抽象rtos?

    我目前在我的项目中使用FreeRTOS,但只使用了其最少的功能。 我需要删除 clib 支持和抽象 rtos,只保留 FreeRTOS。 这是为了实现更轻的应用程序并最大限度地减少依赖关系。 我怎么能那样做?
    发表于 01-25 06:19

    如何可视化FreeRTOS任务响应时间

    高效的开发基于FreeRTOS的固件需要理解任务、中断和内核之间的交互以及时间序列。
    的头像 发表于 12-22 11:12 1014次阅读
    如何可视化<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>响应时间

    线程池的创建方式有几种

    线程池是一种用于管理和调度线程的技术,能够有效地提高系统的性能和资源利用率。它通过预先创建一组线程并维护一个工作队列,将任务提交给线程池来处理,从而减少线程的创建和销毁次数,避免了线程频繁创建
    的头像 发表于 12-04 16:52 821次阅读

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 941次阅读