本文共 5212 字,大约阅读时间需要 17 分钟。
在 RT-Thread 中,事件集是一种强大的线程同步机制。它通过 32 位无符号整型变量来表示事件集合,每个位代表一个事件。线程可以通过逻辑与或逻辑或操作与事件集合建立关联,形成事件组合。事件的逻辑或(独立型同步)表示只要有一个事件发生,线程即可同步;逻辑与(关联型同步)则要求所有相关事件同时发生才能同步。
事件集控制块定义了事件集的结构和操作接口。rt_event 结构体继承自 rt_ipc_object,包含事件集合位掩码 set。事件集合可以是静态的或动态的,分别由 static_evt 和 dynamic_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_mb 和 dynamic_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_mq 和 dynamic_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_timer 和 dynamic_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_mp 和 dynamic_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/