Simulink建模:CRC校验模型

news2024/10/6 10:42:48

本文研究CRC校验的Simulink模型及其代码生成。

文章目录

  • 1 CRC校验
  • 2 C代码形式
  • 3 Matlab/Simulink建模及代码生成
    • 3.1 Matlab Function建模
    • 3.2 For Iteration子系统建模
  • 4 总结与思考

1 CRC校验

在汽车软件开发中,CRC校验常用于CAN通信中。通常将某个CAN报文中的数据通过生成CRC8校验码,将此校验码和数据打包到一个CAN报文中一起发送。这样的话,接收报文的节点就会判定校验码是否正确,以判断传输的过程是否正确。

本文以CRC校验中的CRC8为例,研究该算法的Matlab/Simulink建模过程。另外,网上有个便捷的小工具可以用于在线计算CRC:http://www.ip33.com/crc.html。

2 C代码形式

关于CRC的理解和代码,在网上有很多。其C代码如下:

#define FACTOR (0x107 & 0xFF) //多项式因子(取低8bit)
uint8_t calcCRC8(uint8_t *pbuf, uint8_t len)
{
    uint8_t i;
    uint8_t crc8 = 0x00;
    while(len--)
	{
        crc8 ^= (*pbuf++);    //前一字节计算CRC后的结果异或上后一字节,再次计算CRC
        for (i=0; i<8; i++)
        {
            if (crc8 & 0x80)  //高位为1时需要异或;否则不需要
            {
                crc8 = (crc8 << 1) ^ FACTOR;  //多项式最高位为1,与数据高位1异或为0,所以数据左移一位后与多项式低8位异或即可
            }
            else
            {
            	crc8 = (crc8 << 1);
			}
        }
    }
 
    return crc8;
}

从代码中可以看出,函数的入口参数是一个uint8的指针,以及长度参数。函数中会循环每一个字节,对其进行异或预算,最终返回crc8的值。

接下来,本文会通过Matlab/Simulink搭建CRC8的算法,并与C代码进行比较。

3 Matlab/Simulink建模及代码生成

3.1 Matlab Function建模

m语言和C语言很相似,所以可以通过m语言将算法写一遍,再嵌入到Matlab Function中,就可以再模型中实现CRC8。

1)新建立一个Matlab Function,配置输入参数为 arr 和 len,分别代表数组和长度。
在这里插入图片描述
2)在Matlab Function中模仿C语言形式,编写m语言的CRC算法;

function crc8 = calcCRC8(arr,len)
FACTOR = bitand(263,255);
crc8 = uint8(0);
for i = 1:len
    crc8 = bitxor(crc8,arr(i));
    for j = 1:8
        if(bitand(crc8,128))
            crc8 = bitxor(bitshift(crc8,1),FACTOR);
        else
            crc8 = bitshift(crc8,1);
        end
    end    
end
end

由于Matlab不支持指针,所以第一个参数arr为数组(但是可以不定义数组长度,而是继承外面输入的数组长度),第二个参数为len。

在M语言中,异或运算符为bitxor(a,b),这点和C语言不同。

3)保存好Matlab Function之后,用常数简单测一下;
在这里插入图片描述
输入常数为0x2C,输出CRC8校验码为0xC4,说明算法没问题。

4)接下来,把输入输出替换成port,尝试生成代码;
在这里插入图片描述
这里,Inport1和Inport3分别设置为长度为1的单变量和长度为2的数组,是为了测试同样的CRC校验算法的Matlab Function在不同长度输入的情况下,会如何表现;

5)将两个Matlab Function都配置成原子子系统,Ctrl + B生成代码如下;
在这里插入图片描述
这里由于传参的长度不同,分别生成了两个函数。第一个函数的第一个参数是uint8 变量,第二个函数的第一个参数是uint8类型数组。

这里博主认为是Matlab代码生成工具比较格式化,必须在生成代码之前就分析好函数的参数类型等信息,然后生成固定的传参形式,而无法生成指针这样灵活的参数。这样就导致了在C语言中一个函数就搞定的CRC8算法,生成了两遍,占用了芯片Flash资源。

3.2 For Iteration子系统建模

Simulink中也可以通过For Iteration子系统实现类似于C语言中的for循环,方法如下:

