999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

ARM微控制器快速實現ModBus協議中的CRC校

2016-05-27 08:46:17馮毓春張如芹
單片機與嵌入式系統應用 2016年5期

馮毓春,張如芹

(1.河南宏天實業有限公司,鄭州 450016;2.中原油田分公司天然氣處理廠輕烴站)

?

馮毓春1,張如芹2

(1.河南宏天實業有限公司,鄭州 450016;2.中原油田分公司天然氣處理廠輕烴站)

摘要:通過軟件并行計算來模擬硬件串行電路計算CRC校驗碼的輸出結果,用于提高ModBus通信協議中CRC校驗程序的執行效率,并由高效的ARM匯編語言封裝而成的函數來實現。程序代碼的運行時間和存儲空間均超過常見的高度優化的查表法。

關鍵詞:ARM;ModBus;CRC校驗;并行計算;匯編語言

引言

在現代工業生產中,利用微機進行數據通信的工業控制應用越來越廣泛。隨著網絡技術的發展,大多數的應用系統都需要將生產現場數據采集的資料上傳到上位計算機,以便實現生產的科學調度和安全控制等。生產現場的這些設備雖然由不同的廠家生產和提供,但很多設備都遵循ModBus通信協議,提供了各種設備間互聯互通的基本接口。為保證數據通信的可靠性, ModBus通信協議提供了縱向冗余校驗(LRC)和循環冗余校驗(CRC)[1]兩種數據幀的差錯檢驗方法。實際應用中,CRC校驗的檢錯率非常高[2-3],因而得到廣泛使用。

在很多情況下,CRC計算是靠專用的硬件電路來實現的,但是為了減少元器件數量,并且由此降低由于元器件故障帶來的系統維護工作量,一般低成本的單片機應用系統都不配備專用的CRC校驗的硬件電路,而是趨向于采用軟件的方式來實現CRC檢驗,所以首先要解決的問題就是如何通過軟件高效快速地完成CRC校驗碼的計算問題,也就是CRC算法的問題。

1傳統的實現方法

ModBus通信協議采用CRC16運算方式,其生成多項式G(x)= 1 + x2+x15+x16,在實際使用中,并不需要考慮CRC的最高位,因為它總是被舍棄的,所以只考慮余下的16個數據位。舍棄最高位的1后,多項式對應的二進制表現形式為1000 0000 0000 0101b,即對應的十六進制數值為0x8005。因為ModBus通信協議采用反向的CRC16運算方式,先傳送數據的LSB,最后傳送數據的MSB,所以需要將上面的16位二進制數據反向書寫為1010 0000 0000 0001b,即對應的十六進制值為0xA001。

目前用軟件來實現該CRC算法的主要方式有兩種:按位計算法和查表法。按位計算法通過多次移位和異或運算計算余數來實現,該算法的原理其實就是模擬如圖1所示的串行CRC校驗硬件電路[4-5]原理來實現的,這種算法每次只能處理一位數據,效率低而且運算量大。

為了快速實現CRC,人們自然會想到采用查表格的方法來實現CRC校驗碼的生成[6],查表算法的思路是先離線計算一個字節的數據信息的所有余式,置于一個稱為“余式表”的表格中,供隨時讀取和調用,該表格占用512個字節[6-7]。對于大多數單片機應用系統來說,由于肩負很多的控制和數據采集任務,完成這些任務已經占用了大部分的指令執行時間和程序存儲空間,所以提高整個應用系統的數據處理速度和減少程序代碼就顯得尤為重要。

圖1 串行反向CRC16校驗碼電路原理圖

2快速實現方法概述

采用如圖1所示的基本原理,將一個或兩個字節數據的每個位輸入硬件電路的輸入端后,在時鐘脈沖的作用下,根據該硬件電路的最終運算結果來推導出最終的輸出結果與輸入數據的各數據位的邏輯關系,從而得出CRC校驗碼運算的快速實現公式。以此公式為基礎,單片機可對一個或兩個字節數據為單位并行進行數據處理,可以快速得到CRC校驗碼的運算結果。

