2014-09-10 96 views
1

我以前使用Keil編程8051微控制器。出於某種原因,我必須在SDCC中編寫代碼,但是今天我在編譯器中遇到了非常奇怪的行爲。我正在使用代碼塊IDE 12.11和SDCC 3.4版本。奇怪805的sdcc編譯器行爲

我在編譯這段簡單的代碼。

#include <mcs51/8051.h> 
#include "Serial.h" 


unsigned char digits[5]={0}; 

void main(void) 
{ 
    serial_init(-13); 

    digits[2]='a'; 
    serial_send(digits[2]); 
    serial_send('a'); 

    while(1) 
    { 

    } 

} 

這裏是serial_send函數的定義。

void serial_send(unsigned char dat){ 
    while(!TI); 
    TI = 0; 
    SBUF = dat; 
} 

問題是,根據代碼它應該在終端上打印'a'字符兩次,但它只打印一次。 問題出在全局可數字[]數組中。

該函數只適用於常量值,但不適用於基於參數的變量。

我在這裏發佈這個問題,因爲我認爲這個問題是關於一些C語言技巧,我無法弄清楚。

我試過重新安裝編譯器和IDE,但問題依然存在。有些人請解釋爲什麼會發生這種情況。我已經嘗試了不同的代碼,並且在所有代碼中常量和局部變量都可以正常工作,但全局變量提供了奇怪的行爲

+0

您使用哪個8051變體?哪種內存模式? – 2014-09-12 20:34:53

+0

At89c51和小內存模型。 – 2014-09-13 11:50:15

回答

2

檢查您的空while循環while(!TI);沒有被編譯器優化。主代碼含糊不清,因爲您無法確定您實際看到哪個'a'正在發送。

將它們更改爲'b'並嘗試交換兩個serial_send()調用的順序,以驗證它不僅僅是在uart發送當前字節之前SBUF被新數據過早覆蓋的情況。