4个字节,一个指针,邮箱
struct rt_mailbox
{
struct rt_ipc_object parent;//IPC继承
rt_uint32_t *msg_pool;//指针/消息缓存区
rt_uint16_t size; //邮箱容量
rt_uint16_t entry; //数目
rt_uint16_t in_offset; //进出便宜量
rt_uint16_t out_offset;
rt_uint16_t suspend_sender_thread;//若变满,线程挂起
};typedef struct rt_mailbox *rt_mailbox_t;
struct rt_mailbox static_mb;
rt_mailbox_t dynamic_mb;
rt_mb_init(
rt_mailbox_t mb,
const char*name,
void *msgpool,
rt_size_t size,
rt_uint8_t flag //RT_IPC_FLAG_FIFO,RT_IPC_FLAG_PRIO
)
rt_mb_create(
const char*name,
rt_size_t size,
rt_uint8_t flag)
发送邮件:API
rt_mb_send(rt_mailbox_t,rt_uint32_t value);//字符串中的指针,传递地址
rt_mb_send_wait(rt_mailbox_t mb,rt_uint32_t value,rt_int32_t timeout)//邮箱满了,超时则满
接收邮件:
rt_mb_recv(rt_mailbox_t mb,rt_uint32_t *value,rt_int32_t timeout)
示例代码:mailbox sample.c
(1)初始化邮箱
(2)创建两个线程 一个线程发送邮件 一个线程接收邮件
(3)定义邮箱控制块
static struct rt_mailbox mb;//定义邮箱的控制块
static char mb_pool[128];
定义三个字符串:初始化一个mailbox
rt_mb_init(&mb,
"mbt",
&mb_pool[0],
sizeof(mb_pool)/4
RT_IPC_FLAG_FIFO);
线程2:发送邮件
rt_mb_send(&mb,(rt_uint32_t)&mb_str1);
线程1:接收邮件
rt_mb_recv(&mb,(rt_uint32_t*)&str,RT_WAITING_FOREVER==RT_EOK)
第十四讲:消息队列的使用
消息队列的工作机制,线程间的通信方式,中断服务历程中,不固定长度的消息
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 vt_ *rt_mq_t;
struct_messagequeue static_mg;//静态消息队列
rt_mq_t dynamic_mq;//动态消息队列
内存池大小(1024)容量
msg_pool 1024 内存池
msgs 1024/(msg_size+4)
创建和删除
初始化与脱离
rt_mq_init(rt_mq_t mq,const char *name,void *msgpool,rt_size_t msg_size,rt_size_t pool_size,rt_mq_t mq)
const char*name
*msgpool
rt_size_t
msg_size
rt_size_t pool size
rt_uint8_t flag)//RT_IPC_FLAG_FIFO,RT_IPC_FLAG_PRIO
发送消息
rt_err_t rt_mq_send(rt_mq_t mq,void *buffer,rt_size_t size,rt_mq_urgent)
接收消息
rt_err_t rt_mq_recv(rt_mq_t mq,void *buffer,rt_size_t size,rt_int32_t timeout)
消息队列控制块
rt_messagequeue mq;
消息队列控制块消息内存池:
msg_pool[2048];
消息队列使用示例
(1)初始化消息队列
result = rt_mq_init(&mq,"mqt",&msg_pool[0],1,sizeof(msg_pool),RT_IPC_FLAG_FIFO);
rt_thread_init(&thread1,"thread",thread1_enery,RT_NULL,&thread1_stack[0],sizeof(thread1_stack),25,5);
10月4日 消息队列
初始化与脱离:
rt_mq_t mq,const char *name,void *msqpool,t_size_t msg_size,rt_size_t pool_size,rt_uint8_t flag)
rt_mq_create(const char *name,rt_size_t msg_size,rt_size_t,max_msgs,rt_uint8_t flag);
rt_mq_delete(rt_mq_t mq)
发送消息
rt_mq_send(rt_mq_t mq,void *buffer,rt_size_t size);
rt_mq_urgent(rt_mq_t mq,void *buffer,rt_size_t size)
接收消息
rt_mq_recv(rt_mq_t mq,void*buffer,t_size_t size,rt_int32_t timeout)
result = rt_mq_urgent(&mq,&buf,1);
线程2:发送消息
线程1:接收阻塞,X阻塞接收,脱离掉
msh msg send message -A
线程1 接收
软件定时器 OSTICK
HARDTIMER 模式 执行时间尽量短
SOFTTIMER 模式
rtconfig.h -> RT_USING_TIMER_SOFT 来决定是否使用
struct rt_timer
{
struct rt_object parent;
rt_list row[RT_TIMER_SKIP_LIST_LEVEL];
void (*timeout/func)(void *parameter);
void *parameter;
rt_tick_t init_tick;
rt_tick_t timeout_tick;
}
定时静态软件定时器 struct_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_time,rt_uint7_t flag)
创建定时器1 周期定时器time1
time1 = rt_timer_create(“timer1”,timeout1,RT_NULL,10,RT_TIMER_FLAG_PERIODIC);
第十六讲 内存池的使用
动态内存池堆
RT—THREAD Memory Pool
RT-THREAD挂起
内存池工作机制
内存块 块大小/32K 块数/128
工作日志:
内存池在创建时先获取一大块内存(静态或者动态),然后分成大小相同的多个小内存块,这些小内存块通过链表连接起来,此链表称为空闲链表。线程中每次申请分配的内存块的时候,系统从空闲链表中取出第一个内存块,提供给申请者
内存控制块
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_size_t suspend_thread;
rt_size_t suspend_thread_count;
};
typedef struct rt_mempool *rt_mp_t
初始化与脱离
rt_err_t rt_mp_list(struct rt_mempool *mp,const char*name,rt_mp_detach);
创建与删除
申请内存块:
rt_mp_alloc
释放内存块:void rt_mp_free(void *block);
返回是否时空指针
初始化内存池对象
rt_mp_init(&mp,''mp1",&mempool[0],sizeof(mempool),80);