FreeRTOS任务创建和删除

任务创建和删除的API函数

  • xTaskCreate():使用动态方法创建一个任务
  • xTaskCreateStatic():使用静态方法创建一个任务
  • xTaskCreateRestricated():创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
  • vTaskDelete():删除一个任务

xTaskCreate

使用该函数,configSUPPORT_DYNAMIC_ALLOCATION要设置为1

	#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
#endif
  • pxTaskCode:函数名,任务执行的函数,我们可以把一个任务当做一个函数,只不过这个函数可以循环执行
  • pcName:任务名字,一般用于追踪和调试,任务名字不能超过configMAX_TASK_NAME_LEN,configMAX_TASK_NAME_LEN在FreeRTOSConfig.h文件中
    在这里插入图片描述
  • usStackDepth:任务堆栈大小,实际申请到的堆栈是usStackDepth的4倍,其中空闲任务堆栈大小为configMINIMAL_STACK_SIZE,configMINIMAL_STACK_SIZE在FreeRTOSConfig.h文件中定义
    在这里插入图片描述
  • pvParameters:传递给任务函数的参数
  • uxPriority:任务优先级,范围是0-configMAX_PRIORITIES-1
  • pxCreatedTask:任务句柄,任务创建成功后会返回此任务的任务句柄。

返回值:
pdPASS if the task was successfully created and added to a ready list, otherwise an error code defined in the file projdefs.h

xTaskCreateStatic

使用该函数,configSUPPORT_STATIC_ALLOCATION要等于1

#if( configSUPPORT_STATIC_ALLOCATION == 1 )TaskHandle_t xTaskCreateStatic(	TaskFunction_t pxTaskCode,const char * const pcName,const uint32_t ulStackDepth,void * const pvParameters,UBaseType_t uxPriority,StackType_t * const puxStackBuffer,StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
#endif /* configSUPPORT_STATIC_ALLOCATION */

参数的具体函数可以看xTaskCreate,

  • ulStackDepth:需要由用户给出,一般是一个数组,此参数就是这个数组的大小
  • puxStackBuffer:Must point to a StackType_t array that has at least ulStackDepth indexes - the array will then be used as the task’s stack,removing the need for the stack to be allocated dynamically.
  • pxTaskBuffer:任务控制块,pxTaskBuffer Must point to a variable of type StaticTask_t, which will then be used to hold the task’s data structures, removing the need for the memory to be allocated dynamically.

返回值:
If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned.

xTaskCreateRestricted

使用该函数,portUSING_MPU_WRAPPERS=1

#if( portUSING_MPU_WRAPPERS == 1 )BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION;
#endif
  • pxTaskDefinition:是一个结构体,描述任务函数、堆栈大小优先级等,在task.h定义
  • pxCreatedTask:任务句柄

vTaskDelete

void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;
  • xTaskToDelete:要删除任务的任务句柄
    被删除的任务不再存在,对于那些有内核自动分配给任务的内存,该函数会自动释放掉,用户给任务分配的内存需要用户自行释放掉,比如pvPortMalloc()分配了500字节的内存,那么在任务被删除之后,用户需要调用vPortFree函数将这些内存删除,否则会导致内存泄露

设计

一共有三个任务:

  • start_task:用来创建其他两个任务
  • task1_task:次任务运行5次以后,调用vTaskDelete删除任务task2_task,此任务也会控制LED0闪烁,并且周期性刷新LCD指定区域的背景颜色
  • task2_task:此任务普通的应用任务,会控制LED1的闪烁,并且周期性的率先LCD指定区域的背景颜色
动态创建

