FreeRTOS API 大全

configMAX_PRIORITIES 配置优先级个数

configUSE_TIMERS 配置是否启用软件定时器

configUSE_PREEMPTION 配置有更高优先级时进行任务切换

1. RTOS内核控制

taskYIELD //让出CPU ,让高于或等于调用该函数优先级的其他任务获得CPU运行,如果没有此任务继续运行

taskENTER_CRITICAL //进入临界区 若未设置configMAX_SYSCALL_INTERRUPT_PRIORITY 则禁止所有中断,若设置 将禁用这个宏以下的中断

taskEXIT_CRITICAL //退出临界区

taskENTER_CRITICAL_FROM_ISR //进入临界区 中断版本

taskEXIT_CRITICAL_FROM_ISR //退出临界区 中断版本

taskDISABLE_INTERRUPTS //禁止中断 若configMAX_SYSCALL_INTERRUPT_PRIORITY,则禁用该中断优先级以下的所有中断,否则禁用所有中断,一般使用taskENTER_CRITICAL 来替代

taskENABLE_INTERRUPTS //使能中断 若configMAX_SYSCALL_INTERRUPT_PRIORITY,则禁用该中断优先级以下的所有中断,否则禁用所有中断, 一般使用taskEXIT_CRITICAL 来替代

vTaskStartScheduler //启动RTOS的任务调度,内函数内部会自动创建空闲任务和定时器任务(configUSE_TIMERS需设置为1)

vTaskEndScheduler //结束任务调度,所有创建的任务将删除vTaskEndScheduler,然后从调用 vTaskStartScheduler() 的位置恢复执行,就像 vTaskStartScheduler() 刚刚返回一样

vTaskSuspendAll //挂起所有的任务调度

xTaskResumeAll //恢复所有的任务调度

2. 任务信息

uxTaskGetSystemState //获取系统所有运行任务的信息,包含总运行TICK configUSE_TRACE_FACILITY 需设置为1

vTaskGetInfo //获取某个任务的信息

xTaskGetCurrentTaskHandle //获取当前获取任务句柄 INCLUDE_xTaskGetCurrentTaskHandle 设置为1

xTaskGetIdleTaskHandle //获取空闲任务句柄 INCLUDE_xTaskGetIdleTaskHandle 设置为1

uxTaskGetStackHighWaterMark //查询指定任务的运行历史中,其栈空间还差多少就要溢出。这个值被称为栈空间的”高水线

eTaskGetState //获取任务运行的状态 运行、阻塞、就绪、挂起、删除

pcTaskGetName //获取任务的名字

xTaskGetHandle //获取任务的句柄 根据任务的名字

xTaskGetTickCount //获取任务自运行 经过的TICK数目

xTaskGetTickCountFromISR //获取任务自运行 经过的TICK数目 中断版本

xTaskGetSchedulerState //获取任务调度状态

uxTaskGetNumberOfTasks //获取当前任务的个数

vTaskList //调用 uxTaskGetSystemState 原始数据格式化为人类可读的 (ASCII) 表格

vTaskGetRunTimeStats //以人类可读的方式获取每个任务运行花费的时间 ,以绝对值和百分百分别表示,调用 uxTaskGetSystemState 实现

vTaskGetIdleRunTimeCounter //获取空闲任务运行时间TICK

vTaskSetApplicationTaskTag //设置任务的标签值

xTaskGetApplicationTaskTag //获取任务的标签值

xTaskCallApplicationTaskHook //

pvTaskGetThreadLocalStoragePointer

vTaskSetThreadLocalStoragePointer

vTaskSetTimeOutState

xTaskCheckForTimeOut

3.任务创建 删除

xTaskCreate 动态任务创建

xTaskCreateStatic 静态任务

xTaskCreateRestrictedStatic

vTaskDelete 任务删除 INCLUDE_vTaskDelete 定义为 1

4. 任务管理 任务状态: 挂起、运行、阻塞、就绪

vTaskDelay 让任务处于阻塞态 pdMS_TO_TICKS() pdTICKS_TO_MS()

vTaskDelayUntil 只是比vTaskDelay 多了记录唤醒时间的Tick值,需INCLUDE_vTaskDelayUntil 配置为1

uxTaskPriorityGet 获得优先级

