STM8遇到的一些小问题

1.编译器优化的问题

定义的局部变量如果后续没有用,会被编译器优化掉,如:

{

     u32 va = 100;
    va = 200;

  //些处放断点 ,查看一下va的值,会发现根本不对。

STM8遇到的一些小问题_第1张图片

}

如何避免优化?

{

    __IO u32 va = 100;
    va = 200;

//此处放断点,看一下值已经正常了。

}

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

 

2. char类型会被当成unsigned char, 导致计算结果出错

{

char va = -40;

//这里放断点,看一下va的值 如下:

}

这是因为负数变成无符号数时,在内存中是其反码+1

-40 二进制为:  1010 1000

      反码为:    1101 0111

      补码为:     1101 1000    ——>   216

所以被当成是unsiged char 时会是216,显然会导致计算出错。

如何解决?

{

int8_t va = -40;
//放断点看一下:

}

int8_t定义如下:

就是说申明char类型时,一定要写成signed char 不然会被编译器认为是unsigned char

这点与我们在linux开发中是有区别的。

你可能感兴趣的:(mcu,stvd,嵌入式)