RTT学习
一互斥量:是信号量的一种,用于共享资源的排他性使用,以锁的形式存在,初始化时为可用,不能在中断中使用,可能导致优先级翻转。
二 事件:创建、删除、初始化、解绑、等待、发送。可以一对多多对的,发送一个事件,所有等待的都有效。可以进行逻辑“与”“或”,不能进行累加;而信号量可以累加但不能进行与或;
三 邮箱:创建、删除、初始化、解绑、发送、接收。用于线程间多数据的传递,类似管道,邮箱单次发送默认4字节(一个指针的大小),邮箱开销小比信号量和消息队列效率高。如果是数据,结构体可以采用以下方法
数组:邮箱的地址为数组的开始地址;邮箱的容量为sizeof(数组)/4
结构体:
struct msg
{
rt_uint8_t *data_ptr;
rt_uint32_t data_size;
};
对于这样一个消息结构体,其中包含了指向数据的指针data_ptr和数据块长度的变量data_size。当一个线程需要把这个消息发送给另外一个线程时,可以采用如下的操作:
struct msg* msg_ptr; msg_ptr = (struct msg*)rt_malloc(sizeof(struct msg));
msg_ptr->data_ptr = ...; /* 指向相应的数据块地址*/
msg_ptr->data_size = len; /* 数据块的长度*/
/* 发送这个消息指针给mb邮箱*/
rt_mb_send(mb, (rt_uint32_t)msg_ptr);
而在接收线程中,因为收取过来的是指针,而msg_ptr是一个新分配出来的内存块,所以在接收线程处理完毕后,需要释放相应的内存块:
struct msg* msg_ptr;
if (rt_mb_recv(mb, (rt_uint32_t*)&msg_ptr) == RT_EOK)
{
/* 在接收线程处理完毕后,需要释放相应的内存块*/
rt_free(msg_ptr);
} 消息队列:也是线程或中断与线程间通讯的一种异步通讯手段,且不限长度(只能发送4字节的限制,如果长度为4则消息队列退化成消息邮箱)。每个队列包含若干消息框,每个消息框存放一条消息。缓存池地址,消息框数及每个消息框大小,当前已有的消息数,头和尾。
除了创建、删除、初始化、解绑、收、发外还有一个紧急发送,将队列放到消息队列的头而不是尾部。注意下面例子:消息队列因为是数据内容的直接复制(深拷贝),所以用局部变量即可
这样也就免去动态内存分配的烦恼了(也就不用担心,接收线程在接收到消息时,消息内存空间已经被释放)
void send_op(void *data, rt_size_t length)
{
struct msg msg_ptr; msg_ptr.data_ptr = data; /* 指向相应的数据块地址 */
msg_ptr.data_size = length; /* 数据块的长度 */ /* 发送这个消息指针给mq消息队列 */
rt_mq_send(mq, (void*)&msg_ptr, sizeof(struct msg));
}
void message_handler()
{
struct msg msg_ptr; /* 用于放置消息的局部变量 */ /* 从消息队列中接收消息到msg_ptr中 */
if (rt_mq_recv(mq, (void*)&msg_ptr, sizeof(struct msg)) == RT_EOK)
{
/* 成功接收到消息,进行相应的数据处理 */
}
}
线程A发消息队列给线程B,并希望得到B的收到确认信息,此时确认信息可以用信号量(只是通知收到了)或者用邮箱(还包括状态值信息)
RTT学习的更多相关文章
- RTT学习之线程
一 线程的创建和删除:rt_thread_create()创建的句柄,对应的删除rt_thread_delete(),注意线程的删除只是将线程的状态该为close,进入空闲任务才删除.rt_threa ...
- RTT学习之BSP
---恢复内容开始--- 一 根据相近型号的demo BSP进行修改制作自己的BSP https://github.com/RT-Thread/rt-thread/blob/master/bsp/st ...
- RTT学习之软件包
网络工具集 (NetUtils) Ping 工具: 是一种网络诊断工具,用来测试数据包能否通过 IP 协议到达特定主机,依赖于LWIP,支持域名和IP访问: NTP 工具:NTP 是网络时间协议 (N ...
- RTT学习之启动流程
总结RT-Thread的启动流程. 非运行时与运行时的image文件分别是什么样的,请画下来.是谁将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中? MDK环境下各种数据段存储 ...
- RTT学习之RTC设备
RTC: 目前系统内只允许存在一个 RTC 设备,且名称为 "rtc",所以不用查找设备 启用 Soft RTC (软件模拟 RTC),对无硬件RTC 启用 NTP 时间自动同步, ...
- RTT学习之sensor设备
Sensor设备的常用操作: 首先查找传感器设置获取设备句柄.rt_device_find 以轮询.FIFO.中断.任意一种方式打开传感器,中断和FIFO需要设置接收回调函数(释放一个信号量给接收线程 ...
- RTT学习之PWM、ADC设备
一 使用步骤: 查找 PWM 设备获取设备句柄.rt_device_find() 设置 PWM 周期和脉冲宽度.rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, ...
- RTT学习之SPI设备
SPI分为主.从.设备:具体又分标准SPI/DUAL SPI/QUAD SPI(用80字节的RAMrt_err_t rt_spi_take_bus(struct rt_spi_device *devi ...
- rtt学习之线程间同步与通信
一 线程间的同步与互斥:信号量.互斥量.实践集 线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作.临界区操作操作方法有: rt_hw_interrupt_ ...
随机推荐
- angularjs+requlirejs 搭建前端框架(1)
第一部分:发发牢骚吧 随着富前端时代的逐渐深入,越来越多的前端技术框架层出不穷,可以说是百花齐放.让我们这些爱好前端的人疲于奔命,今天学习这个框架,明天研究那个框架,哎,说不出的蛋疼...感觉好累.. ...
- WPF之MVVM模式(1)
MVVM模式 一.MVVM模式概述 MVVM Pattern : Model\View\ViewModel View:视图.UI界面 ViewModel:ViewModel是对Model的封装,通过一 ...
- 动态合并GridView数据行DataRow的列
前段时间,Insus.NET一直在演示GridView控件Header头行或列:<动态变更GridView控件列名>和<动态合并或定制GridView控件Header头某些列> ...
- 网络模拟工具Clumsy
Clumsy 是一款小巧而功能强大的开源弱网模拟工具,它能在windows平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现. 你可以选择 clumsy 提供的功能来有目的性的调 ...
- VMWare 装mac os x 一个必备优化神器 beamoff
https://blog.csdn.net/whitehack/article/details/47074403/ VMWare 装mac os x 一个必备优化神器 beamoff 2015年07月 ...
- Linux之sshkey密钥认证实战
在实际的生产环境中,经常会用到sshkey密钥认证实行数据分发数据等操作,还可以批量操作内网服务器,实行免密认证进行推送分发数据. 1.环境查看 分发服务器 节点服务器 2.服务器添加系统账号 3.生 ...
- 通过IDEA及hadoop平台实现k-means聚类算法
由于实验室任务方向变更,本文不再更新~ 有段时间没有操作过,发现自己忘记一些步骤了,这篇文章会记录相关步骤,并随时进行补充修改. 1 基础步骤,即相关环境部署及数据准备 数据文件类型为.csv文件,e ...
- [USACO08OPEN]农场周围的道路Roads Around The Farm BZOJ 1621 DFS
Farmer John's cows have taken an interest in exploring the territory around the farm. Initially, all ...
- LOJ2565 SDOI2018 旧试题 莫比乌斯反演、三元环计数
传送门 这道题的思路似乎可以给很多同时枚举三个量的反演题目提供一个很好的启发-- 首先有结论:\(d(ijk) = \sum\limits_{x|i}\sum\limits_{y|j}\sum\lim ...
- Django forum
Django是比较有名的Python Web框架,很多著名的网站如Instagram就是用的Django.V2EX是一个界面简洁,功能丰富的论坛,最新源码尚未开源.网络上有很多模仿V2EX外观使用其它 ...
