RT-THREAD官网内核视频笔记十六讲(13-16)V1.0(箭指320)

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值