Skip to content

arch_arm_notes_ru

Serge Vakulenko edited this page Aug 26, 2015 · 1 revision

Особенности архитектуры ARM

Распределение регистров ARM: | Регистр | Применение | Описание | |:---------------|:-----------------------|:-------------| | R0...R3, R12 | Volatile | Несохраняемые регистры | | R4...R10 | Non-volatile | Сохраняемые регистры | | R11 | Frame pointer | Указатель фрейма в стеке | | R13 (SP) | Stack pointer | Указатель стека | | R14 (LR) | Link register | Адрес возврата | | R15 (PC) | Program counter | Счетчик команд |

При вызове функции первые четыре параметра передаются в регистрах R0...R3. Остальные помещаются в стек в обратном порядке, последний параметр имеет больший адрес. Функция возвращает значение в регистре R0 или регистрах R0...R1 (в случае long long или double).

Параметры оператора asm: | Символ | Режим ARM | Режим Thumb | |:-----------|:-----------------------------------|:----------------| | m | Операнд в памяти | Операнд в памяти | | r | Операнд в регистре | Операнд в регистре | | g | Операнд в памяти или в регистре | Операнд в памяти или в регистре | | f | Регистр с плавающей точкой | Регистр с плавающей точкой | | l | R0...R12, LR, SP, PC | R0...R7 | | h | --- | R8...R12, LR, SP, PC | | b | --- | R0...R7, SP | | k | --- | SP |

При прерывании, состояние регистров сохраняется в стеке текущей задачи. Для классических архитектур ARM и Thumb: | Стек | |:---------| | --- | | --- | <--- Значение SP до прерывания | | PC | | CPSR | | LR | | R12 | | R11 | | ... | | R1 | | R0 | <--- Новое значение SP | | --- |

Особенности ARM Cortex-M3

Архитектура Cortex-M3 очень сильно отличается от других семейств ARM. Фактически это совсем другой процессор: изменились система команд, служебные регистры, организация прерываний и исключений.

Для Cortex-M3 порядок регистров в стеке отличается: | Стек | |:---------| | --- | | --- | <--- Значение SP до прерывания | | xPSR | | PC | | LR | | R12 | | R3 | | ... | | R0 | | BASEPRI | | R11 | | ... | | R4 | <--- Новое значение SP | | --- |

Есть понятие "текущий приоритет выполнения" (ТПВ). В обычном режиме он равен:

  • BASEPRI, если BASEPRI>0 (и PRIMASK==0)
  • 256, если BASEPRI==0 (и PRIMASK==0)
  • 0, если PRIMASK==1

При обработке прерываний ТПВ равен приоритету прерывания. Изначально приоритеты всех прерываний сконфигурены как 0, кроме Reset (-3), NMI (-2) и Hard Fault (-1).

Возникающее прерывание начинает обрабатываться только в случае, если его приоритет выше (численно меньше) чем ТПВ.

Установка регистра PRIMASK в 1, например командой "cpsid i", повышает ТПВ до 0, что приводит к запрету всех прерываний.

Принципы обработки прерываний в uOS для Cortex-M3:

  • Для переключения задач используется прерывание SVCall. Ему задаётся самый высокий приоритет 0.
  • Все остальные прерывания, включая PendSV и Systick, конфигурируются с приоритетом 32.
  • Регистр PRIMASK установлен в 0 и не изменяется.
  • Команды "cpsid i" и "cpsie i" не используются.
  • Регистр BASEPRI служит для маскирования (запрета) прерываний. Установка в 32 (ТПВ=32) запрещает прерывания, кроме SVCall. Сброс в 0 (ТПВ=256) разрешает прерывания.

Значение регистра BASEPRI необходимо сохранять и восстанавливать в стеке при переключении задач.

Регистры xPSR

31 30 29 28 27 26-25 24 23-16 15-10 9 8-0
N Z C V Q ICI/IT T -- ICI/IT -- ISR_NUMBER

Биты: | N | 8000 0000 | Negative | результат операции отрицательный, либо меньше чем | |:--|:----------|:---------|:--------------------------------------------------| | Z | 4000 0000 | Zero | результат операции нулевой | | C | 2000 0000 | Carry | при суммировании был перенос, либо при вычитании был заем | | V | 1000 0000 | Overflow | в результате операции было переполнение | | Q | 0800 0000 |Saturation| в результате выполнения инструкций SSAT или USAT было насыщение | | T | 0100 0000 | Thumb | всегда 1 для Cortex-M3 |

Номер типа исключения ISR_NUMBER:

  • 0 – Thread режим
  • 1 – Зарезервировано
  • 2 – NMI
  • 3 – Hard Fault
  • 4 – Memory Management Fault
  • 5 – Bus Fault
  • 6 – Usage Fault
  • 7…10 – Зарезервировано
  • 11 – SVCall
  • 12 – Зарезервировано для отладки
  • 13 – PendSV
  • 15 – SysTick
  • 16…48 – IRQ0…IRQ31
You can’t perform that action at this time.