從運算的角度看,圖1所示的串行反向CRC16校驗碼電路可以看作是一個除法電路,輸入的數據為被除數,而帶有反饋作用的移位寄存器可視為除數,運算的商被丟棄。數據逐位輸入到電路中進行運算,當數據輸入完成之后16位移位寄存器中的數據就是相對于特定輸入數據流的CRC校驗碼數值[8]。為敘述和分析方便,首先對各操作數據的每個數據位的名稱,按照從CRC_HI (高8位) 和CRC_LO (低8位)的順序及部分參數做如下定義:

① 當前CRC值 = yxwu tsrq hgfe dcba(對應當前CRC校驗碼結果數據的15位→0位)。

② 輸入數據Input = FEDC BA98 7654 3210(對應輸入數據數據的15位→0位)。

③ 表格各個單元格中的字符間的邏輯關系均為異或(XOR)關系,如ab = a XOR b;又如h7g6 = h XOR 7 XOR g XOR 6,其他的各數據項均可參照此例,具有相同的邏輯運算意義。

④ CRC_HI、CRC_LO分別輸出新CRC檢驗碼的高字節和低字節。

CRC校驗碼各個新數據位的所有轉換狀態表略——編者注。下面分別對輸入數據是一個字節和兩個字節數據的情況予以說明。

2.1輸入數據為一個字節

當輸入一個字節數據后,如簡化所得的CRC校驗碼各數據位的書寫字符,特做如下定義:

P = h7g6f5e4d3c2b1a0

(1)

式中的P其實就是CRC_LO與輸入的一個字節數據相異或后所得結果的奇偶標志,可對數據項做如下變換:

g6f5e4d3c2b1a0=h7 XOR h7g6f5e4d3c2b1a0 = h7 XOR P = Ph7

(2)

h7g6f5e4d3c2b1a0q=P XOR q=Pq

(3)

因此,電路中輸入一個字節數據后,新的CRC校驗碼的16個數據位的狀態可表示為:

CRC =PPh7 h7g6 g6f5 f5e4 e4d3 d3c2 c2b1 b1a0y a0x w u t s r Pq

(4)

2.2輸入數據為兩個字節

當輸入兩個字節數據后,為簡化所得的CRC校驗碼的各數據位的書寫字符,特做如下定義:

N = PyFxEwDuCtBsAr9q8

(5)

式中的N實質上是原始CRC校驗碼與輸入的兩個字節數據相異或后所得結果的奇偶標志,由前述可對表格中的數據項做如下變換:

Pb1yFxEwDuCtBsAr9q8=b1 XOR PyFxEwDuCtBsAr9q8 = b1N

(6)

Pa0xEwDuCtBsAr9q8=a0yF XOR PyFxEwDuCtBsAr9q8 = a0yFN

(7)

Pc2yFxEwDuCtBsAr9q8=c2 XOR PyFxEwDuCtBsAr9q8 = c2N

(8)

為方便記憶,將式(6)~(8)中的字符N用字符P來表示,則電路中輸入兩個字節數據后,新的CRC校驗碼的16個數據位的狀態可表示為:

CRC = b1P a0yFP b1yFxE a0xEwD wDuC uCtB tBsA sAr9 r9q8 q8h7 h7g6 g6f5 f5e4 e4d3 d3c2 c2P

(9)

由上面的推導可以得出,當在硬件電路中輸入一個或兩個字節數據后,新的CRC校驗碼的16個數據位的狀態可分別由式(4)或式(9)表示,只要用軟件的方法來模擬這些數據位的生成,就可以得到與硬件電路相一致的運算結果。

3CRC校驗碼的軟件實現

ARM單片機具有高效的指令集[9-10],可以利用該指令集中的移位指令和異或指令來實現CRC校驗碼。下面給出具體的符合ATPCS調用規則的匯編語言源程序:

