SCOM

article/2025/9/24 4:06:16
  • SCOM:Synchronized COMmunication module

  • 使用的时候要包含:#include <scom.h>

  • 使用的类型和常数
    typedef struct SCOM_Attrs {     /* SCOM object creation attributes */
    Char dummy;                     /* no attributes at present */
    } SCOM_Attrs;
    typedef struct SCOM_Obj SCOM_Obj, *SCOM_Handle;     /* SCOM object handle */
    extern SCOM_Attrs SCOM_ATTRS;                       /* default SCOM creation attributes */

  • 描述:这个模块在任务之间传送消息。它允许用户创建任意个异步的队列,并把消息发到这些队列中而且可以
    从这些队列中读取消息。这些消息是任意大小的缓存区。

  • SCOM模块管理SCOM队列对象。每一个SCOM队列内部使用一个队列对象(QUE)和一个旗语对象(SEM)。在SCOM队列的
    结构在SCOM模块中是私有的。应用程序不应该涉及到SCOM队列的对象。

  • 一个队列可以拥有任意个消息,但是消息的第一个域必须是QUE_elem。如:
    typedef struct ScomBufChannels {
        QUE_Elem elem;
        Sample *bufChannel[ NUMCHANNELS ];
    } ScomBufChannels;

    Let us look at a general case where some tasks A and B want to exchange messages. Tasks A
    and B agree that A sends data of type MyMsg to B via SCOM queues named "scomA" for task
    A, and "scomB" for task B. The following steps would occur:

  • SCOM 用到的函数:

    • SCOM_init().    Initializes the module.
    • SCOM_exit().    Ends use of the module.
    • SCOM_create().  Creates a new SCOM queue object.
    • SCOM_open().    Gets a reference to an existing SCOM queue object by name.
    • SCOM_delete().  Deallocates and deletes an SCOM queue object.
    • SCOM_putMsg().  Places SCOM message in an SCOM queue.
    • SCOM_getMsg().  Receives SCOM message from an SCOM queue.

    分析:
    SCOM_create()得到SCOM队列的句柄。
    Syntax scomQueue = SCOM_create(queueName, *attrs);
    Parameters     String queueName; /* Name of SCOM queue to create */
    SCOM_Attrs     *attrs; /* SCOM object attributes; only NULL supported */
    Return Value  SCOM_Handle /* handle of new SCOM queue */

    上面的表描述了两个任务之间的通信。一旦一个线程建立了一个队列,那么我们就可以在另一个线程里通过SCOM_open()来通信。


  • 例子:

    定义:
    SCOM_Handle objSCOMINToDIS[NUM_SCOM_OBJS_IN][2];

    Ptr msgSCOMInToProc[NUM_SCOM_OBJS_IN];
    在main()函数中
     /*-------------------------------------------------------*/
    /* create all SCOM and message objects */
    /*-------------------------------------------------------*/
    objSCOMINToDIS[0][0] = SCOM_create("IN1TODIS", NULL);
    objSCOMINToDIS[0][1] = SCOM_create("DISTOIN1", NULL);

    objSCOMINToDIS[1][0] = SCOM_create("IN2ATODIS", NULL);
    objSCOMINToDIS[1][1] = SCOM_create("DISTOIN2A", NULL);

    objSCOMINToDIS[2][0] = SCOM_create("IN2BTODIS", NULL);
    objSCOMINToDIS[2][1] = SCOM_create("DISTOIN2B", NULL);
    在采集线程1中:
    FVID_Frame *capFrameBuf;
    SCOM_Handle fromInput1toDIS,fromDIStoInput1;

    /*打开SCOM模块*/
    fromInput1toDIS = SCOM_open("IN1TODIS");
    fromDIStoInput1 = SCOM_open("DISTOIN1");
    /*申请一个空间*/
    FVID_alloc(capChanCh1, &capFrameBuf);

    while(1)
    {
    /*-----------------------------------------------------------*/
    /* Send message to process task with pointers to captured frame*/
    /*-----------------------------------------------------------*/
    SCOM_putMsg(fromInput1toDIS, (FVID_Frame *)capFrameBuf);

    /*-----------------------------------------------------------*/
    /* Wait for the message from the process task */
    /*-----------------------------------------------------------*/
    SCOM_getMsg(fromDIStoInput1, SYS_FOREVER);

    /*-----------------------------------------------------------*/
    /* Capture a new frame. */
    /*-----------------------------------------------------------*/
    FVID_exchange(capChanCh1, &capFrameBuf);
    }
    采集线程2中:
    FVID_Frame *capFrameBuf;
    SCOM_Handle fromInput2atoDIS,fromDIStoInput2a;

    /*打开SCOM模块*/
    fromInput2atoDIS = SCOM_open("IN2ATODIS");
    fromDIStoInput2a = SCOM_open("DISTOIN2A");
    /*申请一个空间*/
    FVID_alloc(capChanCh2a, &capFrameBuf);

    while(1)
    {
    /*-----------------------------------------------------------*/
    /* Send message to process task with pointers to captured frame*/
    /*-----------------------------------------------------------*/
    SCOM_putMsg(fromInput2atoDIS, (FVID_Frame *)capFrameBuf);

    /*-----------------------------------------------------------*/
    /* Wait for the message from the process task */
    /*-----------------------------------------------------------*/
    SCOM_getMsg(fromDIStoInput2a, SYS_FOREVER);

    /*-----------------------------------------------------------*/
    /* Capture a new frame. */
    /*-----------------------------------------------------------*/
    FVID_exchange(capChanCh2a, &capFrameBuf);
    }
    显示线程3中:
    void tskVideoLoopback()
    {
    Int i;

    SCOM_Handle fromInput1toDIS,fromDIStoInput1;
    SCOM_Handle fromInput2atoDIS,fromDIStoInput2a;
    SCOM_Handle fromInput2btoDIS,fromDIStoInput2b;

    FVID_Frame *capFrameBuf;
    FVID_Frame *disFrameBuf;
    /*设置显示的行数*/
    Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
    /*设置采集的行数*/
    Int numLinesCap = SEEDVPM642_vCapParamsChan.fldYStop1 -
    SEEDVPM642_vCapParamsChan.fldYStrt1+1;
    /*判断是显示区域大,还是采集区域大,取其小者*/
    Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
    /*设置采集像素数*/
    Int numPixels = (SEEDVPM642_vCapParamsChan.fldXStop1 -
    SEEDVPM642_vCapParamsChan.fldXStrt1+1)/2;
    /*设置采集行的增量*/
    Int capLinePitch = (SEEDVPM642_vCapParamsChan.fldXStop1 -
    SEEDVPM642_vCapParamsChan.fldXStrt1+1)/2;
    /*设置显示行的增量*/
    Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;

    // numLines *= 2; /* both fields */

    /*打开SCOM模块*/
    fromInput1toDIS = SCOM_open("IN1TODIS");
    fromDIStoInput1 = SCOM_open("DISTOIN1");

    fromInput2atoDIS = SCOM_open("IN2ATODIS");
    fromDIStoInput2a = SCOM_open("DISTOIN2A");

    fromInput2btoDIS = SCOM_open("IN2BTODIS");
    fromDIStoInput2b = SCOM_open("DISTOIN2B");
    /*申请一个空间*/
    FVID_alloc(disChan, &disFrameBuf);

    while(1)
    {
    /*-----------------------------------------------------------*/
    /* Wait for the message from the process task to recieve new */
    /* frame to be displayed. */
    /*-----------------------------------------------------------*/
    capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput1toDIS, SYS_FOREVER);

    /*将数据放入相应的显示缓冲区*/
    for(i = 0; i < numLines; i ++)
    {
    DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
    disFrameBuf->frame.iFrm.y1 + i * disLinePitch+352,
    numPixels);
    DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+172,
    numPixels>>1);

    DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+172,
    numPixels>>1);
    }
    // DAT_wait(DAT_XFRID_WAITALL);
    /*-----------------------------------------------------------*/
    /* Wait for the message from the process task to recieve new */
    /* frame to be displayed. */
    /*-----------------------------------------------------------*/
    capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput2atoDIS, SYS_FOREVER);
    /*将数据放入相应的显示缓冲区*/
    for(i = 0; i < numLines; i ++)
    {
    DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
    disFrameBuf->frame.iFrm.y1 + i * disLinePitch+720*287,
    numPixels);
    DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+360*287,
    numPixels>>1);

    DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+360*287,
    numPixels>>1);
    }
    // DAT_wait(DAT_XFRID_WAITALL);
    /*-----------------------------------------------------------*/
    /* Wait for the message from the process task to recieve new */
    /* frame to be displayed. */
    /*-----------------------------------------------------------*/
    capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput2btoDIS, SYS_FOREVER);
    /*将数据放入相应的显示缓冲区*/
    for(i = 0; i < numLines; i ++)
    {
    DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
    disFrameBuf->frame.iFrm.y1 + i * disLinePitch+720*287+352,
    numPixels);
    DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+360*287+172,
    numPixels>>1);

    DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
    disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+360*287+172,
    numPixels>>1);
    }

    DAT_wait(DAT_XFRID_WAITALL);
    CACHE_clean(CACHE_L2ALL,NULL,NULL);
    /*-----------------------------------------------------------*/
    /* Display the decoded frame. */
    /*-----------------------------------------------------------*/
    FVID_exchange(disChan, &disFrameBuf);

    /*-----------------------------------------------------------*/
    /* Send message to process task to continue */
    /*-----------------------------------------------------------*/
    SCOM_putMsg(fromDIStoInput1, NULL);/* loop forever */
    /*-----------------------------------------------------------*/
    /* Send message to process task to continue */
    /*-----------------------------------------------------------*/
    SCOM_putMsg(fromDIStoInput2a, NULL);/* loop forever */
    /*-----------------------------------------------------------*/
    /* Send message to process task to continue */
    /*-----------------------------------------------------------*/
    SCOM_putMsg(fromDIStoInput2b, NULL);/* loop forever */
    }
    }


http://chatgpt.dhexx.cn/article/32al7XwE.shtml

相关文章

SCMA稀疏码多址调制解调系统概述和matlab仿真

目录 1. 引言 2. 数学原理 2.1 资源分配和稀疏码本 2.2 SCMA的编码和调制 2.3 SCMA的信道传输和解调 3. 实现过程 3.1 稀疏码本的构建 3.2 SCMA编码过程 3.3 SCMA解调过程 4. 应用领域 5. 实现难点 5.1 资源分配和编码映射 5.2 信道传输和解调算法 5.3 多用户干扰…

5G通信演进和常见名词释义

写在前面 由于工作性质的变化&#xff0c;需要对5G的通信原理、架构和标准进行深入的了解。借此分享一下5G通信技术初步学习的内容。 通信系统发展演进 5G的含义&#xff0c;即第五代移动通信系统和技术。这种叫法是3G时代开创的&#xff0c;随3G-4G-5G一直沿用下来。那有没…

CSMA、CSMA/CD与CSMA/CA协议

载波监听多路访问&#xff08;CSMA&#xff09;协议 若每个站点在发送数据之前都先侦听一下公用信道&#xff0c;如果信道空闲后再发送&#xff0c;则就会大大降低冲突的可能性&#xff0c;从而提高信道的利用率 。 CS&#xff1a;载波侦听/监听&#xff0c;每一个站在发送数据…

