alios thing 信号量_消息队列_消息队列_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...

多任务系统中,任务间互相同步等待共享资源,我们一般会使用信号量,如果需要互斥,则使用互斥量。而任务间互相收发消息则可以使用消息队列。消息队列(queue)使用类似信号量的机制进行任务间的同步,并使用环形缓冲池(ring

buffer)来进行消息的队列缓冲管理,以达到任务间收发消息的阻塞和通知管理。Queue的实现目的在于任务间互相收发消息。一般如果有信号量机制,用户就可以自己实现一套任务间的阻塞和通知收发功能,其本质在于接收方通过信号量的获取来开始接收消息,发送方通过信号量的释放来通知接收方处理。接收任务在无消息时被阻塞,消息到来时被唤醒处理。Queue就是基于这样一种类信号量机制来进行消息的收发。再加上ring

buffer的缓冲机制来缓存任务间的消息队列,就组合成了本章的消息队列(queue)。其既包含消息的缓冲队列,又包含了消息的通知机制。消息队列模块整体受宏RHINO_CONFIG_BUF_QUEUE开关控制,对应的AOS API接口实现位于:core/osal/aos/rhino.c中RHINO_CONFIG_BUF_QUEUE宏定义包含实现;对应的krhino内部实现位于:core/rhino/k_buf_queue.c。

包含头文件

#include //直接对应头文件

API列表

aos_queue_new()

创建一个队列,指定缓冲区大小,以及最大数据单元大小

aos_queue_free()

删除一个队列,并释放阻塞在其中的任务

aos_queue_send()

向queue内发送数据,并唤醒存在的第一个高优先级阻塞任务

aos_queue_recv()

从queue内收取数据,如没有数据则阻塞当前任务等待

aos_queue_is_valid()

判断一个队列queue是否有效

aos_queue_buf_ptr()

获取一个队列queue的缓冲区起点

API详情

aos_queue_new

创建一个队列,指定缓冲区大小,以及最大数据单元大小。

函数原型

int aos_queue_new(aos_queue_t *queue, void *buf, unsigned int size, int max_msg)

输入参数

aos_queue_t *queue

queue队列描述结构体指针;需要用户定义一个queue结构体

aos_queue_t g_queue; 传入&g_queue

void *buf

此queue队列的缓冲区起点

char buf[1000];传入buf

unsigned int size

此queue队列的缓冲区大小

1000

int max_msg

一次存入缓冲区的最大数据单元

50

返回参数

0

执行成功

其他

返回失败

调用示例

static aos_queue_t g_queue;

static char queue_buf[TEST_CONFIG_QUEUE_BUF_SIZE];

ret = aos_queue_new(&g_queue, queue_buf, 1000, 50);

aos_queue_free

删除一个队列,并释放阻塞在其中的任务。

函数原型

void aos_queue_free(aos_queue_t *queue)

输入参数

aos_queue_t *queue

删除一个队列,并释放阻塞在其中的任务

aos_queue_new创建传入的queue,如&g_queue

返回参数

调用示例

aos_queue_free(&g_queue);

aos_queue_send

向queue内发送数据,并唤醒存在的第一个高优先级阻塞任务。

函数原型

int aos_queue_send(aos_queue_t *queue, void *msg, unsigned int size)

输入参数

aos_queue_t *queue

queue队列描述结构体指针

aos_queue_new创建传入的queue,如&g_queue

void *msg

发送数据起始内存

用户定义的起始内存如:void* msg_send

unsigned int size

发送数据大小

用户定义的内存大小如:30

返回参数

0

执行成功

其他

返回失败

调用示例

char *msg_send = "hello,queue!";

ret = aos_queue_send(&g_queue, msg_send, strlen(msg_send));

aos_queue_recv

从queue内收取数据,如没有数据则阻塞当前任务等待。

函数原型

int aos_queue_recv(aos_queue_t *queue, unsigned int ms, void *msg, unsigned int *size)

输入参数

aos_queue_t *queue

queue队列描述结构体指针

aos_queue_new创建传入的queue,如&g_queue

unsigned int ms

传入0表示不超时,立即返回;AOS_WAIT_FOREVER表示永久等待;其他数值表示超时时间,单位ms

参考参数描述

void *msg

出参;返回获取到的数据的内存指针

用户定义的表示地址变量如:void* msg_recv

unsigned int *size

出参;返回获取到的数据大小

用户定义的表示大小变量,如int size_recv ;

返回参数

0

执行成功

其他

返回失败

调用示例

char msg_recv[16] = {0};

unsigned int size_recv = 16;

memset(msg_recv, 0, size_recv);

ret = aos_queue_recv(&g_queue, 100, msg_recv, &size_recv);

aos_queue_is_valid

判断一个队列queue是否有效。

函数原型

int aos_queue_is_valid(aos_queue_t *queue)

输入参数

aos_queue_t *queue

判断一个队列queue是否有效

aos_queue_new创建传入的queue,如&g_queue

返回参数

0

queue无效

1

queue有效

调用示例

ret = aos_queue_is_valid(&g_queue);

aos_queue_buf_ptr

获取一个队列queue的缓冲区起点。

函数原型

void* aos_queue_buf_ptr(aos_queue_t *queue)

输入参数

aos_queue_t *queue

queue队列描述结构体指针

aos_queue_new创建传入的queue,如&g_queue

返回参数

NULL

获取失败

void*

返回队列queue的缓冲区起点

调用示例

void* bufstart;

bufstart = aos_queue_buf_ptr(&g_queue);

相关定义

相关宏定义

typedef struct

{

void *hdl;

} aos_hdl_t;

typedef aos_hdl_t aos_queue_t;

你可能感兴趣的:(alios,thing,信号量)