2017-10-05 132 views
0

我試圖創建一個生成CRC查找表的函數。我正在使用一個8051微控制器,我寧願做表查找方法,但同時我寧願讓我的計算機生成值,然後我可以直接將其加載到微控制器中。 http://www.rajivchakravorty.com/source-code/uncertainty/multimedia-sim/html/crc8_8c-source.html在C中生成的CRC查找表總是給出不同的結果

我只在「主」功能添加

#include <stdio.h> 
#define GP 0x107 
#define DI 0x07 

static unsigned char crc8_table[256]; 
static int made_table=0; 

static void init_crc8() 
{ 
    int i,j; 
    unsigned char crc; 
    if (!made_table) { 
    for (i=0; i<256; i++) { 
     crc = i; 
     for (j=0; j<8; j++) 
     crc = (crc << 1)^((crc & 0x80) ? DI : 0); 
     crc8_table[i] = crc & 0xFF; 
    } 
    made_table=1; 
    } 
} 

void crc8(unsigned char *crc, unsigned char m) 
{ 
    if (!made_table) 
    init_crc8(); 
    *crc = crc8_table[(*crc)^m]; 
    *crc &= 0xFF; 
} 

int main() 
{ 
    unsigned char crc[1]; 
    crc8(crc,'S'); 
    printf("S=%x\n",crc[0]); //different hex code almost every time 
    crc8(crc,'T'); 
    printf("T=%x\n",crc[0]); //different hex code almost every time 
    return 0; 
} 

當我執行該程序,我希望在屏幕上相同的價值觀,但在十六進制代碼後:這其中大部分源代碼已經從借來的在幾乎所有的程序執行中都會打印等號。

我能做些什麼來糾正這個問題?我不想收集不正確的CRC值。

+2

請記住,本地變量(包括數組)在默認* uninitialized *。他們的價值將是*不確定*。現在在'main'函數的'crc'數組的上下文中考慮一下。 –

+0

在不相關的說明中,您應該瞭解運算符'&'的地址。 –

+0

@Somepro:你能否更具體地說'&'? –

回答

0

在main中,crc [0]尚未初始化。因此,在crc8中,表達式(* crc)^ m中的* crc是未初始化的,因此是您的隨機值。

修復:初始化crc [0]。像

unsigned char crc[1] = { 0 }; 
+0

這是行不通的,但我試過的沒有工作是:'crc [0] ='\ 0'; crc [1] ='\ 0';'因爲它給了我一個分段錯誤。我很困惑,爲什麼你的解決方案的工作,但顯然它確實。 – Mike

+0

'crc [1] ='\ 0';'不同於'unsigned char crc [1] = {0};''。前者是越界訪問,因爲它試圖設置'crc []'的_second_元素,但是沒有第二個元素,因爲它是用一個元素聲明的。這樣的訪問應該導致分段錯誤。後者是一個單元素數組的初始化,其中一個值將'crc [0]'設置爲零。 –

0
  1. crc[0]東西是不初始化。在致電crc8()crc之前,您需要crc[0] = 0;*crc = 0;。那麼你將不會從crc[0]的隨機初始內容中得到隨機答案。
  2. 你不需要在crc8()*crc &= 0xff;。如果char是8位,那麼它什麼都不做。如果你有一個奇怪的架構,其中char大於8位,那麼你需要做*crc = crc8_table[((*crc)^m) & 0xff];以確保你不會超出表格的範圍。 (在CRC計算中僅使用m的低8位)。表的內容已被限制爲8位,因此在任何情況下您都不需要最終的& 0xff
  3. 您可能需要一個與零不同的初始值,並且您可能需要排除一個或最終的CRC值,具體取決於您想要的CRC-8的定義。在RevEng catalog of CRC's中,有兩個不反映該多項式的8位CRC。兩者的初始值都是零,但最後還是排除了0x55。此外,您需要的CRC定義可能會反映出來,在這種情況下,移位方向會改變,並且多項式會翻轉。如果您的CRC-8需要與其他軟件互操作,那麼您需要找出正在使用的CRC的完整定義。
  4. 傳遞指針看起來像是一個奇怪的選擇。直接傳遞並返回CRC值會更有效率。例如。 unsigned crc8(unsigned crc, unsigned ch) {,它將ch中的8位應用於CRC crc,並返回新值。請注意,您不需要使CRC值爲char。通常C程序最有效地用作參數和返回。實際上,通常第一個參數是通過寄存器傳遞的,並返回到同一個寄存器中。
  5. 通常在一個由一系列字節組成的消息上計算CRC。使用循環完成整個消息的例程會更高效,因此您不需要檢查消息的每個字節是否已經構建了表。
相關問題