vTaskPrioritySet 设置优先级

vTaskSuspend 任务挂起 要使用需要将 INCLUDE_vTaskSuspend 配置为 1

vTaskResume 任务恢复

xTaskResumeFromISR 中断中调用任务恢复

xTaskAbortDelay xTaskAbortDelay禁止任务进入 准备就绪状态,即使任务在阻塞等待某个时间的发生

FreeRTOS 中程序运行的上下文包括:

中断服务函数

普通任务

空闲任务(FreeRTOS必须有一个空闲任务)

5. 消息队列 任务与任务 任务与中断之间传递消息,发送到队列的消息是通过拷贝方式实现的

xQueueCreate 动态创建 传入队列元素的个数,每个元素的大小

xQueueCreateStatic 静态创建, 传入队列元素的个数,每个元素的大小,分配的内存指针,StaticQueue_t 类型的变量

vQueueDelete 队列删除

xQueueSend 向队列中发送消息到尾部

xQueueSendFromISR 向队列中发送消息到尾部 中断版本

xQueueSendToBack 等同于xQueueSend

xQueueSendToBackFromISR 等同于xQueueSendFromISR

xQueueSendToFront 向队列中发送消息到头部

xQueueSendToFrontFromISR 向队列中发送消息到头部 中断版本

xQueueReceive 从队列中接收消息,并删除消息

xQueueReceiveFromISR 从队列中接收消息,并删除消息 中断版本

uxQueueMessagesWaiting 获取队列中的消息数

uxQueueMessagesWaitingFromISR 获取队列中的消息数 中断版本

uxQueueSpacesAvailable 获取队列可用的空间(消息)个数

xQueueReset 重置队列为空状态

xQueuePeek 从队列中接收消息,不删除消息

xQueuePeekFromISR 从队列中接收消息,不删除消息 中断版本

xQueueIsQueueEmptyFromISR 查询队列是否为空,中断版本

xQueueIsQueueFullFromISR 查询队列是否为满,中断版本

xQueueOverwrite 即使队列已满的情况下也将写入队列的 xQueueSendToBack() 版本, 同时覆盖队列中已经 存在的数据。

xQueueOverwriteFromISR xQueueOverwrite 中断版本

vQueueAddToRegistry 为队列指定名称,并将队列添加到注册表。

pcQueueGetName 从队列的句柄中查找队列名称,队列只有添加到队列注册表时才有名称。

vQueueUnregisterQueue 从队列注册表中删除队列

6. 队列集 configUSE_QUEUE_SETS 需要设置为1,缺点:设计更简洁,效率更低

应用程序设计需要一项任务来接收大小不同的数据,含义不同的数据以及来自不同来源的数据

队列集使任务可以从多个队列中接收数据,而无需依次轮询每个队列以确定哪个队列包含数据。

xQueueCreateSet // uxEventQueueLength 设置为 添加到集合中的队列长度之和

如果队列集要保存一个长度为 5 的队列, 另一个长度为 12 的队列和一个二进制信号量, 则 uxEventQueueLength 应设置为 (5 + 12 + 1) 或 18。

如果队列集要容纳三个二进制信号量, 则 uxEventQueueLength 应设置为 (1 + 1 + 1) 或 3。

如果队列集要保持最大计数为 5 的计数信号量 和最大计数为 3 的计数信号量, 则 uxEventQueueLength 应设置为 (5 + 3) 或 8。

xQueueAddToSet //将消息队列 或者信号量添加至 队列集合

xQueueRemoveFromSet //将消息队列 或者信号量从队列集中移除

xQueueSelectFromSet //获取队列集合中 可获取的消息队列 或者信号量

xQueueSelectFromSetFromISR //获取队列集合中 可获取的消息队列 或者信号量 中断版本

7.信号量 分为二值信号量 、计数信号量、互斥锁、递归信号量

二值信号量:没有优先级继承机制,一般用于任务与任务 任务与中断之间同步(一个任务释放信号量、另外一个任务获取信号量得以执行)

可以把二值信号量看成消息队列,这个队列只能为空或者满 可能会导致优先级翻转

计数信号量:可以看成长度大于1的队列, 释放信号量计数值加1,获取信号量计数值减1,计数值为0时不能获取,进入阻塞状态

互斥锁:具有优先级继承机制 ,一般用于临界资源访问

递归信号量:信号量可以获取多次,但是释放也要多次,每获取一次信号量个数仍然为1

xSemaphoreCreateBinary() 创建二值信号量 信号量RAM 由FreeRTOS 堆中自动分配

xSemaphoreCreateBinaryStatic() 静态创建二值信号量,信号量RAM 需要有用户指定StaticSemaphore_t 类型变量

vSemaphoreCreateBinary() 被舍弃了

xSemaphoreCreateCounting() 创建计数信号量 参数1:最大计数值 参数2:初始计数值

xSemaphoreCreateCountingStatic() 静态创建计数信号量 参数1:最大计数值 参数2:初始计数值, 需指定StaticSemaphore_t 类型变量

xSemaphoreCreateMutex() 创建互斥锁

xSemaphoreCreateMutexStatic() 静态创建互斥锁 需指定StaticSemaphore_t 类型变量

xSemaphoreCreateRecursiveMutex() 创建递归互斥锁

xSemaphoreCreateRecursiveMutexStatic() 创建递归互斥锁 需指定StaticSemaphore_t 类型变量

vSemaphoreDelete() 信号量删除

xSemaphoreGetMutexHolder() 获取互斥锁所有者的任务句柄 ,configUSE_MUTEXES必须设置为1

uxSemaphoreGetCount() 获取信号量的计数值

xSemaphoreTake() 获取信号量

xSemaphoreTakeFromISR() 获取信号量 中断版本

xSemaphoreTakeRecursive() 获取递归互斥锁

xSemaphoreGive() 释放信号量

xSemaphoreGiveRecursive() 释放递归信号量

xSemaphoreGiveFromISR() 释放递归信号量 中断版本

优先级翻转:

在很多场合中,某些资源只有一个,当低优先级任务正在占用该资源的时候,即便高优先

级任务也只能乖乖的等待低优先级任务使用完该资源后释放资源。这里高优先级任务无法

运行而低优先级任务可以运行的现象称为“优先级翻转”

互斥量优先级继承机制(二值信号量具有优先级翻转):

互斥量具有优先级继承机制,而信号量没有。也

就是说,某个临界资源受到一个互斥量保护,如果这个资源正在被一个低优先级任务使用,

那么此时的互斥量是闭锁状态,也代表了没有任务能申请到这个互斥量,如果此时一个高

优先级任务想要对这个资源进行访问,去申请这个互斥量,那么高优先级任务会因为申请

不到互斥量而进入阻塞态,那么系统会将现在持有该互斥量的任务的优先级临时提升到与

高优先级任务的优先级相同,这个优先级提升的过程叫做优先级继承。这个优先级继承机

制确保高优先级任务进入阻塞状态的时间尽可能短,以及将已经出现的“优先级翻转”危

害降低到最小。

现在有 3 个任务分别为 H 任务(High)、 M 任务(Middle)、 L 任务

(Low), 3 个任务的优先级顺序为 H 任务>M 任务>L 任务。正常运行的时候 H 任务可以

打断 M 任务与 L 任务, M 任务可以打断 L 任务,假设系统中有一个资源被保护了,此时该

资源被 L 任务正在使用中,某一刻, H 任务需要使用该资源,但是 L 任务还没使用完, H

任务则因为申请不到资源而进入阻塞态, L 任务继续使用该资源,此时已经出现了“优先

级翻转”现象,高优先级任务在等着低优先级的任务执行,如果在 L 任务执行的时候刚好

M 任务被唤醒了,由于 M 任务优先级比 L 任务优先级高,那么会打断 L 任务,抢占了

CPU 的使用权,直到 M 任务执行完,再把 CUP 使用权归还给 L 任务, L 任务继续执行,

等到执行完毕之后释放该资源, H 任务此时才从阻塞态解除,使用该资源。这个过程,本

来是最高优先级的 H 任务,在等待了更低优先级的 L 任务与 M 任务,其阻塞的时间是 M

任务运行时间+L 任务运行时间,这只是只有 3 个任务的系统,假如很多个这样子的任务打

断最低优先级的任务,那这个系统最高优先级任务岂不是崩溃了,这个现象是绝对不允许

出现的,高优先级的任务必须能及时响应。