main函数代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "lcd.h"
#include "sdram.h"//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO		3
//任务堆栈大小	
#define TASK2_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);//LCD刷屏时使用的颜色
int lcd_discolor[14] = {WHITE ,BLACK,BLUE,BRED,GRED,GBLUE,RED,MAGENTA,GREEN,CYAN,YELLOW,BROWN,BRRED,GRAY};int main(void)
{HAL_Init();                     //初始化HAL库   Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhzdelay_init(180);                //初始化延时函数LED_Init();						//LED初始化ACR_BYTE0_ADDRESSuart_init(115200);SDRAM_Init();LCD_Init();		POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"Apolo STM32F4/F7");LCD_ShowString(30,30,200,16,16,"FreeeRTOS Examples");LCD_ShowString(30,50,200,16,16,"Task create and delete");LCD_ShowString(30,70,200,16,16,"2021/11/20");xTaskCreate(start_task,            //任务函数"start_task",          //任务名称START_STK_SIZE,        //任务堆栈大小NULL,                  //传递给任务函数的参数START_TASK_PRIO,       //任务优先级&StartTask_Handler);   //任务句柄      	vTaskStartScheduler();		//开启任务调度}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建TASK1任务xTaskCreate(task1_task,             "task1_task",           TASK1_STK_SIZE,        NULL,                  TASK1_TASK_PRIO,        &Task1Task_Handler);   //创建TASK2任务xTaskCreate(task2_task,     "task2_task",   TASK2_STK_SIZE,NULL,TASK2_TASK_PRIO,&Task2Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}
//task1任务函数
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//画一个矩形	LCD_DrawLine(5,130,115,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任务执1行次数加1 注意task1_num1加到255的时候会清零!!LED0=!LED0;//printf("任务1已经执行:%d次\r\n",task1_num);if(task1_num==5) {if(Task2Task_Handler != NULL)		//任务2是否存在?	{vTaskDelete(Task2Task_Handler);	//任务1执行5次删除任务2Task2Task_Handler=NULL;			//任务句柄清零//printf("任务1删除了任务2!\r\n");}}LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//显示任务执行次数vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}//task2任务函数
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //画一个矩形	LCD_DrawLine(125,130,234,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任务2执行次数加1 注意task1_num2加到255的时候会清零!!LED1=!LED1;//printf("任务2已经执行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}
静态创建

使用静态创建任务需要在FreeRTOSConfig.h将宏configSUPPORT_STATIC_ALLOCATION设置为1,配置完成之后还需要实现两个函数,vApplicationGetIdleTaskMemory和vApplicationGetTimerTaskMemory,通过这两个来给空闲任务和定时器服务任务的任务堆栈和任务控制块分配内存,这两个函数,我们在main.c里面定义:

//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;//定时器服务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
//定时器服务任务控制块
static StaticTask_t TimerTaskTCB;
//获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
//静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
//有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
//实现此函数即可。
//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{*ppxIdleTaskTCBBuffer=&IdleTaskTCB;*ppxIdleTaskStackBuffer=IdleTaskStack;*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
//获取定时器服务任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer:任务控制块内存
//ppxTimerTaskStackBuffer:任务堆栈内存
//pulTimerTaskStackSize:任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
{*ppxTimerTaskTCBBuffer=&TimerTaskTCB;*ppxTimerTaskStackBuffer=TimerTaskStack;*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

main函数里面内容为:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "lcd.h"
#include "sdram.h"//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;//定时器服务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
//定时器服务任务控制块
static StaticTask_t TimerTaskTCB;//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务控制块
StaticTask_t StartTaskTCB;
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务控制块
StaticTask_t Task1TaskTCB;
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO		3
//任务堆栈大小	
#define TASK2_STK_SIZE 		128  
//任务堆栈
StackType_t Task2TaskStack[TASK2_STK_SIZE];
//任务控制块
StaticTask_t Task2TaskTCB;
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);//获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
//静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
//有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
//实现此函数即可。
//ppxIdleTaskTCBBuffer:任务控制块内存
//ppxIdleTaskStackBuffer:任务堆栈内存
//pulIdleTaskStackSize:任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{*ppxIdleTaskTCBBuffer=&IdleTaskTCB;*ppxIdleTaskStackBuffer=IdleTaskStack;*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
//获取定时器服务任务的任务堆栈和任务控制块内存
//ppxTimerTaskTCBBuffer:任务控制块内存
//ppxTimerTaskStackBuffer:任务堆栈内存
//pulTimerTaskStackSize:任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
{*ppxTimerTaskTCBBuffer=&TimerTaskTCB;*ppxTimerTaskStackBuffer=TimerTaskStack;*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}//LCD刷屏时使用的颜色
int lcd_discolor[14] = {WHITE ,BLACK,BLUE,BRED,GRED,GBLUE,RED,MAGENTA,GREEN,CYAN,YELLOW,BROWN,BRRED,GRAY};int main(void)
{HAL_Init();                     //初始化HAL库   Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhzdelay_init(180);                //初始化延时函数LED_Init();						//LED初始化ACR_BYTE0_ADDRESSuart_init(115200);SDRAM_Init();LCD_Init();		POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"Apolo STM32F4/F7");LCD_ShowString(30,30,200,16,16,"FreeeRTOS Examples");LCD_ShowString(30,50,200,16,16,"Task create and delete");LCD_ShowString(30,70,200,16,16,"2021/11/20");StartTask_Handler= xTaskCreateStatic(start_task,"start_task",START_STK_SIZE,NULL, START_TASK_PRIO,StartTaskStack,&Task1TaskTCB);  	vTaskStartScheduler();		//开启任务调度}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建TASK1任务Task1Task_Handler=xTaskCreateStatic((TaskFunction_t	)task1_task,		(const char* 	)"task1_task",		(uint32_t 		)TASK1_STK_SIZE,	(void* 		  	)NULL,				(UBaseType_t 	)TASK1_TASK_PRIO, 	(StackType_t*   )Task1TaskStack,	(StaticTask_t*  )&Task1TaskTCB);	   //创建TASK2任务Task2Task_Handler=xTaskCreateStatic(task2_task,     "task2_task",   TASK2_STK_SIZE,NULL,TASK2_TASK_PRIO,Task2TaskStack,&Task2TaskTCB); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}
//task1任务函数
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//画一个矩形	LCD_DrawLine(5,130,115,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任务执1行次数加1 注意task1_num1加到255的时候会清零!!LED0=!LED0;//printf("任务1已经执行:%d次\r\n",task1_num);if(task1_num==5) {if(Task2Task_Handler != NULL)		//任务2是否存在?	{vTaskDelete(Task2Task_Handler);	//任务1执行5次删除任务2Task2Task_Handler=NULL;			//任务句柄清零//printf("任务1删除了任务2!\r\n");}}LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//显示任务执行次数vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}//task2任务函数
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //画一个矩形	LCD_DrawLine(125,130,234,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任务2执行次数加1 注意task1_num2加到255的时候会清零!!LED1=!LED1;//printf("任务2已经执行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}

编译即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/379760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Delphi 调试

调试:F9执行F8逐过程单步调试F7逐语句单步调试转载于:https://www.cnblogs.com/JackShao/archive/2012/04/30/2476931.html

1.创建单项链表

# include <stdio.h> # include <malloc.h> # include <stdlib.h>typedef struct Node{int data;//数据域struct Node *pNext;//指针域}NODE, *PNODE; //NODE等价于struct Node //PNOD等价于struct Node * //函数声明PNODE create_list(void); void traverse…

python 日本就业_日本的绘图标志 Python中的图像处理

python 日本就业Read basics of the drawing/image processing in python: Drawing flag of Thailand 阅读python中绘图/图像处理的基础知识&#xff1a; 泰国的绘图标志 The national flag of Japan is a rectangular white banner bearing a crimson-red disc at its center…

[windows phone 7 ]查看已安装程序GUID

首先介绍下wp7RootToolsSDK,这个功能相当强大&#xff0c;适合研究wp7高级功能。 它支持File&#xff0c;Register操作&#xff0c;比之前的COM调用要简单&#xff0c;方便。 功能:查看已安装程序的guid 开发心得: 用的是mozart,rom多&#xff0c;刷机吧&#xff0c;最麻烦的是…

FreeRTOS任务挂起和恢复

任务挂起&#xff1a;暂停某个任务的执行 任务恢复&#xff1a;让暂停的任务继续执行 通过任务挂起和恢复&#xff0c;可以达到让任务停止一段时间后重新运行。 相关API函数&#xff1a; vTaskSuspend void vTaskSuspend( TaskHandle_t xTaskToSuspend );xTaskToSuspend &am…

向oracle存储过程中传参值出现乱码

在页面中加入<meta http-equiv"Content-Type" content"text ml;charsetUTF-8"/>就可以解决这一问题 适用情况&#xff1a; 1.中文 2.特殊符号 转载于:https://www.cnblogs.com/GoalRyan/archive/2009/02/16/1391348.html

Scala程序将多行字符串转换为数组

Scala | 多行字符串到数组 (Scala | Multiline strings to an array) Scala programming language is employed in working with data logs and their manipulation. Data logs are entered into the code as a single string which might contain multiple lines of code and …

SQL 异常处理 Begin try end try begin catch end catch--转

SQL 异常处理 Begin try end try begin catch end catch 总结了一下错误捕捉方法:try catch ,error, raiserror 这是在数据库转换的时候用的的异常处理, Begin TryInsert into SDT.dbo.DYEmpLostTM(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,OpNo,OTFlag,LostTypeID,OffStd…

FreeRTOS中断配置与临界段

Cortex-M中断 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff08;中断服务程序&#xff09;&#xff0c;处理完毕后又返回原被暂停的程序继续运行。Cortex-M内核的MCU提供了一个用…

vector向量容器

一、vector向量容器 简介&#xff1a; Vector向量容器可以简单的理解为一个数组&#xff0c;它的下标也是从0开始的&#xff0c;使用时可以不用确定大小&#xff0c;但是它可以对于元素的插入和删除&#xff0c;可以进行动态调整所占用的内存空间&#xff0c;它里面有很多系统…

netsh(二)

netsh 来自微软的网络管理看家法宝很多时候&#xff0c;我们可能需要在不同的网络中工作&#xff0c;一遍又一遍地重复修改IP地址是一件比较麻烦的事。另外&#xff0c;系统崩溃了&#xff0c;重新配置网卡等相关参数也比较烦人&#xff08;尤其是无线网卡&#xff09;。事实上…

java uuid静态方法_Java UUID getLeastSignificantBits()方法与示例

java uuid静态方法UUID类getLeastSignificantBits()方法 (UUID Class getLeastSignificantBits() method) getLeastSignificantBits() method is available in java.util package. getLeastSignificantBits()方法在java.util包中可用。 getLeastSignificantBits() method is us…

Google C2Dm相关文章

Android C2DM学习——云端推送&#xff1a;http://blog.csdn.net/ichliebephone/article/details/6591071 Android C2DM学习——客户端代码开发&#xff1a;http://blog.csdn.net/ichliebephone/article/details/6626864 Android C2DM学习——服务器端代码开发&#xff1a;http…

FreeRTOS的列表和列表项

列表和列表项 列表 列表是FreeRTOS中的一个数据结构&#xff0c;概念上和链表有点类型&#xff0c;是一个循环双向链表&#xff0c;列表被用来跟踪FreeRTOS中的任务。列表的类型是List_T&#xff0c;具体定义如下&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRI…

string基本字符系列容器

二、string基本字符系列容器 简介&#xff1a;C语言只提供了一个char类型来处理字符&#xff0c;而对于字符串&#xff0c;只能通过字符串数组来处理&#xff0c;显得十分不方便。CSTL提供了string基本字符系列容器来处理字符串&#xff0c;可以把string理解为字符串类&#x…

正则表达式(一)

正则表达式概述 1.1什么是正则表达式&#xff1f; 正则表达式(Regular Expression)起源于人类神经系统的早期研究。神经生理学家Warren McCulloch和Walter Pitts研究出一种使用数学方式描述神经网络的方法。1956年&#xff0c;数学家Stephen Kleene发表了一篇标题为“神经…

42.有“舍”才有“得”

大干世界&#xff0c;万种诱惑&#xff0c;什么都想要&#xff0c;会累死你&#xff0c;该放就放&#xff0c;该舍就舍。人必须先有所舍&#xff0c;才能有所得&#xff0c;舍如同种子撒播出去&#xff0c;转了一圈&#xff0c;又带了一大群子子孙孙回来。“舍”永远在“得”的…

Java StringBuilder codePointCount()方法与示例

StringBuilder类codePointCount()方法 (StringBuilder Class codePointCount() method) codePointCount() method is available in java.lang package. codePointCount()方法在java.lang包中可用。 codePointCount() method is used to count the number of Unicode code point…

FreeRTOS时间管理

在使用FreeRTOS的过程中&#xff0c;我们通常会在一个任务函数中使用延时函数对这个任务延时&#xff0c;当执行延时函数的时候就会进行任务切换&#xff0c;并且此任务就会进入阻塞太&#xff0c;直到延时完成&#xff0c;任务重新进入就绪态。延时函数舒属于FreeRTOS的时间管…

set和multiset集合容器

三、①set集合容器 简介&#xff1a;set集合的目的就是为了快速检索。set集合容器实现了红黑树的平衡二叉检索树的数据结构。set集合里面不允许有重复的元素出现&#xff1b;使用set容器前&#xff0c;需要在程序的头文件中声明 #include < set >。 函数方法总结&#…