我已经找到了我的问题的解决方案,但是,我不明白为什么这是一个问题,我想我会在这里要求更好地理解事情。
我已经在Atmel Studio 7中开发了一个atmega微应用程序。我用c ++编写的这个项目只是作为一个实验以相当安全的方式编写的。以前的嵌入式项目纯粹是在C语言中。无论如何,我正在编写应用程序的单元测试,我发现之前已经过去的测试现在已经失败了。情况:
有5个感兴趣的文件:
main.cpp
constants.h
UART.cpp
UART.h
UART_tests.h
在main.cpp中我声明了一个常数:
const unsigned long SERIAL_NUMBER = 0x00123456;
在constants.h中我将此变量作为extern:
extern const unsgigned long SERIAL_NUMBER
在UART_tests.h中我有这样的测试:
ASSERT_EQUALS("\t\tHB", ((byte)(SERIAL_NUMBER >> 24)), mResponseBuffer[6])
ASSERT_EQUALS("\t\tMHB", ((byte)((SERIAL_NUMBER & 0x00FF0000) >> 16)), mResponseBuffer[7])
ASSERT_EQUALS("\t\tMLB", ((byte)((SERIAL_NUMBER & 0x0000FF00) >> 8)), mResponseBuffer[8])
ASSERT_EQUALS("\t\tLB", ((byte)(SERIAL_NUMBER & 0x000000FF)), mResponseBuffer[9])
ASSERT_EQUALS测试看起来像:
#define ASSERT_EQUALS(TEST, A, B) if(A != B){ \
sprintf(buffer, equals, TEST, A, B); \
UART_writeStringPolling(buffer); \
test = false;}
用equals string作为:
const char equals[] = "%s expected %02d got %02d\r\n";
mResponseBuffer填充在我正在测试感兴趣的语句的函数中:
case GET_SERIAL_NUMBER:
buildResponse(SERIAL_NUMBER);
sendResponse();
break;
...
bool buildResponse(const unsigned long b)
{
byte b1, b2, b3, b4;
b4 = (byte)b;
b3 = (byte)(b >> 8);
b2 = (byte)(b >> 16);
b1 = (byte)(b >> 24);
if(mResponseSize >= UART_BUFFER_SIZE-4)
return false;
mResponseBuffer[++mResponseSize] = b1;
mResponseBuffer[++mResponseSize] = b2;
mResponseBuffer[++mResponseSize] = b3;
mResponseBuffer[++mResponseSize] = b4;
return true;
}
所以现在所有这些设置完成我遇到的问题是放在mResponseBuffer中的值不是SERIAL_NUMBER的实际值!实际上我的调试器甚至报告了SERIAL_NUMBER的错误值!所以测试会失败,我会得到一条消息:
Testing GET_SERIAL_NUMBER:
HB expected 00 got 03
MHB expected 18 got 24
MLB expected 52 got 00
LB expected 86 got 05
Test Failed
预期值是正确的!但是,即使调用此命令,调试器也会显示SERIAL_NUMBER的错误值。因此,似乎extern不仅被错误地解决,而且取决于代码中的位置不同!
解决方案是从main.cpp中取出SERIAL_NUMBER的声明并将其放在constants.h中。最后,我的问题是为什么?