Task的创建与删除


Task的创建与删除

Task的创建

任务就是永远不会退出的C函数,因此,通常被实现为一个无限循环。pvTaskCode参数只是一个指向实现该任务的函数的指针(实际上,就是函数名)。

#include “FreeRTOS.h”
#include “task.h”
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
                       const char * const pcName,
                       unsigned short usStackDepth,
                       void *pvParameters,
                       UBaseType_t uxPriority,
                       TaskHandle_t *pxCreatedTask );
第一步创建Task主体函数
void myTask(void *pvPragma)
{
    while (1)
    {
        printf("Hello world!\n In the Task!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }  
}
第二步在main函数主体里xTaskCreate
xTaskCreate(task函数的指针,taskName,分配内存,传递参数(会通过方法传入myTask的参数列表),优先级,task句柄);

xTaskCreate(myTask,"mytask1",1024,NULL,1,NULL);

在这里需要注意的是null必须要大写否则会导致编译失败

运行成功

在这里插入图片描述

删除Task

方法一

获取Task句柄,调用vTaskDelete删除

xTaskCreate需要获取任务句柄的地址

void app_main(void)
{
    // 创建Task句柄
    TaskHandle_t myHandle = NULL;

    xTaskCreate(myTask, "mytask1", 1024, NULL, 1, &myHandle);
	
    // 判断句柄不为空
    if (myHandle != NULL)
    {
        vTaskDelete(myHandle);
    }
}

没有打印任何信息

code2

void app_main(void)
{
    // 创建Task句柄
    TaskHandle_t myHandle = NULL;

    xTaskCreate(myTask, "mytask1", 1024, NULL, 1, &myHandle);

    vTaskDelay(1000 / portTICK_PERIOD_MS);

    // 判断句柄不为空
    if (myHandle != NULL)
    {
        vTaskDelete(myHandle);
    }
}

在这里插入图片描述

code3

修改为vTaskDelay(8000 / portTICK_PERIOD_MS);
在这里插入图片描述

通过上述函数可以总结实验结果,说明Task函数与主函数main是并行运行的

方法二

xTaskCreate(myTask, "mytask1", 1024, NULL, 1, NULL);

修改myTask函数

void myTask(void *pvPragma)
{
    // while (1)
    {
        printf("Task first!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        printf("Task second!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        printf("Task third!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL);
}

在这里插入图片描述

通过vTaskDelete(NULL);让task自己把自己删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
task_struct是进程控制块(PCB),用于描述一个进程的结构体。在Linux内核中,进程的创建和销毁是由进程管理子系统负责的。当一个进程被终止时,其task_struct结构体所占用的内存需要被释放,以便其他进程能够使用这部分内存。 内核中使用kfree()函数来释放动态分配的内存,其中包括task_struct结构体。这个函数会将指定的内存块返回给内核内存管理子系统,以供后续的内存分配操作使用。 在进程终止时,内核会调用exit()函数来触发进程的销毁操作。在exit()函数中,首先会释放进程所占用的资源(如打开的文件、分配的内存等),然后调用do_exit()函数来进行最终的进程销毁操作。 在do_exit()函数中,会调用put_task_struct()函数来释放进程的task_struct结构体所占用的内存。这个函数会首先检查该task_struct的引用计数,如果引用计数为1,表示只有一个指针引用该task_struct,则可以安全地释放其内存。如果引用计数大于1,表示还有其他指针引用了该task_struct,需要等待其他引用全部释放后再进行内存释放。 在释放task_struct内存之前,do_exit()函数还会将进程的task_struct从进程链表中移除,以便其他内核操作不再访问已经被销毁的进程。 总之,当一个进程终止时,其task_struct结构体所占用的内存会通过调用kfree()函数来释放。这个过程会在do_exit()函数中触发,并在释放内存之前检查引用计数以确保安全释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值