Вступить в клуб →
средняявопросБиты, целые типы и арифметика на МК

Код маски прерываний перенесли со STM32 на AVR, и маска стала неверной

Функция отлично работала на STM32. После переноса на ATmega (avr-gcc) маска для битов старше 15-го всегда получается неверной:

uint32_t irq_mask(unsigned bit) {
    return 1 << bit;   /* bit = 0..31 */
}

Компилятор при константном bit = 20 пишет left shift count >= width of type. Что исправить?

  • Писать 1UL << bit, чтобы сдвигать 32-битное
  • Писать (uint32_t)(1 << bit) для приведения
  • Заменить сдвиг умножением 1 * 2 ^ bit
  • Объявить параметр bit как uint32_t

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела