Simulink建模:CRC校驗?zāi)P?創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比奎文網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式奎文網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋奎文地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。文章目錄
  • 1 CRC校驗
  • 2 C代碼形式
  • 3 Matlab/Simulink建模及代碼生成
    • 3.1 Matlab Function建模
    • 3.2 For Iteration子系統(tǒng)建模
  • 4 總結(jié)與思考

1 CRC校驗

在汽車軟件開發(fā)中,CRC校驗常用于CAN通信中。通常將某個CAN報文中的數(shù)據(jù)通過生成CRC8校驗碼,將此校驗碼和數(shù)據(jù)打包到一個CAN報文中一起發(fā)送。這樣的話,接收報文的節(jié)點就會判定校驗碼是否正確,以判斷傳輸?shù)倪^程是否正確。

本文以CRC校驗中的CRC8為例,研究該算法的Matlab/Simulink建模過程。另外,網(wǎng)上有個便捷的小工具可以用于在線計算CRC:http://www.ip33.com/crc.html。

2 C代碼形式

關(guān)于CRC的理解和代碼,在網(wǎng)上有很多。其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++);    //前一字節(jié)計算CRC后的結(jié)果異或上后一字節(jié),再次計算CRC
        for (i=0; i<8; i++)
        {if (crc8 & 0x80)  //高位為1時需要異或;否則不需要
            {crc8 = (crc8<< 1) ^ FACTOR;  //多項式最高位為1,與數(shù)據(jù)高位1異或為0,所以數(shù)據(jù)左移一位后與多項式低8位異或即可
            }
            else
            {	crc8 = (crc8<< 1);
			}
        }
    }
 
    return crc8;
}

從代碼中可以看出,函數(shù)的入口參數(shù)是一個uint8的指針,以及長度參數(shù)。函數(shù)中會循環(huán)每一個字節(jié),對其進行異或預(yù)算,最終返回crc8的值。

接下來,本文會通過Matlab/Simulink搭建CRC8的算法,并與C代碼進行比較。

3 Matlab/Simulink建模及代碼生成 3.1 Matlab Function建模

m語言和C語言很相似,所以可以通過m語言將算法寫一遍,再嵌入到Matlab Function中,就可以再模型中實現(xiàn)CRC8。

1)新建立一個Matlab Function,配置輸入?yún)?shù)為 arr 和 len,分別代表數(shù)組和長度。
在這里插入圖片描述
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不支持指針,所以第一個參數(shù)arr為數(shù)組(但是可以不定義數(shù)組長度,而是繼承外面輸入的數(shù)組長度),第二個參數(shù)為len。

在M語言中,異或運算符為bitxor(a,b),這點和C語言不同。

3)保存好Matlab Function之后,用常數(shù)簡單測一下;
在這里插入圖片描述
輸入常數(shù)為0x2C,輸出CRC8校驗碼為0xC4,說明算法沒問題。

4)接下來,把輸入輸出替換成port,嘗試生成代碼;
在這里插入圖片描述
這里,Inport1和Inport3分別設(shè)置為長度為1的單變量和長度為2的數(shù)組,是為了測試同樣的CRC校驗算法的Matlab Function在不同長度輸入的情況下,會如何表現(xiàn);

5)將兩個Matlab Function都配置成原子子系統(tǒng),Ctrl + B生成代碼如下;
在這里插入圖片描述
這里由于傳參的長度不同,分別生成了兩個函數(shù)。第一個函數(shù)的第一個參數(shù)是uint8 變量,第二個函數(shù)的第一個參數(shù)是uint8類型數(shù)組。

這里博主認為是Matlab代碼生成工具比較格式化,必須在生成代碼之前就分析好函數(shù)的參數(shù)類型等信息,然后生成固定的傳參形式,而無法生成指針這樣靈活的參數(shù)。這樣就導(dǎo)致了在C語言中一個函數(shù)就搞定的CRC8算法,生成了兩遍,占用了芯片F(xiàn)lash資源。

3.2 For Iteration子系統(tǒng)建模

Simulink中也可以通過For Iteration子系統(tǒng)實現(xiàn)類似于C語言中的for循環(huán),方法如下:

1)首先新建一個for循環(huán)子系統(tǒng),arr端口設(shè)為長度為2的數(shù)組;
在這里插入圖片描述
2)在該層for循環(huán)子系統(tǒng)中,對應(yīng)著對每個字節(jié)的循環(huán)處理,也即上文中while的循環(huán);

在這里插入圖片描述
其中,子系統(tǒng)中嵌套了另一個子系統(tǒng),對應(yīng)于C函數(shù)中的第二層循環(huán) for (i=0; i<8; i++) ;

需要注意的是,該層中的selector模塊用于挑選出數(shù)組中某個索引的元素,而且必須明確數(shù)組的長度。這就導(dǎo)致了不同長度的數(shù)組無法通用該模型。

在這里插入圖片描述

3)第二層循環(huán)中如下所示;
在這里插入圖片描述
這里建模有點復(fù)雜,遠沒有C代碼那么簡潔。而且也沒必要再生成代碼了,因為生成的代碼更加復(fù)雜。而且不同長度的數(shù)組必定要生成不同的函數(shù),甚至在模型層面都無法通用。

4 總結(jié)與思考

本文研究CRC校驗的Simulink模型及其代碼生成,博主認為通過這個例子可以看出,CRC校驗算法不適合用Simulink建模生成代碼,原因如下:

1)Simulink對指針的支持不夠好
通過常規(guī)的建模方式,Simulink難以生成靈活的指針操作?;蛟SSimulink可以通過一些配置,例如修改S Function或者TLC語言生成指針,但是那樣做實在太麻煩了,沒必要花精力鉆研工程軟件的底層實現(xiàn)。

2)處理循環(huán)和數(shù)組比較麻煩
在3.2的例子中,Simulink模型的for子系統(tǒng)遠不如C語言中的for循環(huán)那樣易讀,對于數(shù)組的處理也不夠直觀。

CRC校驗在軟件開發(fā)中更加屬于底層軟件,而不是應(yīng)用層軟件。所以直接通過C語言實現(xiàn)或許是更好的選擇。博主依然嘗試用Simulink的兩種方式實現(xiàn),是希望通過實踐更加直觀地對比出不同方式地優(yōu)劣。

其實很多軟件需求,都不適合用Simulink生成代碼的方式完成(例如自動駕駛感知規(guī)劃),需要根據(jù)需求和工具的特點靈活選取軟件工具。

>>返回個人博客總目錄

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章標題:Simulink建模:CRC校驗?zāi)P?創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article16/coecdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、面包屑導(dǎo)航、用戶體驗、ChatGPT、關(guān)鍵詞優(yōu)化、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化