1)首先新建一个for循环子系统,arr端口设为长度为2的数组;
在这里插入图片描述
2)在该层for循环子系统中,对应着对每个字节的循环处理,也即上文中while的循环;

在这里插入图片描述
其中,子系统中嵌套了另一个子系统,对应于C函数中的第二层循环 for (i=0; i<8; i++) ;

需要注意的是,该层中的selector模块用于挑选出数组中某个索引的元素,而且必须明确数组的长度。这就导致了不同长度的数组无法通用该模型。

在这里插入图片描述

3)第二层循环中如下所示;
在这里插入图片描述
这里建模有点复杂,远没有C代码那么简洁。而且也没必要再生成代码了,因为生成的代码更加复杂。而且不同长度的数组必定要生成不同的函数,甚至在模型层面都无法通用。

4 总结与思考

本文研究CRC校验的Simulink模型及其代码生成,博主认为通过这个例子可以看出,CRC校验算法不适合用Simulink建模生成代码,原因如下:

1)Simulink对指针的支持不够好
通过常规的建模方式,Simulink难以生成灵活的指针操作。或许Simulink可以通过一些配置,例如修改S Function或者TLC语言生成指针,但是那样做实在太麻烦了,没必要花精力钻研工程软件的底层实现。

2)处理循环和数组比较麻烦
在3.2的例子中,Simulink模型的for子系统远不如C语言中的for循环那样易读,对于数组的处理也不够直观。

CRC校验在软件开发中更加属于底层软件,而不是应用层软件。所以直接通过C语言实现或许是更好的选择。博主依然尝试用Simulink的两种方式实现,是希望通过实践更加直观地对比出不同方式地优劣。

其实很多软件需求,都不适合用Simulink生成代码的方式完成(例如自动驾驶感知规划),需要根据需求和工具的特点灵活选取软件工具。

>>返回个人博客总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AVL树】

目录基础知识AVL树的定义结点的平衡因子结构体部分操作思路AVL树的插入平衡化旋转左单旋转右单旋转先左后右双旋转先右后左双旋转插入函数AVl树的删除左平衡代码右平衡代码删除函数基础知识 AVL树的定义 一棵AVL树或者是空树&#xff0c;或者是具有谢下列性质的二叉搜索树&am…

Docker 实战——部署 Nginx 镜像容器、Tomcat 镜像容器、MySQL 镜像容器

3.安装 Docker 可使用 yum list docker-ce --showduplicates | sort -r 命令来查看 Docker 的所有版本。 [rootDocker ~]# yum -y install docker-ce-17.12.1.ce #安装docker 4.启动 Docker 并设置开机自启 [rootDocker ~]# systemctl start docker [rootDocker ~]# syste…

uniClound云开发创建流程

uniClound是 DCloud 联合阿里云、腾讯云&#xff0c;为开发者提供的基于 serverless 模式和 js 编程的云开发平台。云服务创建项目&#xff0c;使用熟悉的js&#xff0c;轻松搞定前后台整体业务&#xff0c;使前端开发离全栈开发又进一步&#xff0c;尤其是一键生成代码的功能&…

海外的 SEO 网站如何进行优化

作为一个已经出海12年的专业平台&#xff0c;米贸搜为你整理了一份海外SEO优化方法&#xff0c;希望对你有所帮助。 无论是平台还是外贸网站&#xff0c;无论是外贸还是内销&#xff0c;一个绕不开的话题就是流量。随着各平台和外贸网站竞争的加剧&#xff0c;流量的获取成本也…

【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型)

心脏病是人类健康的头号杀手, 全球大约1/3的人口死亡是由心脏病引起的。而我国,每年大概有几十万人口死于心脏病。如果我们可以通过提取人体相关的指标(既往病史、家族病史、血压情况、血糖情况等等),通过数据挖掘方式来分析不同特征对于心脏病的影响,或者建立电子病历,…

flink1.13.2 text文本数据迁移为orc+snappy数据解决方案

1.表结构不变(列名,分区不变),表存储和压缩算法改变 1.1. 外部表(未分区) 1.1.1. 拷贝源表结构,创建外部表 create table if not exists [目标表名] like [源表名] 示例: create table if not exists dwm_soh_estimate_nopartition_out_snappy like dwm_soh_estimate_n…

10x倍加速PDE的AI求解:元自动解码器求解参数化偏微分方程