8. 事件组

用于任务的同步 ,不提供数据,多次设置事件 等效于一次

configUSE_16_BIT_TICKS 为1 事件位有16位,其中8位存储事件组

configUSE_16_BIT_TICKS 为0 事件位有32位,其中24位存储事件组

事件可以使用"与"、"或"操作,只要有一个发生 或者都发生

xEventGroupCreate 动态创建事件组的句柄

xEventGroupCreateStatic 静态创建事件组的句柄,需传入StaticEventGroup_t xCreatedEventGroup 参数

vEventGroupDelete 删除事件组, 传入参数为创建的事件组的句柄

xEventGroupWaitBits 等待事件发生,传入参数:事件组句柄、等待事件的或组合、xClearOnExit退出清除标志、xWaitForAllBits(pdTRUE事件与,pdFALSE事件或)、xTicksToWait超时时间

xEventGroupSetBits 事件组置位函数,传入参数 事件组的句柄,事件标志位

xEventGroupSetBitsFromISR 事件组置位函数,中断版本

xEventGroupClearBits 清除事件标志位

xEventGroupClearBitsFromISR 清除事件标志位 中断版本

xEventGroupGetBits 获取事件组有哪些标志位

xEventGroupGetBitsFromISR 获取事件组有哪些标志位 中断版本

xEventGroupSync 设置某个位,等待多个位,用于多任务的同步,参数:事件组句柄,设置的位,等待的位,超时时间

9. 软件定时器

不能有任何阻塞任务运行的情况,比如vTaskDelay()以及其它能阻塞任务运行的函数

prvTimerTask 任务(也叫守护任务 Daemon)管理软定时器,configUSE_TIMERS 须设置为 1

若configTICK_RATE_HZ为1000,那么节拍周期为1ms,软件定时器需要值需要为1ms整数倍

若configTICK_RATE_HZ为100,那么节拍周期为10ms,软件定时器需要值需要为10ms整数倍

支持单次模式和周期模式

configTIMER_TASK_PRIORITY 软件定时器的优先级

xTimerCreate 动态创建软件定时器,参数:定时器名字、周期值、周期模式或单次模式、ID、回调函数

xTimerCreateStatic 静态创建软件定时器, 需要传入StaticTimer_t 类型变量

xTimerStart 启动软件定时器

xTimerStop 停止软件定时器

xTimerStartFromISR 启动软件定时器 中断版本

xTimerStopFromISR 停止软件定时器 中断版本

xTimerDelete 删除软件定时器

xTimerIsTimerActive 查询软件定时器是否在激活状态

pvTimerGetTimerID 获取软件定时器的ID,多用于创建多个回调函数为同一个的情况

pcTimerGetName 获取软件定时器的名字

vTimerSetReloadMode 重新设置是周期模式或单次模式

xTimerChangePeriod 改变周期

xTimerReset 重置软件定时器

xTimerChangePeriodFromISR 改变周期 终端版本

xTimerResetFromISR

vTimerSetTimerID 设置ID

xTimerGetTimerDaemonTaskHandle

xTimerPendFunctionCall

xTimerPendFunctionCallFromISR

xTimerGetPeriod 获得周期值

xTimerGetExpiryTime

xTimerGetReloadMode 获得模式

10. 任务通知

configUSE_TASK_NOTIFICATIONS 须设置为1

任务通知可以替代二值信号量、计数信号量、事件组,也可以替代长度为1的队列,内存开销小

发送通知给任务,如果有通知未读,不覆盖通知值。

发送通知给任务,直接覆盖通知值。

发送通知给任务,设置通知值的一个或者多个位,可以当做事件组来使用。

发送通知给任务,递增通知值,可以当做计数信号量使用。

缺点:

 只能有一个任务接收通知消息, 因为必须指定接收通知的任务。。

 只有等待通知的任务可以被阻塞, 发送通知的任务,在任何情况下都不会因为发送失败而进入阻塞态。

xTaskNotifyGive() 向一个任务发送通知,并将对方的任务通知值加1,用于实现二值 计数信号量

vTaskNotifyGiveFromISR() 向一个任务发送通知 中断版本

ulTaskNotifyTake() 阻塞等待xTaskNotifyGive 或 vTaskNotifyGiveFromISR 发出的通知

