Как вы переводите один байт в слово в C для Cortex? - PullRequest
2 голосов
/ 25 июня 2011

Не прибегая к объединению typedef, есть ли рабочий макрос для Cortex-M0 в C, где он копирует байтовые данные в слово в пределах от 31 до 23.

Я получил данные из spi и мне нужно скопировать эти данные в слово.

SRAM не работает с битовыми манипуляциями, поэтому я использую «Как вы устанавливаете, очищаете и переключаете один бит в C?» а как же байт.

спасибо

Riscy

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

pmg ответ будет работать только в том случае, если первые 9 бит уже равны нулю.Если были установлены какие-то биты, ваши данные получат ORed вместе с ними.Итак, чтобы убедиться, что вам нужно сначала очистить эти биты:

#define POS   23          // position at which to insert data
#define MASK  ((1UL<<9)-1)  // mask of nine 1s

word = (word & ~(MASK<<POS)) | ((data9 & MASK) << POS));

Первая часть сместит маску в целевую позицию, а затем инвертирует ее, так что вы получите нули в целевых старших битах идля остальной части слова, поэтому операция AND удалит первые 9 бит и оставит младшие биты без изменений.Вторая часть убедится, что у нас установлено только 9 битов, а затем сместит их в целевую позицию.Наконец, две части будут объединены с операциями ИЛИ, и из-за маскировки они не будут мешать.

2 голосов
/ 25 июня 2011

Попробуйте это

word &= ~0xFF800000U; /* clear bits 23 - 31; thanks to Igor Skochinsky */
word |= ((byte << 23) & 0xFF800000U);

Он сдвигает (9-битное) byte значение на 23 бита и or s его на значение в word, гарантируя, что затронуты только биты 23-31.

0 голосов
/ 27 июня 2014

Специально для байта вы можете использовать инструкции по сборке

  • UXTB, чтобы извлечь биты 0-7 из регистра, а затем
  • LSLS, чтобы сдвинуть его влево до места, где выхотите.

Конечно, вам нужно будет выполнять операции загрузки и хранения.Но вы уже будете знать это.

...