我正在使用16位处理器,因此我的大多数数据都是16位,除非必要.
如果我有两个16位变量a并将b它们加在一起形成一个32位变量,那么编译器会做什么?
uint16_t x, y;
uint32_t z;
x = 65504;
y = 65503;
z = x + y;
Run Code Online (Sandbox Code Playgroud)
z中的结果是否相同z = (uint32_t)x + (uint32_t)y,或者我是否需要转换结果?
我已经在我的编译器上尝试了这个,并且转换似乎没有任何区别,但这可能只是这个小嵌入式处理器的编译器奇怪.
我一直在努力将同事的软件库集成到我们的大型应用程序中。他一直在写作和下测试他的图书馆-O0上gcc 4.9.3。这是用于警报系统的嵌入式软件。该错误是在-Os优化条件下观察到的,我们也在上使用了直接C语言(没有C ++废话)gcc 4.9.3。该体系结构是ARM Cortex-M4F。
我在将该代码集成到较大的堆栈中时遇到问题。以下代码最多应进行迭代,GLOBAL_MAX_DEVICES直到在表中找到可用空间以插入其条目为止:
RET_VALUES DEVICE_Add_To_New_Table( uint8_t *new_id, uint16_t unique_id )
{
RET_VALUES ret_value = RET_OK;
uint8_t pos = 0;
[...]
else
{
debug_print( "A,", true, DEBUG_DEVELOP_MODE_PLAIN, DEBUG_TRACE );
// See if the unique_id is already in the table (relearn)
while(( unique_id != DEVICE_new_table.unique_id[pos] ) && ( pos < GLOBAL_MAX_DEVICES ))
{
debug_print( "B,", false, DEBUG_DEVELOP_MODE_PLAIN, DEBUG_TRACE );
pos++;
}
[...]
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题是,它不是循环迭代GLOBAL_MAX_DEVICES次数(当前为13),而是迭代200多次。序列“ B”在while(( unique_id != …
在为使用GCC编译的小型ARM处理器编写软件时,我遇到了一个怪癖.处理器没有硬件分区引擎,因此分区是用软件实现的.
以下代码复制了行为,volatile语句用于避免优化:
volatile int32_t x = -4000;
volatile uint32_t y = 4;
volatile int32_t z = x / y;
uart_printf(DBG_LVL_INFO, "%d / %d = %d\r\n", x, y, z);
Run Code Online (Sandbox Code Playgroud)
为z打印的结果是1073740824,但我希望得到的结果-1000.
类型混合似乎很关键.替换uint32_twith int32_t可以解决bug.
-1000错误地解释为无符号整数不会产生结果,有趣地看起来等于结果加上2 30.
这是一个错误,还是只是定义了行为?