xTaskNotify()

xTaskNotifyAndQuery()

xTaskNotifyAndQueryFromISR

xTaskNotifyFromISR()

xTaskNotifyWait() 等待任务通知

xTaskNotifyStateClear()

ulTasknotifyValueClear()

xTaskNotifyGiveIndexed()

vTaskNotifyGiveIndexedFromISR()

ulTaskNotifyTakeIndexed()

xTaskNotifyIndexed()

xTaskNotifyAndQueryIndexed()

xTaskNotifyAndQueryFromISRIndexed()/

xTaskNotifyFromISRIndexed()

xTaskNotifyWaitIndexed()

xTaskNotifyStateClearIndexed()

ulTasknotifyValueClearIndexed()

11. 内存分配算法

提供了5种内存管理算法,分别是 heap_1.c、 heap_2.c、 heap_3.c、 heap_4.c、 heap_5.c

heap_1.c、 heap_2.c 和 heap_4.c 这三种内存管理方案,内存堆实际上是一个很大内存

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE] configTOTAL_HEAP_SIZE 在FreeRTOSConfig.h 中配置默认是36K

heap_3.c 封装了 malloc 和free,需要编译器或者启动文件来设置堆空间

heap_5.c 方案允许用户使用多个非连续内存堆空间,每个内存堆的起始地址和大小由用户定义,适用于扩展外部SDRAM

pvPortMalloc 申请内存

vPortFree 释放内存

xPortGetFreeHeapSize 获取剩余内存大小

12. 中断

ARM Cortex-M 系列处理器上,所有中断都采用中断向量表的方式进行处理

即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理、

中断向量表中启动文件stm32f429.s中定义

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 配置了系统所管理的最高中断优先级

configLIBRARY_LOWEST_INTERRUPT_PRIORITY 管理的最低优先级

例如配置为5,那么0,1,2,3,4这些优先级的中断不受系统管理,不能被屏蔽,中断中不能调用系统的API

而5-15的中断,系统是可以屏蔽的,中断中能够安全调用系统的API

BaseType_t pxHigherPriorityTaskWoken;//是否有更高优先级的任务被唤醒了。

uint32_t ulReturn = taskENTER_CRITICAL_FROM_ISR(); // 进入临界