研究背景 科学和工程中的许多应用需要求解具有不同方程系数、不同边界条件甚至不同求解域形状的偏微分方程(Partial Differential Equation&#xff0c;PDE)&#xff0c;即需要求解一个方程族而不是单个方程。这类应用经常在反问题求解、控制和优化、风险评估和不确定性量化领域…

C++GUI之wxWidgets(4)-编写应用涉及的类和方法(1)

目录wxApp ClasswxApp::OnInit()wxFrame ClasswxFrame处理的事件wxApp Class 当wxUSE_GUI1时&#xff0c;wxApp类代表应用程序本身。 除了wxAppConsole提供的特性外&#xff0c;它还可以跟踪顶部窗口(SetTopWindow())&#xff0c;并添加了对视频模式的支持&#xff08;SetDisp…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java小区宠物信息管理系统0v9l2

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了&#xff0c;确实&#xff0c;从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做&#xff0c;创…

高低JDK版本中JNDI注入(上)

目录 前言&#xff1a; (一&#xff09;RMI 0x01 低版本 1.1 服务端 1.2 客户端 1.3 ExportObject.java 0x02 高版本 (二&#xff09;LDAP 0x01低版本 1.1 服务端 1.2 客户端 1.3 ExportObject.java 前言&#xff1a; 这篇文章主要是分析在高低版本JDK中JNDI注入RMI和LDA…

痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设。 在嵌入式世界里&#xff0c;输出打印信息是一种非常常用的辅助调试手段&#xff0c;借助打印信息&#xff0c;我们可以比较容易地定位和分析程序…

泰迪·滇西科技师范学院智能工作室分享:第一章NumPy库——先基础区别数组和列表

前言 来看NumPy库的应该都是接触到庞大数据处理的朋友吧。NumPy是一个简洁好用的数据库&#xff0c;尤其是在科学计算上&#xff0c;专为进行严格数字处理而产生的。其中的ndarray可以说是NumPy库的心脏&#xff0c;它提供了一个强大的N维数组对象&#xff0c;这一章我们先来简…

2 寄存器

寄存器 CPU是由运算器、控制器、寄存器等器件构成&#xff0c;他们依靠内部总线连接。 运算器进行信息处理&#xff1a;寄存器进行信息存储&#xff1b;控制器控制各种器件进行工作&#xff1b;内部总线连接各种器件&#xff0c;在它们之间进行数据的传送。 寄存器是程序员可…

[附源码]Python计算机毕业设计Django社区住户信息管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

AI 绘画整体认知

体验 ChatGPT 之后&#xff0c;深刻感觉到 “了解 AI 绘画” 这件事必须得安排上了。 于是用了两三个日夜&#xff0c;了解如下&#xff1a; &#xff08;文末附完整脑图链接&#xff09; 一、发展时间线 二、使用已有的AI绘画云平台&#xff08;目前国内外有很多&#xff09…

华为与思科路由器静态路由配置

一、华为路由器配置静态路由 1、静态路由基础 拓扑如下: 配置静态路由,使得PC1可以ping通PC3。 R1: interface Ethernet0/0/0ip address 124.16.8.1 255.255.255.0 # interface Ethernet0/0/1ip address 110.69.70.1 255.255.255.0 # # ip route-static 172.16.3.0 255.25…

Java_笔记_继承_虚方法表_成员变量方法构造_thisSuper

一、继承的概念以及优势&#xff1a; 1.概念&#xff1a; 1&#xff09;继承是面向对象三大特征&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;之一&#xff0c;可让类与类之间产生子父的关系。 2&#xff09;封装&#xff1a;对象代表什么&#xff0c;就封装…

VCS Design Compiler(1)

|||||||||||| ========= =============================== VCS & Design Compiler 联合应用 =================================

[附源码]JAVA毕业设计流行病调查平台(系统+LW)

[附源码]JAVA毕业设计流行病调查平台&#xff08;系统LW&#xff09; 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

PTA 7-251 汉诺塔问题

PTA 7-251 汉诺塔问题 分数 100 作者 于延 单位 哈尔滨师范大学 任务描述 在印度&#xff0c;有这么一个古老的传说&#xff1a;在世界中心贝拿勒斯&#xff08;在印度北部&#xff09;的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&am…