Я программирую C на встроенной системе.Архитектура процессора - 32 бита (sizeof(int)
- 32 бита, sizeof(short)
- 16 бит).Существует 32-битная переменная, которая является отображаемым в памяти управляющим регистром (CTRL_REG
), который указан как только используемые младшие 16 битов, и они содержат целочисленное значение со знаком 16 бит (запись в старшие биты не имеет никакого эффекта).Доступ к памяти должен быть выровнен по 32-битной системе, поэтому я не могу просто навести указатель на пару байтов, а также не могу предположить, что они имеют порядок байтов.Я обеспокоен тем, что автоматическое продвижение типов может испортить все, что я храню, расширив бит до 31, а не оставляя его в 15, где я хочу.Каков наилучший способ хранения чего-либо в этом месте?
Вот мой оригинальный код, который, я почти уверен, неверен:
#define CTRL_REG *((volatile unsigned int *)0x4000D008u)
short calibrationValue;
CTRL_REG = -2 * calibrationValue;
Тогда я попробовал это, но я думаю, что этовсе еще может быть предметом целочисленного повышения в точке назначения:
CTRL_REG = (short)(-2 * calibrationValue);
Тогда, наконец, я подумал об этом:
CTRL_REG = (unsigned short)(short)(-2 * calibrationValue);
Я не могу оценить эти варианты очень хорошо, потому что онивсе работает в моих тестах, потому что calibrationValue
оказывается отрицательным (это калибровочный параметр, специфичный для каждого устройства, и поэтому может быть положительным на некоторых устройствах), поэтому после умножения на -2 я в итоге сохраняю положительное значение и, таким образом,на самом деле не сталкивайтесь с проблемой, которую я ожидаю в своих тестах.
Ваша помощь очень ценится, даже если она просто говорит: «Вы слишком много думаете».