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

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

3天内不再提示

任务句柄是到底是怎么一回事

h1654155149.6853 来源:电子工程世界 作者:电子工程世界 2022-05-07 11:19 次阅读
摘要学过用过FreeRTOS的人都知道,在创建任务时候我们都要定义一个任务句柄,这个任务句柄有啥含义?书上的解释是任务创建成功以后会返回此任务的任务句柄,这个句柄就是任务的堆栈参数就用来保存这个任务句柄。其他API函数可能会使用到这个句柄。

那么任务句柄是到底是怎么一回事,它保存的是任务控制块的首地址。那么它又是如何来保存任务的首地址呢?这就是我们今天要讨论的话题我尽量写得通俗易懂,让大家都能轻松理解

1、创建一个任务

动态创建一个任务

#defineTASK1_TASK_PRIO1//任务优先级
#defineTASK1_STK_SIZE128//任务栈大小
TaskHandle_tTask1Task_Handler;//任务句柄
//动态创建一个任务1
xTaskCreate((TaskFunction_t)task1_task,//任务函数
(constchar*)"task1_task",//任务名称
(uint16_t)TASK1_STK_SIZE,//任务堆栈大小
(void*)NULL,//传递给任务函数的参数
(UBaseType_t)TASK1_TASK_PRIO,//任务优先级
(TaskHandle_t*)&Task1Task_Handler);//任务句柄

//task1任务函数
voidtask1_task(void*pvParameters)
{
for(;;)
{
vTaskDelay(2000);
}
}
cc620efc-cd96-11ec-bce3-dac502259ad0.png

参数:

  • pxTaskCode:任务函数。
  • pcName:任务名字,一般用于追踪和调试,任务名字长度不能超过。configMAX_TASK_NAME_LEN,在FreeRTOSConfig.h文件中宏定义为16。
  • usStackDepth:任务堆栈大小,实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE,在FreeRTOSConfig.h文件中宏定义为130(字)。
  • pvParameters:传递给任务函数的参数。
  • uxPriority:任务优先级,范围0—configMAX_PRIORITIES-1,在FreeRTOSConfig.h文件中configMAX_PRIORITIES宏定义为32。
  • pxCreatedTask:任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其他API函数可能会使用到这个句柄。

返回值:

  • pdPASS:任务创建成功。pdPASS宏定义为1
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败,因为堆内存不足!

在创建一个任务时一般都会在程序开头都有这三个宏定义

cc7db382-cd96-11ec-bce3-dac502259ad0.png

要指定任务的优先级、任务的栈大小,以及任务的句柄。

优先级很好理解,它决定了多个任务之间执行任务的先后顺序,任务的栈大小也很理解,在创建任务时,任务的局部变量以及任务切换时的数据都保存在栈里面。那么任务句柄是怎么一回事,它保存的是任务控制块的首地址。那么它又是如何来保存任务的首地址呢?这就是我们今天要讨论的话题

cc931f38-cd96-11ec-bce3-dac502259ad0.png

创建任务是时传入的是一个指针?

是一个指针吗?

不是,是一个指针的指针。

为什么要传入指针的指针?

什么是指针的指针?

这些问题都需要搞明白你才能解决这个问题?

二、二级指针

正好前两天看到了这样一篇文章,里面有一道C语言的题可以引用来解释我们今天的问题,我们一起来看一下

ccc85c2a-cd96-11ec-bce3-dac502259ad0.png

上面这个代码有好几处错误,它的目的很简单,就是想把字符串hello world拷贝给str,但是它能拷贝成功吗?

cce61c7e-cd96-11ec-bce3-dac502259ad0.png

很显然是不可以的。

为了使大家看的更清楚,代码简单修改一下

#include
#include
#include