CSMACD协议与CSMACA协议

CSMA/CD协议 全称&#xff1a;载波监听多点接入/碰撞检测CSMA/CD&#xff08;carrier sense multiple access with collision detection&#xff09; CS&#xff1a;载波侦听/监听&#xff0c;每一个站在发送数据之前要检测一下总线是否有其他计算机在发送数据。 MA&#xff1…

深度解读华为5G空口新技术:F-OFDM和SCMA

长江后浪推前浪&#xff0c;4G建设方兴未艾&#xff0c;业界关于5G的讨论已如火如荼。对于每一代移动通信&#xff0c;空口技术都相当于王冠上的明珠。 本文引用地址&#xff1a; http://www.eepw.com.cn/article/271583.htm 在月初的世界移动通信大会上&#xff0c;华为发布了…

基于polar码和SCMA的多用户检测的联合检测译码matlab仿真,polar采用SCAN软译码,SCMA用MPA算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 构造的核心是通过信道极化&#xff08;channel polarization&#xff09;处理&#xff0c;在编码侧采用方法使各个子信道呈现出不同的可靠性&#xff0c;当码长持续增加时&#xff0c;部分信道将…

OTFS-SCMA学习笔记

参考资料&#xff1a;OTFS-SCMA: A Downlink NOMA Scheme for Massive Connectivity in High Mobility Channels OTFS系统流程 X [ m , n ] X[m,n] X[m,n]是DD时延多普勒域 Γ { ( m M Δ f , n N T ) , m 0 , … , M − 1 , n 0 , … , N − 1 } \Gamma\left\{\left(\frac…

