精华内容
下载资源
问答
  • 信箱通信
    2022-07-21 12:46:11

    信箱通信是一种“间接”通信方式。

    信箱通信是借助于收发双方进程之外的共享数据结构作为通信中转,发送方和接受方不必直接建立联系,没有处理时间上的限制;发送方可以在任何时间发送信息,接收方也可以在任何时间收信。

    更多相关内容
  • (1)创建两个任务,任务 1 不断循环发送字符 A~Z,通过邮箱的方式传递数据给任务 2,任务2 将从任务 1 收到的...要求用邮箱通信实现。用到的主要函数:OSMboxCreate、 OSMboxPost、OSMboxPend、OSMboxDel、OSTaskDel
  • µCOS-II 邮箱通信实验

    2013-01-24 17:23:24
    嵌入式µCOS-II操作系统下的邮箱通信实验报告
  • (三-一)IPC-邮箱通信

    千次阅读 2020-10-10 10:55:07
    邮箱通信是操作系统中常用的一种通信机制. 如图所示, 很多操作系统(如RT-THREAD)邮箱其实也是个全局变量, 线程B往邮箱里发数据, 可以有多个线程接收, 甚至还能自己发自己收. 以RT-THREAD的邮箱为例, 只保留主要...

    一个线程想发送信息到另一个线程, 最直接的方式是用全局变量, 但是全局变量难以管理, 而且一个线程希望等待信息的时候把自己挂起, 需要有一个方便的方案. 邮箱通信是操作系统中常用的一种通信机制.
    mailbox.png
    如图所示, 很多操作系统(如RT-THREAD)邮箱其实也是个全局变量, 线程B往邮箱里发数据, 可以有多个线程接收, 甚至还能自己发自己收.

    以RT-THREAD的邮箱为例, 只保留主要部分

    struct pt_mailbox
    {
        uint32_t            *msg_pool;          // 指向一块内存区域, 作为邮件的存储区
    
        uint16_t            size;               // 邮箱的大小, 单位 封, 一封邮件4字节, 即32位
    
        uint16_t            entry;              // 邮箱中当前邮件数量
        uint16_t            in_offset;          // 放入邮件的位置
        uint16_t            out_offset;         // 取出邮件的位置
    
    };
    

    mailbox_control_block.png
    如图所示,
    msg_pool指向了一块内存,
    size=7, 这块内存可以放7封邮件,
    entry=2,现在有两封邮件,
    in_offset=3, 下一次发送邮件进来, 就放在第3个格子
    out_offset=1, 下一次取邮件, 从第1个格子取

    邮箱的初始化

    int32_t pt_mb_init(pt_mailbox_t mb,
                        const char  *name,
                        void        *msgpool,
                        uint32_t    size,
                        uint8_t     flag)
    {
        (void)name;
        (void)flag;
        /* init mailbox */
        mb->msg_pool   = msgpool;
        mb->size       = size;
        mb->entry      = 0;
        mb->in_offset  = 0;
        mb->out_offset = 0;
    
        return PT_EOK;
    }
    

    这里邮箱的初始化只保留主要部分, 就是对邮箱控制块里面的几个变量赋值为默认值.
    用法:

        static char mb_pool[128];
        /* 初始化一个 mailbox */
        result = pt_mb_init(&mb,
                            NULL,                     
                            &mb_pool[0],                /* 邮箱用到的内存池是 mb_pool */
                            sizeof(mb_pool) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                            NULL);         
    

    发送邮件到邮箱

    int32_t pt_mb_send(pt_mailbox_t mb, uint32_t value)
    {
        if (mb->msg_pool == NULL){
            return -PT_ERROR;   //未初始化消息池
        }
    
        //邮件数量等于邮箱大小,满了不能再发送了,返回
        if (mb->entry == mb->size) {
            return -PT_EFULL;
        }
    
        // 放入邮件
        mb->msg_pool[mb->in_offset] = value;
        /* increase input offset */
        ++ mb->in_offset;
        if (mb->in_offset >= mb->size)
            mb->in_offset = 0;
        /* increase message entry */
        mb->entry ++;
    
        return PT_EOK;
    }
    

    获取邮件

    int32_t pt_mb_recv(pt_mailbox_t mb, uint32_t *value)
    {
        if(PT_NULL == mb ){
            return -PT_ERROR;   //未初始化消息池
        }
        if (PT_NULL == mb->msg_pool){
            return -PT_ERROR;   //未初始化消息池
        }
        //没有邮件,直接返回
        if (mb->entry == 0){
            return -PT_EEMPTY;
        }
    
         // 读取邮件到传入的value中
        *value = mb->msg_pool[mb->out_offset];
    
      
        ++ mb->out_offset;
        if (mb->out_offset >= mb->size){
            mb->out_offset = 0;
        }
    
        // 邮件数减一
        mb->entry --;
    
        return PT_EOK;
    }
    

    没有资源的时候挂起线程

    有时线程需要在等待邮件的时候或者邮箱满无法发送的时候挂起线程, 基于Protothread如何实现呢?
    只需要配合PT_WAIT_UNTIL即可.

    #define PT_MB_SEND_WAIT_FOREVER(mb, value)  PT_WAIT_UNTIL((pt), PT_EOK == pt_mb_send(mb, value) )
    #define PT_MB_RECV_WAIT_FOREVER(mb, addr)   PT_WAIT_UNTIL((pt), PT_EOK == pt_mb_recv(mb, (uint32_t *)addr) )
    

    PT_WAIT_UNTIL会检查发送或接收邮件的结果, 如果没有发送或接收成功, 那么就让出CPU, 下一次进来时继续判断是否执行成功.
    PT_MB_.png

    实例工程代码
    https://gitee.com/kalimdorsummer/c_language_program_template.git

    展开全文
  • 主站和从站间的邮箱通信通常使用SM0和SM1,IGH Etherlab在控制从站进入preop之前 需要配置从站的SM0和SM1寄存器。1、SM寄存器SM0配置寄存器的起始地址为0x800,SM1配置寄存器的起始地址为0x808,每个通道使用8个字节...

    主站和从站间的邮箱通信通常使用SM0和SM1,IGH Etherlab在控制从站进入preop之前需要配置从站的SM0和SM1寄存器。

    1、SM寄存器

    SM0配置寄存器的起始地址为0x800,SM1配置寄存器的起始地址为0x808,每个通道使用8个字节。
    这里写图片描述

    2、执行配置

    Etherlab在扫描从站时,或者激活master以后,都要控制从站从init切换到preop状态,执行状态切换之前将执行Fsm_slave_config.c中的ec_fsm_slave_config_enter_mbox_sync()函数,配置从站的SM0和SM1寄存器。

    void ec_fsm_slave_config_enter_mbox_sync(
            ec_fsm_slave_config_t *fsm /**< slave state machine */
            )
    {
        ......
    
        EC_SLAVE_DBG(slave, 1, "Configuring mailbox sync managers...\n");
    
        if (slave->requested_state == EC_SLAVE_STATE_BOOT) {
            ec_sync_t sync;
    
          ......
    
        } else if (slave->sii.sync_count >= 2) { // mailbox configuration provided
            ec_datagram_fpwr(datagram, slave->station_address, 0x0800,
                    EC_SYNC_PAGE_SIZE * slave->sii.sync_count);
            ec_datagram_zero(datagram);
    
            for (i = 0; i < 2; i++) {                                     
                ec_sync_page(&slave->sii.syncs[i], i,        //SM0SM1的值全部来源于从站的EEPROM,在扫描从站时获取。
                        slave->sii.syncs[i].default_length,
                        NULL, // use default sync manager configuration
                        0, // no PDO xfer
                        datagram->data + EC_SYNC_PAGE_SIZE * i);
            }
    
            slave->configured_rx_mailbox_offset =             
                slave->sii.syncs[0].physical_start_address;
            slave->configured_rx_mailbox_size =
                slave->sii.syncs[0].default_length;
            slave->configured_tx_mailbox_offset =
                slave->sii.syncs[1].physical_start_address;
            slave->configured_tx_mailbox_size =
                slave->sii.syncs[1].default_length;
        } else { // no mailbox sync manager configurations provided
    
             ......
    
        }
    
        fsm->take_time = 1;
    
        fsm->retries = EC_FSM_RETRIES;
        fsm->state = ec_fsm_slave_config_state_mbox_sync;
    }

    3、配置实例

    这里写图片描述

    展开全文
  • 本文分析AHB-SRAMC与MCDF信箱通信代码的区别

    • AHB-SRAMC(SV通信):mailbox
    • 通过new()函数传入mailbox参数的形式进行信箱的连接;
    • Environment里面例化gen、drv、agt、mon、scb以及例化信箱传入各个组件的new,进行连接;各个组件中的mailbox已经在本组件实例化,不用担心句柄悬空;

    • MCDF(SV通信):mailbox
    • Mon和scb的通信在env中进行对空句柄进行赋值,避免悬空;
    • Gen和drv的通信在base_test中进行句柄连接;
    • Mcdfmailbox并没有在各个组件中例化,而是在顶层环境对moilbox空句柄进行赋值;

    展开全文
  • 高级通信不仅用于本机,还适用于网络,包括消息队列(Message Queue),共享内存(Shared Memory),套接字(Socket)和邮箱通信(Post Box)等。网络上主要使用高级通信。 一,进程间低级通信 低级通信方式...
  • 在进程同步之中,也需要进程间交换一些信息,所以也可以归入进程通信中,但只能称为低级的进程通信。因为进程同步间的消息交换效率低、对用户不透明。 在进程间要传送大量数据的时候,可以使用OS提供的高级通信工具...
  • 进程间的通信方式

    千次阅读 2020-11-03 09:10:47
    进程通信的类型 共享存储器系统互斥访问共享空间 基于共享数据结构的通信方式 要求进程公用某些数据结构,借以实现进程间的信息交换。操作系统只提供共享存储器,由程序员负责对公用数据结构的设置及对进程间同步的...
  • 文章目录1 利用邮箱实现数据通信 1 利用邮箱实现数据通信 问题分析: 解决方案: 使用邮箱完成数据传递和同步功能。 消息通信分析: 示例代码: /** * @brief tOS应用示例 * @details * @author 01课堂 李述...
  • 邮箱通信录导入操作指引,能图文说明怎么操作邮箱通讯录的文件导入
  • 本文主要介绍任务间通信机制,通过对邮箱及消息队列进行详细介绍,并对其概念、详细设计、接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用。
  • 力天电子中LT-ARM214X学习板的ucos任务间邮箱通信实验,大家看看,对您有帮助就下下来
  • EtherCAT协议中非周期性数据通信称为邮箱数据通信。 它支持全双工、两个方向独立通信、多用户协议; 数据包格式见书本第24页 主站到从站的通信----写邮箱命令 主站将数据发送给从站后需要检查从站应答报文中的WKC...
  • 实验六 邮箱通信实验

    2013-03-23 20:30:35
    嵌入式 实验六 邮箱通信实验,这是做嵌入式实验后的实验报告,有要用到的看看
  • 操作系统 进程通信方式

    千次阅读 2020-12-21 13:02:22
    进程通信进程通信进程通信进程通信进程通信进程通信进程通信进程通信进程通信
  • 【操作系统】进程通信

    千次阅读 2022-04-03 11:13:25
    什么是进程通信?进程为什么需要通信? 进程通信:进程通信就是进程之间的信息交换。 进程通信的目的: 数据传输:一个进程需要将它的数据发送给另一个进程。 通知事件:一个进程需要向另一个或一组...
  • 计算机操作系统——进程间通信(Interprocess Communication)
  • 进程通信方式

    2022-04-10 15:58:46
    进程通信 什么是进程通信? 就是进程之间的信息交换。 进程是分配系统资源的单位,所以各进程拥有的内存地址空间相互独立。 为了保证安全,一个进程不能直接访问另一个进程的地址空间。必须通过内核才能进行...
  • 【操作系统】进程通信的几种方式

    千次阅读 2021-05-28 21:45:39
    1.1 进程间通信的定义   进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。...
  • 一、任务间通信 1、邮箱队列 概述 消息队列传递的是指针,邮箱队列传递的是大片的内存数据。 API讲解 编程实例 1、在tos_config.h中,配置邮箱队列组件开关TOS_CFG_MAIL_QUEUE_EN: #define TOS_CFG_MAIL_QUEUE_EN ...
  • 基于asp.net c#获取yahoo,sina,tom,gmail,163等邮箱通信
  • 进程通信,是指进程之间的信号交换,其所交换的信息量少者是一个状态或数值,多着则是成千上万个字节。进程之间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。信号量机制作为同步工具是卓有成效的,但...
  • 所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。  HTTPS简介  HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会...
  • 在公司里面,我们平时使用的机器一般都是windows系统,但是开发、编译的机器往往是linux服务器。通过ping、ftp、samba、telnet、ssh,人们可以很方便与服务器连接。...  其实,广义一点看,网页访问、邮箱、游戏、聊天
  • 代码包括单片机按钮控制led小灯亮灭,以及单片机之间rs232,ttl以及zigbee等不同标准的通信。按照原理图进行连接即可
  • 我们研发的这款便携通信信箱,可以随身携带,支持文本和语音消息的收发,监护人可以在 移动终端随时向孩子发送消息,接到消息后信箱会发出提示音提醒孩子查看消息,与之相对 应,孩子可以在打开信箱回复已读的消息...
  • 注意:可以多个进程往同一个信箱发送消息,也可以多个进程从同一个信箱中接受消息 管道通信 Linux_Centos进程间通信_管道(匿名管道_命名管道) 写进程向管道写入数据,读进程向管道读取数据。(数据流向是单项的) ...
  • 进程间通信方式

    2017-12-04 00:39:00
    3.4.1共享内存在相互通信的进程之间设有一个公共内存区,一组进程向该公内存中写,另一组进程从化共内存中读,通过这种方式实现两组进程间的信息交换。这种通信模式需要解决两个问题:第一个问题是怎样提供共享内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,847
精华内容 25,138
关键字:

信箱通信