Я работаю над программой на C, которая использует Union. Определение объединения находится в заголовочном файле FILE_A и выглядит следующим образом ...
// FILE_A.h****************************************************
xdata union
{
long position;
char bytes[4];
}CurrentPosition;
Если я установлю значение CurrentPosition.position в FILE_A.c, а затем вызову функцию в FILE_B.c, которая использует объединение, данные в объединении возвращаются к нулю. Это показано ниже.
// FILE_A.c****************************************************
int main.c(void)
{
CurrentPosition.position = 12345;
SomeFunctionInFileB();
}
// FILE_B.c****************************************************
void SomeFunctionInFileB(void)
{
// After the following lines execute I see all zeros in the flash memory.
WriteByteToFlash(CurrentPosition.bytes[0];
WriteByteToFlash(CurrentPosition.bytes[1];
WriteByteToFlash(CurrentPosition.bytes[2];
WriteByteToFlash(CurrentPosition.bytes[3];
}
Теперь, если я передам long в SomeFunctionInFileB (long temp), а затем сохраню его в CurrentPosition.bytes внутри этой функции, и, наконец, вызову WriteBytesToFlash (CurrentPosition.bytes [n] ... это работает просто отлично.
Похоже, что CurrentPosition Union не является глобальным. Поэтому я попытался изменить определение объединения в заголовочном файле, включив в него ключевое слово extern, например ...
extern xdata union
{
long position;
char bytes[4];
}CurrentPosition;
и затем поместить это в исходный файл (.c) ...
xdata union
{
long position;
char bytes[4];
}CurrentPosition;
но это вызывает ошибку компиляции, которая говорит:
C:\SiLabs\Optec Programs\AgosRot\MotionControl.c:76: error 91: extern definition for 'CurrentPosition' mismatches with declaration.
C:\SiLabs\Optec Programs\AgosRot\/MotionControl.h:48: error 177: previously defined here
Так что я делаю не так? Как сделать глобальный союз?