首页 > 其他分享 >Freertos学习02-Task传入参数

Freertos学习02-Task传入参数

时间:2023-06-26 12:34:14浏览次数:41  
标签:02 Task Freertos int void include pvParam mytask pInt

一、前言

介绍了freertos具有许多特点,其中的任务调度将有助提高系统的实时性,并将各任务解耦,有助于产品的后续维护与开发,上一节介绍了freertos中关于任务的创建与删除,这一节介绍如何在创建函数的同时并传递参数。

二、传递参数

再次回顾xTaskCreate()函数的用法以及各输入参数,其中第四个输入参数"void* pvParameters"是一个空类型指针,使用空类型指针可以传入任意类型的数据,下面分别展示传入整型(int)、数组(array)、字符串(string)、结构体(struct)几种类型数据。

空类型指针:空指针和空类型指针是两个不同的概念。空指针是指一个指针变量指向的地址为空,而空类型指针是指一个指针变量的类型为空,需要注意的是空类型指针不能直接进行指针运算,因为它的类型未定义或未知。如果需要进行指针运算,我们需要将其转换为具体的指针类型。

image

三、示例

1.传入整型数据

1)首先定义变量testNum,并传入xTaskCreate()中,将&testNum地址强制转换为空指针类型,

int testNum = 1;
xTaskCreate(mytask, "mytask", 1024, (void *)&testNum, 1, &xHandle);

2)mytask()函数接收到该变量地址,由于空类型指针无法直接参与运算,首先将它转换为int类型指针

void mytask(void *pvParam)
{
   for (;;)
   {
      int *pInt;
      pInt = (int *)pvParam;
      printf("%d\n", *pInt);
   }
}

完整代码如下:

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

void mytask(void *pvParam)
{
   for (;;)
   {
      int *pInt;
      pInt = (int *)pvParam;
      printf("%d\n", *pInt)
   }
}
int testNum = 1;

void app_main(void)
{

   TaskHandle_t xHandle = NULL; //任务句柄,类似任务的数字标记,识别码,名字
   xTaskCreate(mytask, "mytask", 1024, (void *)&testNum, 1, &xHandle); //传入参数(void *)&testNum

}

2.传入数组类型

1)首先定义数组并赋值,并将数组地址传入xTaskCreate()函数中,由于数组的名字就是数组的地址,也就是第一个数组元素的地址,所以直接在函数中写数组名即可。

int testNum[] = {4,8,12};
xTaskCreate(mytask, "mytask", 2048, (void *)testNum, 1, &xHandle);

2)在mytask任务函数中把数组中的元素全部打印出来

void mytask(void *pvParam)
{
	for (;;)
	{
		int *pInt;
		pInt = (int *)pvParam;
		printf("%d\n", *pInt);
		printf("%d\n", *(pInt + 1));
		printf("%d\n", *(pInt + 2));
		vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
	}
}

完整代码如下:

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

void mytask(void *pvParam)
{
	for (;;)
	{
		int *pInt;
		pInt = (int *)pvParam;
		printf("%d\n", *pInt);
		printf("%d\n", *(pInt + 1));
		printf("%d\n", *(pInt + 2));
		vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
	}
}
int testNum[] = {4, 8, 12};

void app_main(void)
{

	TaskHandle_t xHandle = NULL;									   // 任务句柄,类似任务的数字标记,识别码,名字
	xTaskCreate(mytask, "mytask", 2048, (void *)testNum, 1, &xHandle); // 传入参数(void *)testNum
}

3.传入字符串

C语言中并没有字符串类型的变量,实际上我们可以把它理解为一个字符数组,我们一般可以这样对字符串初始化

char *message = "Hello World!";

// 上面的语句也可以拆分成下面两句
char *message;
message = "Hello World!";    // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作

更常用的是:
char charArray[] = "Hello World!"; // 声明并初始化一个字符数组
或者:
char charArray[] = {'H','e','l','l','o'}; // 声明并初始化一个字符数组
综上,C语言中并不存在字符串变量类型,将其理解为字符数组,可以通过数组进行定义,也可通过指针进行初始化。
1)定义字符串Xmessage,并将字符串地址传入xTaskCreate中

char *Xmessage = "I love noob!";
xTaskCreate(mytask, "mytask", 2048, (void *)Xmessage, 1, &xHandle);

2)在任务函数中将字符串打印出来

void mytask(void *pvParam)
{
	for (;;)
	{
		char *pInt;
		pInt = (char *)pvParam;
		printf("%s\n", pInt);
		vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
	}
}

完整代码如下:

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

void mytask(void *pvParam)
{
	for (;;)
	{
		char *pInt;
		pInt = (char *)pvParam;
		printf("%s\n", pInt);
		vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
	}
}
char *Xmessage = "I love noob!";

void app_main(void)
{

	TaskHandle_t xHandle = NULL;									   // 任务句柄,类似任务的数字标记,识别码,名字
	xTaskCreate(mytask, "mytask", 2048, (void *)Xmessage, 1, &xHandle); // 传入参数(void *)Xmessage
}

3.传入结构体类型

1)初始化结构体,构造一个名为xstruct的结构体,该结构体有两个成员,分别是num1和num2,d对结构体赋值并传地址入xTaskCreate()函数

typedef struct Xstruct
{
   int num1;
   int num2;

} xstruct;
xstruct xtest = {2, 4};
xTaskCreate(mytask, "mytask", 2048, (void *)&xtest, 1, &xHandle);

2)在任务函数中打印结构体成员的数值

void mytask(void *pvParam)
{
   for (;;)
   {
   	xstruct *pInt;
   	pInt = (xstruct *)pvParam;
   	printf("First num is %d\n", pInt->num1);
   	printf("Second num is %d\n", pInt->num2);
   	vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
   }
}

完整代码如下:

#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"

typedef struct Xstruct
{
   int num1;
   int num2;

} xstruct;

void mytask(void *pvParam)
{
   for (;;)
   {
   	xstruct *pInt;
   	pInt = (xstruct *)pvParam;
   	printf("First num is %d\n", pInt->num1);
   	printf("Second num is %d\n", pInt->num2);
   	vTaskDelay(500 / portTICK_PERIOD_MS); // 延时
   }
}
xstruct xtest = {2, 4};

void app_main(void)
{

   TaskHandle_t xHandle = NULL;									  // 任务句柄,类似任务的数字标记,识别码,名字
   xTaskCreate(mytask, "mytask", 2048, (void *)&xtest, 1, &xHandle); // 传入参数
}

THE END!

标签:02,Task,Freertos,int,void,include,pvParam,mytask,pInt
From: https://www.cnblogs.com/seekwhale13/p/17504220.html

相关文章

  • 集成板级摄像头行业市场调研及趋势分析报告2023-2029
    2023-2029全球集成板级摄像头行业调研及趋势分析报告2022年全球集成板级摄像头市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国集成板级摄像头市场占据全球约%的市场份额,为全......
  • 家用电器用电机行业市场调研及趋势分析报告2023-2029
    2023-2029全球家用电器用电机行业调研及趋势分析报告2022年全球家用电器用电机市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国家用电器用电机市场占据全球约%的市场份额,为全......
  • Hugging Face 入选 Time《时代周刊》2023 全球前 100 最具影响力的公司
    ......
  • embos vs freertos
    embOS和FreeRTOS都是实时操作系统(RTOS),它们用于嵌入式系统开发。这两个系统都提供了用于管理任务、时间和资源的功能,以便在有限的硬件资源下实现实时性能。embOS是由SEGGER公司开发的专有软件,它提供了用于多种微控制器和微处理器的版本。FreeRTOS是一个开源的实时操作系统......
  • Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(Distributed Management
    Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(DistributedManagementTaskForce)开发和维护。它基于RESTfulAPI设计,使用JSON或OData格式进行数据交换。Redfish旨在提供简化、灵活和可互操作的远程管理解决方案,取代或与传统的远程管理技术(如IPMI)配合使用。Redfish......
  • 参与 2023 第二季度官方 Flutter 开发者调查
    Flutter3.10已经正式发布,每个季度一次的Flutter开发者调查也来啦!邀请社区的各位成员们填写:调研旨在了解你对Flutter的满意程度以及对其各个子系统的反馈。你的意见将对我们改进Flutter的功能和性能产生重要影响。在这次调研中,我们会继续通过对Flutter核心框架、Dart......
  • 20230626水题选做
    「数学基础」第6章期望问题单选错位题意单选把答案填在后面那道题了。假设所有题都正确,求答对题目的期望值。分析期望入门题。\(E(Ans)=\sumP[i]\)。那么显然有答对本题的期望为\(\dfrac{1}{\max\left(a\left[i+1\right],a\left[i\right]\right)}\)。代码#inc......
  • [SWPUCTF 2022 新生赛]file_master wp
    前置知识点:这个题目的有一点之前是没有看见过的,就是对图片的宽和高进行了一些限制,限制都小于20才能上传成功看了别人的wp说是可以直接定义#defineheight1#definewidth1就是上面的只要把后面的数字改成小于20的就可以了(20是题目要求的,imagehightandwidthmustl......
  • 关于VS2022---Git使用指南
    第一步 输入对应的地址,并点击创建并推送第二步:添加文件、修改文件、删除文件  点击添加修改项,并推送数据库......
  • 发布一个Visual Studio 2022 插件,可以自动完成构造函数依赖注入代码
    赖注入(DI)在开发中既是常见的也是必需的技术。它帮助我们优化了代码结构,使得应用更加灵活、易于扩展,同时也降低了各个模块之间的耦合度,更容易进行单元测试,提高了编码效率和质量。不过,手动注入依赖项也可能会成为我们开发过程中的瓶颈。通常情况下,当我们需要注入大量依赖对象时,我......