C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Встраиваемый C

Тест проверяет C на границе с аппаратурой: регистры ввода-вывода, отображённые в память, обработчики прерываний, ограниченную память, худшее время выполнения, аппаратную диагностику и безопасное поведение при отказе или обновлении прошивки.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Зачем указатель на регистр устройства с отображением в память объявляют `volatile`?
CC17
#define STATUS (*(volatile const uint32_t*)0x40001000u)
Вопрос 2 из 30
Чем опасна очистка регистра с очисткой записью единицы (`write-one-to-clear`) через `REG |= FLAG`?
CC17
REG |= FLAG; /* ошибочная операция чтение–изменение–запись для W1C-регистра */
Вопрос 3 из 30
Почему следует сохранять чтение статусного регистра в локальную переменную?
CC17
uint32_t status=STATUS_REG;
if(status&RX_READY) ...
Вопрос 4 из 30
Как обновить отдельное поле обычного регистра, сохранив остальные биты?
CC17
uint32_t r=CTRL;
r=(r&~MODE_MASK)|((mode<<MODE_SHIFT)&MODE_MASK);
CTRL=r;
Вопрос 5 из 30
Чего не гарантирует `volatile` при работе с MMIO?
Вопрос 6 из 30
Почему ISR должна быть короткой?
CC17
void uart_isr(void){
  uint8_t b=UART_DATA;
  ring_put_isr(b);
  UART_STATUS=RX_FLAG;
}
Вопрос 7 из 30
Какой риск создаёт общий 32-битный счётчик на восьмибитном микроконтроллере?
CC17
volatile uint32_t ticks;
void isr(void){ ticks++; }
uint32_t now=ticks;
Вопрос 8 из 30
Почему динамическое выделение памяти внутри обработчика прерывания плохо сочетается с жёсткими требованиями реального времени?
CC17
void timer_isr(void){
  event *e=malloc(sizeof *e); /* непредсказуемо */
}
Вопрос 9 из 30
Как основной цикл должен получать события из кольцевого буфера, который заполняет ISR?
CC17
buffer[head]=event;
/* барьер/атомарная публикация по платформе */
head=next;
Вопрос 10 из 30
Что нужно сделать с источником прерывания до выхода из ISR?
Вопрос 11 из 30
Почему частые `malloc` и `free` блоков разных размеров опасны при малом объёме RAM?
Вопрос 12 из 30
Какой дефект в статическом кольцевом буфере?
CC17
uint8_t buf[N];
size_t head;
void put(uint8_t x){ buf[head++]=x; }
Вопрос 13 из 30
Что полезного о RAM показывает карта компоновки прошивки?
Вопрос 14 из 30
Почему большой автоматический массив внутри глубокой функции опасен?
CC17
void process(void){
  uint8_t frame[4096];
  ...
}
Вопрос 15 из 30
Как обработать сообщение переменной длины при жёстком ограничении RAM?
Вопрос 16 из 30
Почему среднее время 1 мс не доказывает выполнение дедлайна 5 мс?
Вопрос 17 из 30
Какая последовательность событий создаёт инверсию приоритетов?
Вопрос 18 из 30
Почему цикл ожидания без верхней границы недопустим на критическом пути?
CC17
while(!(STATUS&READY)) { }
Вопрос 19 из 30
Что лучше уменьшает дрейф периодической задачи: задержка после работы или расписание по абсолютным моментам?
Вопрос 20 из 30
Что нужно оценить перед запретом прерываний вокруг критической секции?
CC17
disable_irq();
update_shared_state();
enable_irq();
Вопрос 21 из 30
Как найти, почему прошивка перестала помещаться во Flash?
CАнализ образа
arm-none-eabi-size firmware.elf
arm-none-eabi-nm --size-sort firmware.elf | tail
Вопрос 22 из 30
Зачем смотреть дизассемблирование функции, работающей с MMIO?
CАнализ образа
arm-none-eabi-objdump -dS firmware.elf > firmware.lst
Вопрос 23 из 30
Когда логический анализатор полезнее диагностического `printf`?
Вопрос 24 из 30
Что даёт аппаратная точка наблюдения JTAG?
Вопрос 25 из 30
Почему отладка оптимизированной прошивки отличается от сборки `-O0`?
Вопрос 26 из 30
В какой момент правильно обслуживать сторожевой таймер?
CC17
if(sensor_ok && control_loop_advanced && comms_ok) watchdog_kick();
Вопрос 27 из 30
Как сделать обновление прошивки устойчивым к потере питания?
Вопрос 28 из 30
Почему прямая запись структуры в EEPROM через `memcpy` создаёт проблему переносимости?
CC17
memcpy(eeprom_addr,&config,sizeof config);
Вопрос 29 из 30
Что должна сделать система при недопустимом показании датчика?
CC17
if(!sensor_valid(raw)){
  actuator_set_safe();
  fault_latch(SENSOR_FAULT);
}
Вопрос 30 из 30
Зачем отделять аппаратный слой от логики управления?
CC17
uint32_t hal_read_sensor(void);
void controller_step(const input *in, output *out);

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу