博客
关于我
RT-Thread学习笔记3-线程间通信 & 定时器
阅读量:420 次
发布时间:2019-03-05

本文共 5212 字,大约阅读时间需要 17 分钟。

RT-Thread 并发控制机制技术文档

事件集的使用

在 RT-Thread 中,事件集是一种强大的线程同步机制。它通过 32 位无符号整型变量来表示事件集合,每个位代表一个事件。线程可以通过逻辑与或逻辑或操作与事件集合建立关联,形成事件组合。事件的逻辑或(独立型同步)表示只要有一个事件发生,线程即可同步;逻辑与(关联型同步)则要求所有相关事件同时发生才能同步。

事件集控制块

事件集控制块定义了事件集的结构和操作接口。rt_event 结构体继承自 rt_ipc_object,包含事件集合位掩码 set。事件集合可以是静态的或动态的,分别由 static_evtdynamic_evt 表示。

struct rt_event {    struct rt_ipc_object parent;    rt_uint32_t set;}; typedef struct rt_event *rt_event_t;静态事件集:struct rt_event static_evt;动态事件集:rt_event_t dynamic_evt;

事件集操作

事件集操作包括初始化与脱离、创建与删除、发送事件、接收事件等功能。

初始化与脱离

rt_err_t rt_event_init(rt_event_t event, const char *name, rt_uint8_t flag);rt_err_t rt_event_detach(rt_event_t event);

创建与删除

rt_event_t rt_event_create(const char *name, rt_uint8_t flag);rt_err_t rt_event_delete(rt_event event);

发送事件

rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set);

接收事件

rt_err_t rt_event_recv(rt_event_t event, rt_uint32_t *received, rt_uint8_t option, rt_int32_t timeout, rt_uint32_t *recved);

邮箱的使用

邮箱是一种高效的线程间通信机制。它通过固定大小的邮件缓冲区进行通信,每封邮件正好容纳 4 字节内容(适用于 32 位系统)。线程或中断服务例程将邮件发送到邮箱中,其他线程可从邮箱中接收并处理。

邮箱控制块

邮箱控制块定义了邮箱的结构和操作接口。rt_mailbox 结构体继承自 rt_ipc_object,包含消息池指针、容量、当前消息数、偏移量等字段。邮箱可以是静态的或动态的,分别由 static_mbdynamic_mb 表示。

struct rt_mailbox {    struct rt_ipc_object parent;    rt_uint32_t *msg_pool;    rt_uint16_t size;    rt_uint16_t entry;    rt_uint16_t in_offset;    rt_uint16_t out_offset;    rt_list_t suspend_sender_thread;}; typedef struct rt_mailbox *rt_mailbox_t;静态邮箱:struct rt_mailbox static_mb;动态邮箱:rt_mailbox_t dynamic_mb;

邮箱操作

邮箱操作包括初始化与脱离、创建与删除、发送邮件、接收邮件等功能。

初始化与脱离

rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, void *msgpool, rt_size_t size, rt_uint8_t flag);rt_err_t rt_mb_detach(rt_mailbox_t mb);

创建与删除

rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag);rt_err_t rt_mbdelete(rt_mailbox_t mb);

发送邮件

rt_err_t rt_mb_send(rt_mailbox_t mb, rt_uint32_t value);rt_err_t rt_mb_send_wait(rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout);

接收邮件

rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout);

消息队列

消息队列是对邮箱的扩展,支持不固定长度的消息传递。消息队列将消息缓存到自己的内存空间中,其他线程可从队列中读取消息。消息队列支持紧急消息,消息发送和接收会受到队列状态的影响。

消息队列控制块

消息队列控制块定义了消息队列的结构和操作接口。rt_messagequeue 结构体继承自 rt_ipc_object,包含消息池指针、消息最大长度、消息队列容量等字段。消息队列可以是静态的或动态的,分别由 static_mqdynamic_mq 表示。

struct rt_messagequeue {    struct rt_ipc_object parent;    void *msg_pool;    rt_uint16_t msg_size;    rt_uint16_t max_msgs;    rt_uint16_t entry;    void *msg_queue_head;    void *msg_queue_tail;    void *msg_queue_free;}; typedef struct rt_messagequeue *rt_mq_t;静态消息队列:struct rt_messagequeue static_mq;动态消息队列:rt_mq_t dynamic_mq;

消息队列操作

消息队列操作包括初始化与脱离、创建与删除、发送消息、接收消息等功能。

初始化与脱离

rt_err_t rt_mq_init(rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_size, rt_size_t pool_size, rt_uint8_t flag);rt_err_t rt_mq_detach(rt_mq_t mq);

创建与删除

rt_mq_t rt_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag);rt_err_t rt_mq_delete(rt_mq_t mq);

发送消息

rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size);rt_err_t rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size);

接收消息

rt_err_t rt_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout);

软件定时器

软件定时器是基于系统节拍(OS Tick)的定时器机制。它可以提供不受数量限制的定时服务,定时器数值是 OS Tick 的整数倍。

软件定时器控制块

软件定时器控制块定义了定时器的结构和操作接口。rt_timer 结构体继承自 rt_object,包含定时器链表、超时回调函数、定时器参数等字段。定时器可以是静态的或动态的,分别由 static_timerdynamic_timer 表示。

struct rt_timer {    struct rt_object parent;    rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];    void (*timeout_func)(void *parameter);    void *parameter;    rt_tick_t init_tick;    rt_tick_t timeout_tick;}; typedef struct rt_timer *rt_timer_t;静态软件定时器:struct rt_timer static_timer;动态软件定时器:rt_timer_t dynamic_timer;

软件定时器操作

软件定时器操作包括初始化与脱离、创建与删除、启动定时器、停止定时器等功能。

初始化与脱离

void rt_timer_init(rt_timer_t timer, const char *name, void(*timeout)(void *parameter), void *parameter, rt_tick_t time, rt_uint8_t flag);rt_err_t rt_timer_detach(rt_timer_t timer);

创建与删除

rt_timer_t rt_timer_create(const char *name, void(*timeout)(void *parameter), void *parameter, rt_tick_t time, rt_uint8_t flag);rt_err_t rt_timer_delete(rt_timer_t timer);

启动定时器

rt_err_t rt_timer_start(rt_timer_t timer);

停止定时器

rt_err_t rt_timer_stop(rt_timer_t timer);

内存池

内存池是一种高效的内存管理机制。它用于分配大量大小相同的小内存块,支持线程挂起管理。内存池通过资源同步机制,确保内存分配和释放的高效性。

内存池控制块

内存池控制块定义了内存池的结构和操作接口。rt_mempool 结构体继承自 rt_object,包含内存池起始地址、内存块大小、内存池大小等字段。内存池可以是静态的或动态的,分别由 static_mpdynamic_mp 表示。

struct rt_mempool {    struct rt_object parent;    void *start_address;    rt_size_t size;    rt_size_t block_size;    rt_uint8_t *block_list;    rt_size_t block_total_count;    rt_size_t block_free_count;    rt_list_t suspend_thread;    rt_size_t suspend_thread_count;}; typedef struct rt_mempool *rt_mp_t;静态内存池:struct rt_mempool static_mp;动态内存池:rt_mp_t dynamic_mp;

内存池操作

内存池操作包括初始化与脱离、创建与删除、申请内存块、释放内存块等功能。

初始化与脱离

rt_err_t rt_mp_init(struct rt_mempool *mp, const char *name, void *start, rt_size_t size, rt_size_t block_size);rt_err_t rt_mp_detach(struct rt_mempool *mp);

创建与删除

rt_mp_t rt_mp_create(const char *name, rt_size_t block_count, rt_size_t block_size);rt_err_t rt_mp_delete(rt_mp_t mp);

申请内存块

void *rt_mp_alloc(rt_mp_t mp, rt_int32_t time);

释放内存块

void rt_mp_free(void *block);

通过以上机制,RT-Thread 提供了丰富的并发控制和通信工具,适用于不同的应用场景。

转载地址:http://jplzz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现TCP Server 多线程同时连接多个客户端(附完整源码)
查看>>
Objective-C实现TCP拥塞控制(附完整源码)
查看>>
Objective-C实现Tenengrad梯度函数(附完整源码)
查看>>
Objective-C实现ternary search三元搜索算法(附完整源码)
查看>>
Objective-C实现TernarySearch三分查找算法(附完整源码)
查看>>
Objective-C实现The Game of Life 生命游戏算法(附完整源码)
查看>>
Objective-C实现tim sort排序算法(附完整源码)
查看>>
Objective-C实现Timsort算法(附完整源码)
查看>>
Objective-C实现TOPK算法(附完整源码)
查看>>
Objective-C实现topologicalSort拓扑排序算法(附完整源码)
查看>>
Objective-C实现trapezoidal rule梯形法则算法(附完整源码)
查看>>
Objective-C实现Trapping Rain Water捕获雨水问题算法(附完整源码)
查看>>
Objective-C实现Travelling Salesman算法(附完整源码)
查看>>
Objective-C实现ugly numbers丑数算法(附完整源码)
查看>>
Objective-C实现wc函数功能(附完整源码)
查看>>
Objective-C实现z-algorithm算法(附完整源码)
查看>>
Objective-C实现Zeller 的同余算法 (附完整源码)
查看>>
Objective-C实现zellers congruence泽勒一致算法(附完整源码)
查看>>
Objective-C实现Zero One Knapsack零一背包计算算法(附完整源码)
查看>>
Objective-C实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
查看>>