【通信】基于Matlab模拟SCMA系统时延调度算法

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 ⛄ 内容介绍 稀疏码多址接入(Sparse Code Multiple …

SCMA基本原理介绍

SCMA: Sparse Code Multiple Access SCMA基本原理 我们考虑一个同步&#xff08;synchronous&#xff09;的SCMA系统&#xff0c; 含1个基站&#xff08;Base Station, BS&#xff09;&#xff1b; J J J个用户&#xff08;so called layers&#xff09;&#xff1b;K个OFDM…

面向5G移动通信的新型多址接入技术-SCMA

从移动通信发展历程来看&#xff0c;通信几乎每隔十年就会换代升级&#xff0c;从80年代的1G通信主要是以语音为主&#xff0c;调制方式是FDMA&#xff1b;90年代2G通信发展了短信传输&#xff0c;调制方式有CDMA,TDMA等&#xff1b;2000年前后3G通信出现&#xff0c;传输速率加…

使用JMeter进行压力测试

1. 引言 在日常开发中&#xff0c;当完成一个接口开发时&#xff0c;需要对接口进行准确性测试&#xff0c;比如PostMan、Swagger等&#xff0c;但在接口上线运行前对其进行性能测试是很有必要的&#xff0c;就是所谓的接口压力测试。 压力测试就是考察当前软硬件环境下系统所…

JMeter进行API服务的压力测试

文章目录 前言一、准备工作1.安装jmeter2.安装java环境 二、JMeter使用样例1.运行JMeter2.创建调用流程1.背景阐述&#xff1a;2.JMeter模拟调用1.添加线程组&#xff1a;2.请求设置3.创建请求流程4.响应时长展示5.监控服务器CPU&#xff0c;MEM&#xff0c;I/O等 前言 本文用…

使用jmeter进行http压力测试(适合小白观看)

今天2019年2月4日&#xff0c;除夕贴完对联等着过大年了&#xff01; 今天来更新一篇博客&#xff0c;关于如何使用 jmeter 对web 进行压力测试&#xff0c;由于我的个人电脑是 deepin(Linux) 操作系统&#xff0c;因此这里就在Linux环境下演示&#xff0c;其实 Linux 演示和 w…

压力测试-Jmeter

我们在开发的过程中&#xff0c;如果遇到系统预估访问量会比较大的时候&#xff0c;或者我们再做底层基础服务的时候&#xff0c;往往需要对我们的服务性能做一些压力测试和稳定性测试&#xff0c;市面上有很多压测工具&#xff0c;今天我们主要讲解的是Jmeter压力测试工具&…

软件jmeter压力测试实例,jmeter压力测试案例实战

1、 测试目标地址:http://www.cnblogs.com/ 2、 1秒内有100个用户同时访问,看性能如何 3、 步骤 线程组、http请求、查看结果树、聚合报告 添加http请求如下: 继续填入参数格式: 服务器或名称IP:www.cnblogs.com 端口号:80 Connect:1000 Response:1000 添加查看结…

Jmeter负载和压力测试

负载和压力的区别: 负载测试:在一定的工作负荷下,给系统造成du的负zhi荷及系统响应的时间。 压力测试:在一定的负荷条件下,长时间连续运行系统给系统性能造成的影响。 TPS和QPS的区别: tps可以理解为是每秒对事务的处理的能力 qps是每秒对服务器的查询能力 性能测试w…

Jmeter 压力测试 - Http2.0工具支持-【教学篇】

Jmeter快速使用 特此郑重声明&#xff01;该文章是原创作品&#xff0c;小编编写实属不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 概述 Apache JMeter Apache组织开发的压力测试工具。目前通过HTTP和FTP服务器用于对软件做压力测试&#xff0c;它…

Http压力测试工具HttpTest4Net

HttpTest4Net是一款基于C#实现的和HTTP压力测试工具,通过工具可以简单地对HTTP服务进行一个压力测试.虽然VS.NET也集成了压力测试项目,但由于VS自身占用的资源导致了在配置不高的PC上难以做到高并发压力测试,再加上需要装VS这个样一个庞大的工具也是件很麻烦的事情.使用HttpTes…

JMeter之压力测试

一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行测试软件&#xff0c;来测试被测系统的性能、…

Jmeter登录压力测试

1.配置海量用户账号数据登录测试 usernamepassword1K.csv 用户名& 密码MD5加密 2. 启动jmeter.bat&#xff0c;新增测试计划 3.配置CSV文件 4.配置信息头 5. 配置http请求默认值 6.配置http请求账号&密码 配置查看结果树&聚合报告