# ComoFscpVoter **Repository Path**: tjopenlab/como-fscp-voter ## Basic Information - **Project Name**: ComoFscpVoter - **Description**: COMO FSCP(Function Safety Computing Platform) Voter - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-02-23 - **Last Updated**: 2025-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # COMO FSCP Voter COMO 功能安全表决器(FSCP = Function Safety Computing Platform)。 ## 快速开始 **注意:**完整克隆本仓库: ```sh # 需加--recursive参数 git clone --recursive https://gitee.com/tjopenlab/como-fscp-voter ``` 或在克隆本仓库后补充克隆子仓库: ```sh git submodule update --init ``` 更新子仓库代码: ```sh git submodule update # 依次进入各子仓库目录,并git pull cd ./libzmtp git pull cd ./rudp git pull # 如果报错"您当前不在一个分支上。请指定您要合并哪一个分支",则先checkout master即可: cd ./rudp git checkout master git pull ``` ## 1 使用说明 ### 1.1 编译 PC端,在根目录下使用`make`命令编译。默认使用GCC编译,可通过参数`CROSS_COMPILE`更改编译工具链。举例:`make CROSS_COMPILE=aarch64-openeuler-linux-`。 ### 1.2 测试 见docs/testcase.md。 ## 2 介绍(By ChatGPT) 功能安全表决器(FSCP Voter)是指在功能安全系统中,用于进行表决以确保系统在发生故障时仍能够正确运行的组件。功能安全表决器通常应用于对系统进行监测、决策和执行相关操作的情况,以提高系统的可靠性和安全性。 以下是功能安全表决器的一般特征和功能: 1. **监测:** 对系统的关键参数和状态进行监测,包括传感器数据、执行状态等。 2. **决策:** 根据监测到的数据,进行决策判断系统当前是否正常工作,或者是否存在潜在的故障。 3. **表决:** 在监测和决策的基础上,进行表决以决定系统的行为。表决可以涉及多个组件或系统部分,其中的功能安全表决器负责协调这些表决结果。 4. **故障容忍:** 具备对故障进行容忍的能力,即使在某个组件发生故障的情况下,依然能够维持系统的运行。 5. **冗余性:** 通常与冗余系统结合使用,通过多个独立的组件来执行相同的任务,以提高系统的可用性和可靠性。 6. **诊断:** 在故障发生时,能够对故障进行诊断,并采取适当的措施,例如切换到备用组件或进行报警。 7. **安全性要求:** 需要满足相关的功能安全标准和规范,如ISO 26262(汽车领域)、IEC 61508(工业自动化领域)等。 8. **通信接口:** 与其他系统组件进行通信,获取监测数据、传递决策信息等。 在不同的行业和应用领域,功能安全表决器的具体实现方式和要求可能有所不同。例如,在汽车行业中,ISO 26262 是一个关键的标准,规定了在汽车电子系统中确保功能安全性的方法和要求。在工业控制系统中,IEC 61508 则是一个常见的应用标准。 具体实现时需要根据系统的特点和功能安全标准进行详细设计,确保系统在发生故障时仍能够安全可靠地运行。 ## 3 说明 1. 代码尽量地小,(努力)过SIL4认证。 2. 工作在RTOS或Linux可以保证实时计算的进程。 3. 表决器是一个比较器,所有参与表决的内容一致,或符合某个表决原则,则表决通过:PASS,否则表决失败:FAIL。 4. 在整个软件中,特别是在表决器模块中,考虑并发处理和同步机制,确保数据一致性。 ## 4 软件架构 1. 通信方式: - 通过基于TCP/IP的ZMQ协议实现与外界数据通信,ZMQ套接字像UDP那样传递信息,而不是像TCP那样传递字节流; - 通过裸的TCP/IP数据通信实现与外界数据通信。 2. 表决器主体像是一个聊天室,当所有Chatter(聊客)的数据都提交后,要求进行表决,Voter把表决结果发回给各Chatter。 3. 每次发起表决前,产生一个token,用来标识当前表决的事务。表决协议:什么时候初始化,什么时候提交数据,怎么取表决结果。 4. 程序代码符合MISRA-C规范,运行起来后,避免动态内存分配,使用静态分配或栈上分配来管理内存。 5. 避免使用不安全的函数,确保代码的可靠性和安全性。 ## 5 基本原理 ### 5.1 Server 程序主要步骤 1. 服务器设置最小加入客户端数量 `MIN_CLIENTS`,待表决事务数量 `num_trans`,以及一个包含事务的结构体数组 `trans_arr`。 2. 创建一个 TCP socket,并绑定到指定的地址和端口。 3. 使用 `listen` 函数开始监听传入的连接请求。 4. 接受客户端连接,当客户端数量达到 `MIN_CLIENTS` 时,向每个客户端发送问候语和当前加入的客户端数量。 5. 等待客户端发送数据,收集 `MIN_CLIENTS` 个数据,并判断它们是否相同。可以使用一个数组来存储收到的数据。 6. 将判断结果 mode 发布给所有客户端,并发布下一个待表决事务的 id `trans_arr[i].id`。 7. 继续等待客户端发送下一个事务的数据,并重复步骤 5 和 6,直到所有事务表决完毕。 8. 发布所有事务表决完毕的信息给所有客户端,并关闭连接。 ### 5.2 Client 程序主要步骤 1. 创建一个 TCP socket 用于与服务器进行通信。 2. 使用 connect 函数连接到指定的服务器地址和端口。 3. 接收服务器发送的问候语和当前加入的客户端数量。 4. 根据事务的数量,在循环中执行以下操作: 5. 接收服务器发布的待表决事务的 id `trans_arr[i].id`。 6. 根据 id 提供相应的数据给服务器。 7. 等待服务器发布表决结果 `is_pass`。 8. 根据表决结果执行相应的操作,比如打印结果或者继续提供下一个事务的数据。 9. 接收服务器发布的所有事务表决完毕的信息,并关闭连接。