天天看點

STM8遇到的一些小問題

1.編譯器優化的問題

定義的局部變量如果後續沒有用,會被編譯器優化掉,如:

{

     u32 va = 100;

    va = 200;

  //些處放斷點 ,檢視一下va的值,會發現根本不對。

STM8遇到的一些小問題

}

如何避免優化?

{

    __IO u32 va = 100;

    va = 200;

//此處放斷點,看一下值已經正常了。

STM8遇到的一些小問題

}

__I  、__O 、 __IO的宏定義如下:

STM8遇到的一些小問題

2. char類型會被當成unsigned char, 導緻計算結果出錯

{

char va = -40;

//這裡放斷點,看一下va的值 如下:

STM8遇到的一些小問題

}

這是因為負數變成無符号數時,在記憶體中是其反碼+1

-40 二進制為:  1010 1000

      反碼為:    1101 0111

      補碼為:     1101 1000    ——>   216

是以被當成是unsiged char 時會是216,顯然會導緻計算出錯。

如何解決?

{

int8_t va = -40;

//放斷點看一下:

STM8遇到的一些小問題

}

int8_t定義如下:

STM8遇到的一些小問題

就是說申明char類型時,一定要寫成signed char 不然會被編譯器認為是unsigned char

這點與我們在linux開發中是有差別的。