SOC3050 — Answers and explanations B

Сначала реши вариант B, затем проверь ответы. Это авторская тренировка по исходникам курса, а не прогноз реальных вопросов.

Quick key

Question Answer Lesson
1 B 00
2 C 00
3 A 00
4 A 01
5 B 01
6 C 01
7 B 01
8 A 02
9 D 02
10 C 02
11 D 03
12 B 03
13 C 03
14 A 04
15 A 04
16 B 04
17 C 05
18 B 05
19 C 05
20 D 05
21 C 05
22 D 06
23 D 06
24 A 06
25 B 06
26 A 07
27 D 07
28 D 07
29 A 07
30 B 08
31 C 08
32 D 08
33 A 08

Разбор

1. B — lesson 00

Ответ: HardFault because the word address is not naturally aligned

Слову из четырёх байт нужен адрес, кратный четырём. 0x...02 не подходит. Симулятор может моделировать это иначе; вопрос явно о silicon.

Источник: Lesson 00, slides 10.

2. C — lesson 00

Ответ: NVIC and SysTick

NVIC/SysTick описывает документация ARM и core_cm0plus.h. RCC/GPIO/USART/TIM/EXTI — устройство ST, stm32c031xx.h и reference manual.

Источник: Lesson 00, slides 6, 7.

3. A — lesson 00

Ответ: MRS (or the CMSIS __get_PRIMASK wrapper)

PRIMASK — специальный core register без memory-mapped адреса. Его читают MRS. BASEPRI у M0+ отсутствует.

Источник: Lesson 00, slides 3b, 8.

4. A — lesson 01

Ответ: 0xF3

BICS — bit clear: FF & ~0C = F3. Это не OR и не обычный AND с маской.

Источник: Lesson 01, slides 5.

5. B — lesson 01

Ответ: 0xFFFFFFFC (-4)

Arithmetic shift сохраняет знак: старший бит заполняется единицей. Logical shift LSRS дал бы 0x7FFFFFFC. Для отрицательных нечётных чисел ASR не равен C-делению с округлением к нулю.

Источник: Lesson 01, slides 6.

6. C — lesson 01

Ответ: 124 bytes

5 бит дают 0..31, умножаем на 4: 0,4,...,124. Отрицательный и некратный четырём offset этой формой не кодируется.

Источник: Lesson 01, slides 9, 10.

7. B — lesson 01

Ответ: It may call __aeabi_uidiv because no hardware divide instruction exists

M0+ — Thumb-1 plus six, без divide и FPU. Compiler может использовать runtime helper; M3/M4 имеют другие возможности.

Источник: Lesson 01, slides 16, 17.

8. A — lesson 02

Ответ: At build/link-and-locate time

Linker script задаёт фиксированную карту при сборке. Здесь нет loader/MMU, которые выбрали бы новую карту при запуске.

Источник: Lesson 02, slides 1, 2.

9. D — lesson 02

Ответ: Flash 1040 bytes; RAM 300 bytes

Flash=900+100+40=1040. RAM=40+60+200=300. .data учитывается дважды, .bss во flash не хранится.

Источник: Lesson 02, slides 4, 5.

10. C — lesson 02

Ответ: Main.elf

ELF содержит sections, адреса, symbols и debug info. BIN — только байты; HEX — записи байтов и адресов, но не полноценная debug-информация.

Источник: Lesson 02, slides 7, 9.

11. D — lesson 03

Ответ: Whether the shared object needs volatile so the loop reloads it

Без volatile компилятор может сохранить прочитанное значение и не читать его снова. Это проблема видимости accesses, отдельная от RMW-race.

Источник: Lesson 03, slides 4.

12. B — lesson 03

Ответ: Main may get an old width paired with a new count

Атомарность каждого слова не даёт согласованности пары. Нужна короткая секция, копирующая оба значения без вмешательства writer.

Источник: Lesson 03, slides 7.

13. C — lesson 03

Ответ: B can preempt A

У NVIC меньшее число срочнее. Если B имеет более высокий аппаратный приоритет, он может прервать A. Равный приоритет так не делает.

Источник: Lesson 03, slides 8.

14. A — lesson 04

Ответ: The section-start address assigned by the linker

Linker symbol обозначает адрес. В принятом объявлении extern uint32_t _sdata чтение _sdata разыменовало бы этот адрес; & даёт саму границу section.

Источник: Lesson 04, slides 12, 14.

15. A — lesson 04

Ответ: 0x20003000

12*1024=12288=0x3000. Начальный SP указывает сразу за верхней границей RAM; push уменьшает его перед сохранением.

Источник: Lesson 04, slides 3, 13.

16. B — lesson 04

Ответ: At reset the core interprets instruction bytes as the initial SP and reset vector

Hardware не знает имён ELF sections. Оно читает два слова по reset mapping. Правильные checksums говорят о целостности записи, а не о верной компоновке.

Источник: Lesson 04, slides 6, 20.

17. C — lesson 05

Ответ: 0xEBFFFDFF

