果果小师弟.
电子信息工程硕士在读,分享单片机、嵌入式linux、物联网等知识,致力于打造最硬核的嵌入式技术公众号。
摘要:学过用过FreeRTOS的人都知道,在创建任务时候我们都要定义一个任务句柄,这个任务句柄有啥含义?书上的解释是任务创建成功以后会返回此任务的任务句柄,这个句柄就是任务的堆栈。此参数就用来保存这个任务句柄。其他API函数可能会使用到这个句柄。
那么任务句柄是到底是怎么一回事,它保存的是任务控制块的首地址。那么它又是如何来保存任务的首地址呢?这就是我们今天要讨论的话题。我尽量写得通俗易懂,让大家都能轻松理解。
1、创建一个任务动态创建一个任务
#define TASK1_TASK_PRIO 1 //任务优先级
#define TASK1_STK_SIZE 128 //任务栈大小
TaskHandle_t Task1Task_Handler; //任务句柄
//动态创建一个任务1
xTaskCreate((TaskFunction_t )task1_task, //任务函数
(const char* )"task1_task", //任务名称
(uint16_t )TASK1_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )TASK1_TASK_PRIO, //任务优先级
(TaskHandle_t* )&Task1Task_Handler); //任务句柄
//task1任务函数
void task1_task(void *pvParameters)
{
for(;;)
{
vTaskDelay( 2000 );
}
}
参数:
- 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:任务创建失败,因为堆内存不足!
在创建一个任务时一般都会在程序开头都有这三个宏定义
要指定任务的优先级、任务的栈大小,以及任务的句柄。
优先级很好理解,它决定了多个任务之间执行任务的先后顺序,任务的栈大小也很理解,在创建任务时,任务的局部变量以及任务切换时的数据都保存在栈里面。那么任务句柄是怎么一回事,它保存的是任务控制块的首地址。那么它又是如何来保存任务的首地址呢?这就是我们今天要讨论的话题。
创建任务是时传入的是一个指针?
是一个指针吗?
不是,是一个指针的指针。
为什么要传入指针的指针?
什么是指针的指针?
这些问题都需要搞明白你才能解决这个问题?
二、二级指针正好前两天在公众号看到了这样一篇文章,里面有一道C语言的题可以引用来解释我们今天的问题,我们一起来看一下
上面这个代码有好几处错误,它的目的很简单,就是想把字符串hello world拷贝给str,但是它能拷贝成功吗?
很显然是不可以的。