xQueueSendFromISR(Test_Queue, /* 消息队列的句柄 */

portYIELD_FROM_ISR(pxHigherPriorityTaskWoken)//可能需要进行一次任务切换

taskEXIT_CRITICAL_FROM_ISR( ulReturn ); //退出临界

通常使用消息队列 信号量来任务同步

13. CPU利用率

vTaskList获取每隔任务的状态 剩余栈 任务序号

configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS 需设置为1

vTaskGetRunTimeStats获取每隔任务运行花费的时间 ,以绝对值和百分百分别表示

configGENERATE_RUN_TIME_STATS、configUSE_STATS_FORMATTING_FUNCTIONS 和 configSUPPORT_DYNAMIC_ALLOCATION 必须被 定义为 1,才可使用此函数。

然后, 应用程序还必须提供 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 和 portGET_RUN_TIME_COUNTER_VALUE 的定义

14.TickLess 低功耗模式

STM32F4 有三种低功耗

睡眠、停止、待机

低功耗实现

1. 将configUSE_TICKLESS_IDLE 配置为1

2. 实现函数void PreSleepProcessing(uint32_t ulExpectedIdleTime) 及void PostSleepProcessing(uint32_t ulExpectedIdleTime)

这两个函数 在 FreeRTOSConfig.h中 进行了声明

extern void PreSleepProcessing(uint32_t ulExpectedIdleTime);

extern void PostSleepProcessing(uint32_t ulExpectedIdleTime);

#define configPRE_SLEEP_PROCESSING PreSleepProcessing//进入低功耗模式前要做的处理

#define configPOST_SLEEP_PROCESSING PostSleepProcessing//退出低功耗模式后要做的处理

15. 空闲任务

系统中至少有一个空闲任务,处于最低优先级,作用 任务控制块和堆栈在空闲任务中释放

configIDLE_SHOULD_YIELD 为1时空闲任务放弃CPU使用权给其他同优先级的用户任务

钩子函数:就是回调函数

空闲任务的钩子函数是vApplicationIdleHook,可以自定义vApplicationIdleHook 函数实现低功耗

这里使用 STM32F4 自带低功耗函数 __wfi();

//进入低功耗模式前需要处理的事情 和 PreSleepProcessing 内容一样

void BeforeEnterSleep(void)

{

//关闭某些低功耗模式下不使用的外设时钟

__HAL_RCC_GPIOB_CLK_DISABLE();

__HAL_RCC_GPIOC_CLK_DISABLE();

__HAL_RCC_GPIOD_CLK_DISABLE();

__HAL_RCC_GPIOE_CLK_DISABLE();

__HAL_RCC_GPIOF_CLK_DISABLE();

__HAL_RCC_GPIOG_CLK_DISABLE();

__HAL_RCC_GPIOH_CLK_DISABLE();

}

//退出低功耗模式以后需要处理的事情 和 PostSleepProcessing 内容一样

void AfterExitSleep(void)

{

//退出低功耗模式以后打开那些被关闭的外设时钟

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOE_CLK_ENABLE();

__HAL_RCC_GPIOF_CLK_ENABLE();

__HAL_RCC_GPIOG_CLK_ENABLE();

__HAL_RCC_GPIOH_CLK_ENABLE();

}

//空闲任务钩子函数

void vApplicationIdleHook(void)

{

__disable_irq();

__dsb(portSY_FULL_READ_WRITE );

__isb(portSY_FULL_READ_WRITE );

BeforeEnterSleep(); //进入睡眠模式之前需要处理的事情

__wfi(); //进入睡眠模式

AfterExitSleep(); //退出睡眠模式之后需要处理的事情

__dsb(portSY_FULL_READ_WRITE );

__isb(portSY_FULL_READ_WRITE );

__enable_irq();

}

FreeRTOS v10.0 新功能

流式缓冲区和消息缓冲区。

16. 流缓冲区

消息队列长度固定,所以占用空间相对较大。

流缓冲区长度不固定,类似于环形队列, 以字节为单位存储,针对数据有长有短,这种类型就比较适合

configSUPPORT_DYNAMIC_ALLOCATION configUSE_SB_COMPLETED_CALLBACK 需要为1

xStreamBufferCreate() //创建流缓冲区, 参数1:最大的缓冲区大小 参数2:在流缓冲区中被阻塞以等待数据的任务离开阻塞状态之前, 流缓冲区中必须包含的字节数

xStreamBufferCreateStatic()

xStreamBufferSend() //发送流

xStreamBufferSendFromISR() //发送流 中断版本

xStreamBufferReceive() //接收流

xStreamBufferReceiveFromISR() //接收流 中断版本

vStreamBufferDelete() //删除流

xStreamBufferBytesAvailable() //流缓冲区可读的字节数

xStreamBufferSpacesAvailable() //流缓冲区满之前 可再发送的字节数

xStreamBufferSetTriggerLevel() //设置新的接收触发等级

xStreamBufferReset() //重置流缓冲区,只有没有在阻塞发送或者阻塞接收时候才能重置

xStreamBufferIsEmpty() //流缓冲 是否为空

xStreamBufferIsFull() //流缓冲 是否为满

17.消息缓冲区

StreamBuffer流式缓冲区的基础上实现的,其进一步针对“消息”进行设计改进。MessageBuffer每一条消息的写入增加了一个字节用来表示该条消息的长度。读取时需要一次性读出至少一条消息,否则会返回 0.

一条消息包含多字节。

xMessageBufferCreate() //创建消息缓冲区,没有触发LEVEL

xMessageBufferCreateStatic()

xMessageBufferSend() //发送消息

xMessageBufferSendFromISR() //发送消息 中断版本

xMessageBufferReceive() //接收消息

xMessageBufferReceiveFromISR() //接收消息 中断版本

vMessageBufferDelete() //删除消息缓冲区

xMessageBufferSpacesAvailable() //查看它包含多少空闲空间, 这等于在消息缓冲区满之前可以 向它发送的数据量

xMessageBufferReset() //重置流缓冲区,只有没有在阻塞发送或者阻塞接收时候才能重置

xMessageBufferIsFull() //消息缓冲区是否满

xMessageBufferIsEmpty() //消息缓冲区是否为空

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值