PA4 — bits9:8, mask=0x300. Очищаем: EBFFFCFF. Ставим 01: OR 0x100 → EBFFFDFF. Одним OR исходное 11 не изменить.

Источник: Lesson 05, slides 5, 6, 15.

18. B — lesson 05

Ответ: Low; any device pulling low wins

Open-drain активно тянет только вниз. Если хотя бы один участник тянет low, линия low; high появляется, когда отпускают все. Это wired-AND.

Источник: Lesson 05, slides 7, 9.

19. C — lesson 05

Ответ: EXTI->EXTICR[3] bits 15:8

У C0 EXTICR находится в EXTI. 13/4=3, 13 mod4=1; байт начинается с bit8. Port code занимает младшие биты этого байта.

Источник: Lesson 05, slides 24.

20. D — lesson 05

Ответ: IPR[1], contribution 0x00400000

6/4=1 → IPR[1]; byte6mod4=2 → shift16. Encoded byte=1<<6=0x40; 0x40<<16=0x00400000.

Источник: Lesson 05, slides 26.

21. C — lesson 05

Ответ: t=13 ms

В t10 сработал reset held=0; t11→1, t12→2, t13→3 и accept. Вопрос задаёт именно алгоритм курса, чтобы не было неоднозначного счёта samples.

Источник: Lesson 05, slides 20, 21.

22. D — lesson 06

Ответ: The old active prescaler may be used until the first update

PSC буферизован. EGR=UG принудительно переносит новый делитель в активную часть; после UG нужно очистить поднятый UIF перед включением interrupt.

Источник: Lesson 06, slides 6.

23. D — lesson 06

Ответ: 50 Hz frames with a 1.5 ms high pulse (7.5% duty)

Период=(19999+1) us=20 ms, частота50 Hz. High пока CNT<1500: 1500 us. Duty=1500/20000=7.5%.

Источник: Lesson 06, slides 8, 9.

24. A — lesson 06

Ответ: 1000 microseconds

(464-65000) mod65536=1000. Приведение к uint16_t оставляет результат по модулю16 бит; при одном микросекундном tick это1000 us.

Источник: Lesson 06, slides 12, 13.

25. B — lesson 06

Ответ: At least one wrap occurred, not that exactly five occurred

COUNTFLAG — один sticky bit, не очередь и не счётчик. Он теряет кратность событий. ISR tick тоже требует своевременного обслуживания: pending не хранит бесконечное число ticks.

Источник: Lesson 06, slides 1, 2.

26. A — lesson 07

Ответ: The switch is deferred until active handlers finish; PendSV has lowest priority

schedule выбирает задачу, PendSV выполняет переключение. Низший приоритет не даёт подменять task context внутри незавершённого другого handler.

Источник: Lesson 07, slides 4b, 4c.

27. D — lesson 07

Ответ: r4-r11

Hardware сохраняет r0-r3,r12,lr,pc,xPSR. Оставшиеся callee-saved r4-r11 сохраняет kernel. В Thumb-1 high regs проходят через low regs.

Источник: Lesson 07, slides 5, 7.

28. D — lesson 07

Ответ: The lower-priority task can starve; preemption alone does not guarantee it CPU time

Round-robin действует между равными task priorities. Высокоприоритетная READY задача не уступает низкоприоритетной только из-за tick; для ожидания нужны block/sleep.

Источник: Lesson 07, slides 9, 10.

29. A — lesson 07

Ответ: 108 words, or 432 bytes

Used=128-20=108 words. uint32_t word=4 bytes →432. Это наблюдавшийся максимум, не гарантия для непроверенных путей.

Источник: Lesson 07, slides 16, 17.

30. B — lesson 08

Ответ: Read RDR for RXNE; write ORECF=1 to ICR for ORE

Флаг приёма уходит при чтении data register RDR. Overrun очищается записью1 в отдельный clear register ICR, а не записью в ISR.

Источник: Lesson 08, slides 4.

31. C — lesson 08

Ответ: 255 bytes; the byte data before the new head

Один пустой slot различает full и empty, значит capacity=255. Сначала данные, затем индекс; иначе consumer может прочитать ещё не заполненный slot.

Источник: Lesson 08, slides 5.

32. D — lesson 08

Ответ: To serialize producers, prevent interleaved lines and protect non-reentrant printf state

Несколько tasks без сериализации — несколько writers head, что нарушает SPSC-предпосылку. say() делает вывод согласованным и защищает общее состояние newlib-nano.

Источник: Lesson 08, slides 8, 9.

33. A — lesson 08

Ответ: ESC may be the prefix of a multibyte key sequence

Один и тот же ESC начинает arrows/CSI и обозначает отдельную клавишу. Пока не пришёл следующий байт, их различает время. В коде key_timeout событие наступает при elapsed>50, а не ровно50.

Источник: Lesson 08, slides 9b.

Как использовать результат

Каждая ошибка — повод вернуться к указанному слайду и объяснить механизм своими словами. Балл здесь — диагностика, не прогноз оценки. Повторяй вопросы после разбора без подсматривания.

Скачать Markdown