voidgetmemory(char*p)
{
p=(char*)malloc(100);
strcpy(p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",p,&p);
}
intmain()
{
char*str="www.baidu.cn";
getmemory(str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

按照我们一般人的的想法,结果应该是:

p:www.zhiguoxin.cn&p:xxxxxxx
str:www.zhiguoxin.cn&str:xxxxxxx

但是实际上结果是多少?

cd01f5f2-cd96-11ec-bce3-dac502259ad0.png

完全没有变化,为了彻底解决这个问题,画了一个图,希望大家能够看的更加清楚一点。

cd224b22-cd96-11ec-bce3-dac502259ad0.png

从这里可以看出来,在分配内存后,strp就分道扬镳了,而str也还是指向www.baidu.cn

如何修改呢?正确的是啥样的?

#include
#include
#include

voidgetmemory(char**p)
{
*p=(char*)malloc(100);
strcpy(*p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",*p,&(*p));
}
intmain()
{
char*str="www.baidu.cn";
getmemory(&str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

编译运行,发现没问题。

cd3d40ee-cd96-11ec-bce3-dac502259ad0.png

达到了我们想要的目的,字符串也得到了正常的拷贝。

如何解释?

函数中参数都是传值,传指针本质上也是传值,只不过它的值是指针类型罢了。如果想要改变入参内容,则需要传该入参的地址,通过解引用修改其指向的内容

这里的str的值就是*p的值,是多少?它们都是一个指针,就是保存的是一个地址,地址是多少?地址就是使用动态分配内存malloc函数分配的100字节的首地址。然后又使用strcpy()函数将hello world拷贝到*p里面。

这里面就涉及到了二级指针,首先str毫无疑问是一个指针变量对吧?那么&str是啥?理所当然就是一个指针的指针吧,就是地址的地址。

所以,我如果在某个地方申请了一块内存,如果想得到这块内存的首地址,而此时我们又定义了一个指针变量,想让这个指针来保存我们申请内存你的首地址,就必须要传入这个指针的地址,即指针的指针(二级指针)而不是传入这个指针。

至于原因上面的例子已经非常清楚的讲解了原因。

下面接着回到我们最开始的创建函数的任务句柄。在开始之前我们再把上面的函数封装一下。

cd5b026e-cd96-11ec-bce3-dac502259ad0.png
#include
#include
#include

typedefchar*TaskHandle_t;

voidgetmemory(TaskHandle_t*p)
{
*p=(char*)malloc(100);
strcpy(*p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",*p,&(*p));
}
intmain()
{
TaskHandle_tstr;
getmemory(&str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

没啥大不了的,就是就是给char*起了一个别名而已,让下面的代码看起来更加顺畅一写。

cd6d9c9e-cd96-11ec-bce3-dac502259ad0.png

这样对比一下是不是很清楚了呢?这样一来我们创建任务时候这个任务句柄就保存的是我们TCB控制块这个结构体的首地址了,知道了一个任务的TCB控制块首地址的话,那么这个任务的所有信息我是不是都知道了。是的,就是这么奇妙。通过指针的指针,二级指针来转换一下。

审核编辑 :李倩


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

    关注

    0

    文章

    182

    浏览量

    19761
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62178
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28370

原文标题:干货|FreeRTOS中的任务句柄到底是什么意思?

文章出处:【微信号:电子工程世界,微信公众号:电子工程世界】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Laird Eccosorb吸波材料的应用案例

    抑制Retimer芯片在22GHz的杂讯是一回事,准确提供所需解决方案的理想特征参数又是另外一回事。阅读下文,了解家全球网络技术制造商如何在对比九种不同的仿真结果后,最终选择Laird Eccosorb GDS(经过莱尔德实验
    的头像 发表于 10-24 09:55 346次阅读
    Laird Eccosorb吸波材料的应用案例

    功放和运放到底是什么区别?

    想请问下功放和运放到底是什么区别,感觉只要接个小负载,运放的输出电流也可以很大啊?到底有什么区别啊
    发表于 09-10 07:00

    使用Tina ti仿真ths3201时,发生源两路输入则输出不对是怎么回事

    使用Tina ti仿真ths3201时,发生源两路输入则输出不对,单路输入结果却正确。另外,我下载该仿真模型时,模型没有更新,因为更新之后,ths3201无效,无法正常仿真。请问这是怎么一回事呢?
    发表于 08-14 06:21

    块板子上,摘取焊接了四次不同的比较器,比较器型号都是tlv3702,相同测试条件但结果却不同,为什么?

    测试,在该板上摘取焊接了四个同型号比较器,四次测试结果偏差很大,且我自己排除了焊接问题,求问这是怎么一回事;个人猜测这几个比较器的功耗不同,只有功耗极低的比较器才能达到电路的理论输出,输出电压低的,功耗大,如果是我猜测的这个原因,那是不是我买的是假货;如果不是,请问有别的什么原因吗?
    发表于 08-06 06:14

    传感器和变送器是一回事?变送器和传感器有什么差异

    变送器和传感器有什么差异 变送器和传感器在测量与控制系统中的角色不同,各自有其特定的功能和应用场景。下面是详细的对比 1. 定义 传感器: 传感器是种检测装置,能感受到被测量的信息,并能将检测
    的头像 发表于 06-20 08:46 1268次阅读

    数字工厂与智能工厂是一回事

    本文旨在探讨数字工厂与智能工厂的概念、特点、技术应用及其在现代制造业中的作用。 、引言 随着科技的不断进步,制造业正经历着前所未有的变革。数字工厂和智能工厂作为现代制造业的两个重要概念,正逐渐
    的头像 发表于 06-07 15:10 665次阅读

    用STM8L152使用个矩阵键盘,信号直处于低电平状态的原因?

    想用STM8L152 使用个矩阵键盘,根据的是行列扫描的方法,但是代码调试过程中只能检测到列的信号(高低电平)的变化,信号直处于低电平状态,这是怎么一回事?哪里出问题了?
    发表于 05-15 08:31

    电机驱动芯片和电机控制芯片是一回事

    电机驱动芯片和电机控制芯片在电机系统中各自扮演着重要的角色,但它们并不是一回事
    的头像 发表于 04-08 11:15 1646次阅读

    电机和马达是一回事吗 马达和电机有什么区别

    电机和马达是一回事吗 马达和电机有什么区别 电机和马达是一回事吗? 电机和马达是同个名词的不同表达方式。在些地区,特别是中国,人们更倾向于使用“电机”来指代电动机,而在其他地区则更
    的头像 发表于 02-03 09:19 1w次阅读

    SMT生产过程中抛料是怎么一回事呢?具体需要怎么解决?

    在SMT工厂,生产过程中经常会遇到抛料的情况,甚至有时候抛料会非常严重,影响到生产效率,那么抛料是怎么一回事呢?具体需要怎么解决?
    的头像 发表于 01-24 10:42 2913次阅读

    M453VG6AE中ISP Flash和LDROM是不是一回事?它们基地址分别是什么?

    M453VG6AE芯片中 ISP Flash 和 LDROM 是不是一回事?它们基地址分别是什么?
    发表于 01-17 06:31

    密封性和气密性:并非同一回事

    在工程和制造领域,我们经常听到“密封性”和“气密性”这两个词汇,它们似乎有着相似的含义,但实际上并不是同一回事。为了更好地理解这两个概念,我们需要对它们进行些区分。图片来源于网络,侵权可删首先
    的头像 发表于 01-12 11:05 1141次阅读
    密封性和气密性:并非同<b class='flag-5'>一回事</b>

    开关磁阻电机和交流磁阻同步电机是一回事吗?

    大家好,最近项目中遇到款德国的KAISER无励磁磁阻同步电机,花了段时间研究后,还是有几个基本的概念没有搞明白: 1.开关磁阻电机和交流磁阻同步电机是一回事吗? 2.各自的控制器是什么呢?普通的变频器能实现吗?
    发表于 01-10 06:35

    java本身自带的SPI扩展机制是怎么一回事

    八股文背多了,相信大家都听说过个词,SPI 扩展 。
    的头像 发表于 01-02 10:32 688次阅读
    java本身自带的SPI扩展机制是怎么<b class='flag-5'>一回事</b>?

    整流和检波是一回事吗?整流二极管和检波二极管能互相代替吗?

    整流和检波是一回事吗?整流二极管和检波二极管能互相代替吗? 整流和检波是属于电子学中的两个不同概念,虽然它们都与二极管有关,但它们的功能和应用场景是不同的。整流和检波二极管也有些共同之处,但它
    的头像 发表于 12-29 11:28 1816次阅读