• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      ARM微控制器快速實現(xiàn)ModBus協(xié)議中的CRC校

      2016-05-27 08:46:17馮毓春張如芹
      關鍵詞:并行計算匯編語言

      馮毓春,張如芹

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

      ?

      馮毓春1,張如芹2

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

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

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

      引言

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

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

      1傳統(tǒng)的實現(xiàn)方法

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

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

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

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

      2快速實現(xiàn)方法概述

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

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

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

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

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

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

      CRC校驗碼各個新數(shù)據(jù)位的所有轉(zhuǎn)換狀態(tài)表略——編者注。下面分別對輸入數(shù)據(jù)是一個字節(jié)和兩個字節(jié)數(shù)據(jù)的情況予以說明。

      2.1輸入數(shù)據(jù)為一個字節(jié)

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

      P = h7g6f5e4d3c2b1a0

      (1)

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

      g6f5e4d3c2b1a0=h7 XOR h7g6f5e4d3c2b1a0 = h7 XOR P = Ph7

      (2)

      h7g6f5e4d3c2b1a0q=P XOR q=Pq

      (3)

      因此,電路中輸入一個字節(jié)數(shù)據(jù)后,新的CRC校驗碼的16個數(shù)據(jù)位的狀態(tài)可表示為:

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

      (4)

      2.2輸入數(shù)據(jù)為兩個字節(jié)

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

      N = PyFxEwDuCtBsAr9q8

      (5)

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

      Pb1yFxEwDuCtBsAr9q8=b1 XOR PyFxEwDuCtBsAr9q8 = b1N

      (6)

      Pa0xEwDuCtBsAr9q8=a0yF XOR PyFxEwDuCtBsAr9q8 = a0yFN

      (7)

      Pc2yFxEwDuCtBsAr9q8=c2 XOR PyFxEwDuCtBsAr9q8 = c2N

      (8)

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

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

      (9)

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

      3CRC校驗碼的軟件實現(xiàn)

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

      ;程序功能: 計算緩沖區(qū)中數(shù)據(jù)的CRC校驗碼,該校驗碼用于

      ;ModBus通信協(xié)議

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

      ;到R1中

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

      ;前,低位在后

      ModBus_CRC:

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

      EORSR2,R2 ;異或操作,預先清零CRC數(shù)據(jù)存放寄存器

      MVNSR2,R2 ;將R2內(nèi)容取反為0xFFFFFFFF

      LSRSR3,R1,#1;將需要計算的數(shù)據(jù)的個數(shù)預先初以

      ;2,以便采用雙字節(jié)運算程序

      BEQCRC_BYTE;若R1為0,表明只有一個字節(jié)數(shù)據(jù)需

      ;要計算,跳轉(zhuǎn)

      SUBSR1,#1;數(shù)據(jù)個數(shù)大于1時,預先將個數(shù)減1,

      ;以便控制運算次數(shù)

      CRC16_NEXT:

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

      ;中,高16位被清零

      EORSR2,R3;R2內(nèi)容為:yF xE wD uC tB sA r9 q8

      ;h7 g6 f5 e4 d3 c2 b1 a0

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

      EORSR3,R2;異或,初步得到對應的結(jié)果位的狀態(tài)

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

      ;位數(shù)據(jù)的奇偶性

      EORSR4,R3;異或,判斷相鄰的每4位數(shù)據(jù)的奇偶

      ;性,結(jié)果暫存于R4中

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

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

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

      ;15、14位上

      UXTHR3,R3;將R3的高16位數(shù)據(jù)清零

      LSRSR3,R3,#2;將R3的內(nèi)容右移2位,即將R3的第

      ;15,14位預先清零

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

      ;14位

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

      ;數(shù)據(jù)的奇偶性

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

      LSRSR4,R2,#8;右移8位,準備判斷整個16位數(shù)據(jù)

      ;的奇偶性[11]

      EORSR2,R4;異或,得到數(shù)據(jù)的奇偶位P,R2的最

      ;低兩位狀態(tài)為P yFP

      LSLSR2,R2,#14;現(xiàn)在R2中的第15、14位上為P

      ;yFP,其余低位為0

      EORSR3,R2;將所得的奇偶標志位的狀態(tài)異或到R3

      UXTHR3,R3;將R3的高16位數(shù)據(jù)清零

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

      ;上,并將結(jié)果存放到R2中

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

      ;次運算的結(jié)果

      ADDSR0,#2;指向下一個需要計算的數(shù)據(jù)的存放

      ;位置

      SUBSR1,#2;數(shù)據(jù)個數(shù)計數(shù)單元減2

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

      ;數(shù)據(jù)

      BNE RESULT_CRC;標志位C為0,表明參與計算的數(shù)據(jù)

      ;個數(shù)是偶數(shù)

      CRC_BYTE:

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

      ;16位中的CRC數(shù)值

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

      ;中,高24位被清零

      EORSR2,R3;R2高位保持不變,低位內(nèi)容為: h7

      ;g6 f5 e4 d3 c2 b1 a0

      LSLSR3,R2,#1;將R2內(nèi)容左移一位,結(jié)果存放到R3

      EORSR3,R2;此時R3的低8位狀態(tài)為: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內(nèi)容右移2位,準備判斷相鄰的

      ;每4位的數(shù)據(jù)的奇偶性

      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位的內(nèi)容:0 0 h7g6 g6f5 ;f5e4 e4d3 d3c2 c2b1 b1a0y a0x wutsrq

      LSRSR2,R4,#4;準備判斷相鄰的每8位的數(shù)據(jù)的奇

      ;偶性

      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

      ;左移到最低位,結(jié)果存放到R3中

      EORSR2,R3

      ;R2中低16位狀態(tài)為:P Ph7 h7g6 g6f5 f5e4

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

      RESULT_CRC:

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

      ;正確的返回值

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

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

      表1 CRC校驗碼生成函數(shù)性能對比表

      結(jié)語

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

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

      參考文獻

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

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

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

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

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

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

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

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

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

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

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

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

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

      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

      猜你喜歡
      并行計算匯編語言
      高等學校計算機專業(yè)課程教學改革實踐——以匯編語言與接口技術課程為例
      計算機教育(2020年5期)2020-07-24 08:52:50
      匯編語言與C語言的混合程序設計技術研究
      電子制作(2019年10期)2019-06-17 11:45:16
      提高《匯編語言程序設計》教學效率的思考與實踐
      云計算中MapReduce分布式并行處理框架的研究與搭建
      矩陣向量相乘的并行算法分析
      并行硬件簡介
      基于Matlab的遙感圖像IHS小波融合算法的并行化設計
      科技視界(2016年11期)2016-05-23 08:13:35
      匯編語言指令系統(tǒng)教學中應該重視的兩個方面問題
      长宁县| 方城县| 霍邱县| 八宿县| 临汾市| 嵊州市| 广州市| 陆丰市| 东光县| 濉溪县| 阳东县| 新平| 八宿县| 乌恰县| 呼图壁县| 裕民县| 资阳市| 鹤峰县| 寿光市| 常宁市| 江西省| 平遥县| 鄂州市| 泗阳县| 陇南市| 民权县| 奈曼旗| 湘潭县| 西平县| 松原市| 射洪县| 额尔古纳市| 江华| 呼玛县| 苍梧县| 深泽县| 泉州市| 嘉黎县| 阜新市| 原平市| 庆阳市|