;程序功能: 計算緩沖區中數據的CRC校驗碼,該校驗碼用于

;ModBus通信協議

;入口條件: 需要操作的數據的地址存放在R0中,數據個數存放

;到R1中

;出口信息: R0中保存的是數據就是新的CRC校驗碼,高位在

;前,低位在后

ModBus_CRC:

PUSH{R4,LR};保存寄存器R4和返回地址

EORSR2,R2 ;異或操作,預先清零CRC數據存放寄存器

MVNSR2,R2 ;將R2內容取反為0xFFFFFFFF

LSRSR3,R1,#1;將需要計算的數據的個數預先初以

;2,以便采用雙字節運算程序

BEQCRC_BYTE;若R1為0,表明只有一個字節數據需

;要計算,跳轉

SUBSR1,#1;數據個數大于1時,預先將個數減1,

;以便控制運算次數

CRC16_NEXT:

LDRHR3,[R0,#0];獲取需要計算的數據到寄存器R3

;中,高16位被清零

EORSR2,R3;R2內容為:yF xE wD uC tB sA r9 q8

;h7 g6 f5 e4 d3 c2 b1 a0

LSLSR3,R2,#1;將R2向左移1位,結果存放到R3

EORSR3,R2;異或,初步得到對應的結果位的狀態

LSRSR4,R3,#2;將R3右移2位,以便判斷相鄰的每4

;位數據的奇偶性

EORSR4,R3;異或,判斷相鄰的每4位數據的奇偶

;性,結果暫存于R4中

LSLSR2,R2,#14;將R2中的最低兩位b1、a0移到15、

;14位,順便將其低位全部清零

EORSR3,R2;將b1、a0位異或到R3寄存器中的

;15、14位上

UXTHR3,R3;將R3的高16位數據清零

LSRSR3,R3,#2;將R3的內容右移2位,即將R3的第

;15,14位預先清零

EORSR3,R2;再次將b1、a0位異或到R3的第15、

;14位

LSRSR2,R4,#4;右移4位,準備判斷相鄰的每8位的

;數據的奇偶性

EORSR2,R4;異或,判斷相鄰的每8位的奇偶性

LSRSR4,R2,#8;右移8位,準備判斷整個16位數據

;的奇偶性[11]

EORSR2,R4;異或,得到數據的奇偶位P,R2的最

;低兩位狀態為P yFP

LSLSR2,R2,#14;現在R2中的第15、14位上為P

;yFP,其余低位為0

EORSR3,R2;將所得的奇偶標志位的狀態異或到R3

UXTHR3,R3;將R3的高16位數據清零

LSRSR2,R3,#15;將R3中的第15位b1P右移到0位

;上,并將結果存放到R2中

EORSR2,R3;將b1P異或到R2的最低位,得到本

;次運算的結果

ADDSR0,#2;指向下一個需要計算的數據的存放

;位置

SUBSR1,#2;數據個數計數單元減2

BHICRC16_NEXT;未處理完成時返回,繼續處理一下個

;數據

BNE RESULT_CRC;標志位C為0,表明參與計算的數據

;個數是偶數

CRC_BYTE:

UXTHR2,R2;R2的高16位設置為0,只保存R2低

;16位中的CRC數值

LDRBR3,[R0,#0];讀取需要計算的數據到寄存器R3

;中,高24位被清零

EORSR2,R3;R2高位保持不變,低位內容為: h7

;g6 f5 e4 d3 c2 b1 a0

LSLSR3,R2,#1;將R2內容左移一位,結果存放到R3

EORSR3,R2;此時R3的低8位狀態為:h7g6 g6f5

;f5e4 e4d3 d3c2 c2b1 b1a0 a0

UXTBR3,R3;R3高24位清零,保留低8位:h7g6

;g6f5 f5e4 e4d3 d3c2 c2b1 b1a0 a0

LSRSR4,R3,#2;R3內容右移2位,準備判斷相鄰的

;每4位的數據的奇偶性

EORSR4,R3;異或,判斷相鄰的每4BIT的奇偶性

LSLSR3,R3,#6;R3的低16位為:0 0 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0 a0 0 0 0 0 0 0

LSRSR2,R2,#8;R2的低16位為:0 0 0 0 0 0 0 0 y x

;w u t s r q

EORSR3,R2;R3低16位的內容:0 0 h7g6 g6f5 ;f5e4 e4d3 d3c2 c2b1 b1a0y a0x wutsrq

LSRSR2,R4,#4;準備判斷相鄰的每8位的數據的奇

;偶性

EORSR2,R4;異或,判斷相鄰的每8BIT的奇偶性,

;此時R4的最低兩位為P、Ph7

LSLSR2,R2,#14;將P、Ph7右移到R2的第15、14兩位

;上,低位清零

EORSR2,R3;R2中低16位為:P Ph7 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0y a0x w u t s r q

UXTHR2,R2;R2的高16位設置為0,只保存R2中

;低16位

LSRSR3,R2,#15;將R2中位于15位上的奇偶標志P

;左移到最低位,結果存放到R3中

EORSR2,R3

;R2中低16位狀態為:P Ph7 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0y a0x w u t s r Pq

RESULT_CRC:

UXTHR0,R2;將處理結果存放到R0,以便得到

;正確的返回值

POP {R4,PC};出棧,設置返回地址到PC

ARM微控制器的開發一般采用集成開發環境,為方便使用,可以將上面的子程序封裝成符合集成開發環境調用規則的函數。這里假定封裝好的函數名為ModbusCRC,為測試該函數與采用傳統查表法的C語言函數的對比性能,在KEIL MDK-ARM集成開發環境下[12],按下Alt+F7快捷按鍵,將當前項目的C/C++ 選項卡中的Optimizations設置為Level3(-03),勾選Optimize for Time,以便最大限度地減少C語言函數的代碼長度和運行時間。C語言函數可從http://www.freemodbus.org網站下載。函數的性能對比數據可從表1中查看。

表1 CRC校驗碼生成函數性能對比表

結語

通過分析串行硬件CRC校驗碼電路的數據轉換狀態,得出了其在輸入一個或兩個字節數據后的電路輸出狀態。采用并行計算的方法,一次處理一個或兩個字節數據,實現了用軟件的方法來模擬該硬件電路的輸出狀態。從表1可以看出,由ARM微控制器匯編語言實現的CRC校驗碼生成函數,不但運行速度比傳統的查表函數快,而且程序存儲空間不到查表函數的20%,在不損失速度優勢的前提下,極大地節省了存儲空間。該快速實現方法已用于實際項目,具有很強的實用性,值得推廣應用。

編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。

參考文獻

[1] 王新梅,肖國鎮.糾錯碼—原理與方法(修訂版)[M].西安:西安電子科技大學出版社,2001.

[2] 譚明新,李瑞.CRC檢錯探究[J].科技創業,2006(11):197-199.

[3] 張平安.16位循環冗余校驗碼(CRC)的原理和性能分析[J].山西科技,2005(5):123-125.

[4] 彭偉.嵌入式系統CRC循環冗余校驗算法設計研究[J].南京信息工程大學學報:自然科學版,2012,4(3):258-265.

[5] 姚威.循環冗余校驗碼并行算法的研究與實現[J].計算機與數字工程,2006,34(9):112-114.

[6] 孟開元.MODBUS通信協議中CRC校驗的快速C語言算法[J].福建電腦,2004(11):63-64.

[7] 張莉麗,張振權,劉仁.CRC查表生成算法匯編的實現及其優化[J].石油化工自動化,2005(4):37-39.

[8] 劉星華.CRC校驗在單片機系統中的軟件快速實現[J].福建工程學院學報,2007,5(1):76-78.

[9] ARM.Cortex-M0 Technical Reference Manual(Revision: r0p0),2009.

[10] Joseph Yiu.ARM Cortex-M3權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009.

[11] Henry SWarren Jr.高效程序的奧秘[M].馮速,譯.北京:機械工業出版社,2004.

[12] 李寧.ARM MCU開發工具MDK使用入門[M].北京:北京航空航天大學出版社,2012.

馮毓春(工程師),主要從事工業儀器儀表的研究與設計工作;張如芹(工程師),主要從事油田天然氣處理裝置中自動化儀表的研究與改進工作。

Feng Yuchun1,Zhang Ruqin2

(1.Henan Hongtian Industrial Co.,Ltd.,Zhengzhou 450016,China;2.Zhongyuan Oil of Natural Gas Processing Plant Field)

Abstract:The parallel computing of the software is used to simulate the hardware serial circuit to calculate the output results of CRC checksum,which can improve the execution efficiency of the CRC checksum procedure in the ModBus communication protocol.That is achieved by the functions which are packaged by the efficient ARM assembly language.The running time and memory space of the program code are better than the common look-up table method highly optimized.

Key words:ARM;ModBus;CRC checking;parallel computing;assembly language

收稿日期:(責任編輯:楊迪娜2015-11-25)

中圖分類號:TP313

文獻標識碼:A

主站蜘蛛池模板: 国产91小视频在线观看| 999精品免费视频| 视频二区亚洲精品| 色综合综合网| 色噜噜狠狠狠综合曰曰曰| 欧美a级完整在线观看| 青青草国产在线视频| 成人亚洲国产| 极品国产一区二区三区| 亚洲成aⅴ人在线观看| 天天综合网在线| 国产日产欧美精品| 成年A级毛片| 久久国产热| 一级片免费网站| 久久99国产综合精品1| 国产成人无码AV在线播放动漫| 日韩在线欧美在线| 亚洲精品色AV无码看| 欧美亚洲另类在线观看| 97se亚洲综合| 97国产精品视频人人做人人爱| 亚洲成A人V欧美综合| 亚洲av无码成人专区| 亚洲国产精品VA在线看黑人| 少妇精品在线| 狠狠色综合网| 综合色88| 欧洲亚洲欧美国产日本高清| 国产91蝌蚪窝| 久久99热这里只有精品免费看| 日韩 欧美 国产 精品 综合| 欧美成在线视频| 久久久波多野结衣av一区二区| 国产黑丝一区| 久久青草精品一区二区三区| 国产精品自在拍首页视频8| 国产亚洲精品自在线| 97久久超碰极品视觉盛宴| 无码专区在线观看| 欧美日韩一区二区在线播放| 波多野结衣无码中文字幕在线观看一区二区 | 国产精品冒白浆免费视频| 国产一级毛片yw| 免费一极毛片| 日韩在线永久免费播放| a毛片免费看| 国产成人亚洲综合A∨在线播放| 中文字幕欧美日韩高清| 中文字幕亚洲精品2页| 一级毛片在线免费看| 欧美成人精品在线| 2021国产乱人伦在线播放| 国产麻豆福利av在线播放 | 国产不卡一级毛片视频| 日韩欧美中文字幕一本| 国产欧美中文字幕| 国产美女91视频| 黄色网站不卡无码| 亚洲香蕉在线| www.99在线观看| 国产精品视频a| av在线人妻熟妇| 中文字幕有乳无码| 老色鬼久久亚洲AV综合| 国产aⅴ无码专区亚洲av综合网| 无码专区在线观看| 9久久伊人精品综合| 亚洲水蜜桃久久综合网站| 亚洲免费三区| 草逼视频国产| 人人爽人人爽人人片| 亚洲成人网在线观看| 美女亚洲一区| 免费高清a毛片| 日韩天堂视频| 国产高清免费午夜在线视频| 五月婷婷导航| 呦系列视频一区二区三区| 久久久受www免费人成| 亚洲综合久久成人AV| 一级全黄毛片|