CRC校驗編程和硬件快速校驗探討
2 嵌入式系統(tǒng)CRC校驗的編程
如上所述,k+r位的被模除數(shù)采用右移的方法不斷地同反序的約定多項式對位模除,也就遵從了從高位向低位不斷減余的除法規(guī)則。但由于不必求模除的商,因此只要將被模除數(shù)不斷地右移位,與去掉最高位的反序約定多項式模減,求得余數(shù)即可。
但如果被模除數(shù)最低位右端的移出位是O,則無論從左端添進多少個O,也不夠模除約定多項式(其隱含的最高位是1)。在此情況下該位的商是O,余數(shù)不變,不應(yīng)再同約定多項式對位模減,而要繼續(xù)左添O右移位,直到當前余數(shù)(被模除數(shù))右移出的位值為1才夠模除(商1),才可將余數(shù)再對位模減一次多項式。由此看出,將約定多項式去掉最高位,可以使模減(異或)的計算位數(shù)r減少(一般r都正好是1字節(jié)位數(shù)的整數(shù)倍)。
由于被模除數(shù)是k+r位的,因此總共需要右移k位,即左添進尼個O,才能模除到最低位結(jié)束。得到的余數(shù)最多是r位(約定多項式為r+1位),再將它異或人一個新數(shù)據(jù),作為新的被模除數(shù)。
每異或進一個數(shù)據(jù),求新一輪CRC碼,都只進行走(字節(jié)數(shù)據(jù)是一8)次的右移和一般都少于是次的模減(異或)運算,而且模減的中間差值無需保留(后值覆蓋前值)。因此CRC碼生成的運算過程,就是右移位、判斷移出位為1則同多項式模減(C語言不能對移出位檢測,需將余數(shù)備份后同0xol相“與”)、差值回存后再右移的是次循環(huán)過程,如圖1所示。之后,再異或進下一個數(shù)據(jù)(該步與查表法一致)。編程得當?shù)脑掃\算量很小。
筆者用51匯編語言編寫(2R(:一8校驗程序,算得1字節(jié)數(shù)據(jù)的CRC碼,只需64~80個機器周期,只多用1字節(jié)RAM單元(CR(:一16校驗多用2字節(jié),時間加倍)來存儲余數(shù),即下一次的被模除數(shù)(不斷覆蓋上一次已無用的)。因此,完全可以直接運算,而不必存儲大量的數(shù)據(jù)表格。C語言編程,要考慮語句代碼的優(yōu)化以及只定義使用int和char型局部變量,以免耗時和占用RAM單元太多。
接收方對于最后收到的r位CRC校驗碼,不需要再納入模除而使最終余數(shù)為O,只需同信息數(shù)據(jù)的模除余數(shù)比較,相等則確定通信正確。這樣可以減少模除循環(huán)次數(shù),節(jié)省時間。
c語言相關(guān)文章:c語言教程
分頻器相關(guān)文章:分頻器原理
評論