Аргумент type в прототипе для UartWrite не может быть достаточного размера, чтобы содержать значение для вашего глобального. У меня нет прототипа, но для similar функции (разные библиотеки, без сомнения), тип аргумента char
. Если в вашем прототипе также есть char
, то, скорее всего, источником вашей проблемы станет передача значения unsigned int
.
Ниже показан сценарий, в котором функция принимает переменную размер слишком большой для прототипа без ошибок, но может привести к неожиданным результатам:
int func(char a)
{
a = 10000;
return a;
}
int main(void)
{
int a = 10000;
int b;
b = func(a);// note int type, or 10000 does not fit into a char type
// b is returned, but not with the expected value.
printf("%d" b);
return 0;
}
Результаты: б = -24
Опубликовать прототип для UartWrite (???)
;
EDIT (новая информация)
Я нашел this Intel document on a compiler released in 1990, которые могут быть кузеном компилятор вы используете. Посмотрите на разделах, начиная со стр 68:
Каждое глобальное определение символа или ссылки в модуле компиляции имеет атрибут в видимость, которая контролирует, как (или если) оно может ссылаться извне компонента, в котором он определен , Есть пять значений: Возможные значения:
• EXTERNAL - компилятор должен обрабатывать символ , как если бы он был определен в другом компоненте. Для определения это означает, что компилятор должен предположить, что символ будет переопределен (вытеснен) с помощью определения с тем же именем в другим компонентом. См. «Предотвращение символа». Если символ функции 69 имеет внешнюю видимость, то компилятор знает, что он должен называться косвенно и может содержать косвенный вызов.
• ПО УМОЛЧАНИЮ - Другие компоненты могут ссылаться на символ .Кроме того, определение символа может быть переопределено (вытеснено) с помощью определения с тем же именем в другом компоненте.
• PROTECTED - Другие компоненты могут ссылаться на символ, но не могут быть выгружены одним и тем же именем в другом компоненте.
• HIDDEN - Другие компоненты не могут напрямую ссылаться на символ. Однако его адрес может быть передан другим компонентам косвенно (например, в качестве аргумента для вызова функции в другом компоненте или путем сохранения его адреса в позиции элемента данных с помощью функции в другом компоненте) ,
• ВНУТРЕННИЙ - символ не может быть указанным вне его определяющего компонента, либо напрямую, либо косвенно.
Чуть дальше Например:
int i __attribute__ ((visibility("default")));
void __attribute__ ((visibility("hidden"))) x() {...}
extern void y() __attribute__ ((visibilty("protected");
Существует гораздо больше там. Надеюсь это поможет.
Вы попробовали другие ценные бумаги? Если вы переключите значения глобальной и локальной переменных, измените ли они поведение? – mch
Что происходит, если вы меняете строки записи и сначала печатаете глобальные? Whart происходит, если вы перебираете значения так, чтобы глобальное значение 0x12345678? –
Давай - сделаем некоторые отладки. Попробуйте что-нибудь, посмотрите, что произойдет, вместо того, чтобы бесцельно выставить две строки в SO: (( –