Перейти к содержанию
    

академический вопрос про вектора прерываний

Стало интересно как в STM32 задаются вектора прерываний. Из RM08 ясно, что (возьмем SysTick), при прерывании по SysTick, происходит аппаратное прерывание на адрес 0x0000003C, откуда идет направление в функцию

void SysTick_Handler(void).

Вот даташит RM08:

image.thumb.png.9acb4dbf15dc783054a42ab1e1bbd1ff.png

Пока всё корректно, адрес 0x0000003C. Смотрим уже после компиляции проекта (HAL), что лежит по этому адресу- куда должен прыгнуть дальше, какую ф-ю вызвать для обработки.

Видим по памяти, что лежит там 0x0800076F.

Наводим мышку на ф-ю SysTick, и видим что она расположена по адресу 0x0800076E

image.thumb.png.d56a4130172fc382f5a90890df900948.png 

 

Вопрос- почему, и где я ошибся в рассуждениях?

STM32F103CB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Младший бит адреса должен быть установлен в 1 для указания CPU, что он исполняет код из набора Thumb/-2. За подробностями в мануал на ядро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не понял немного. Можно чуть подробней объяснить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cortex-M - это профиль процессоров архитектуры ARMv7-M, и, строго говоря, настоящим ARM-процессором не является (нету у него набора инструкций ARM).

А вот настоящие процессоры ARM поддерживали два набора команд: 32-битный ARM и 16/32-битный Thumb/Thumb-2.

Для выполнения Thumb на ARM-процессоре требовалось адресовать их по полусловам, т.е. младший бит был установлен в 1.

Этот бит копировался в бит T регистра CPSR и указывал процессору текущий набор инструкций.

 

Cortex-M не поддерживает ARM-команды, а поддерживает только Thumb/-2.

Так вот для переносимости кода решили оставить этот самый младший бит в 1, чтобы процессор понимал, что исполняет команды Thumb-набора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, Метценгерштейн said:

Можно чуть подробней объяснить?

Было (а может быть и есть) два набора инструкций для процессора: ARM (32-бита) и Thumb (16-бит). Более старые ядра, например ARM7TDMI, могли исполнеять оба набора. А сам набор определялся состоянием младшего бита. Новые ядра (Cortex-Mx) могут исполнять только Thumb. И для совместимости младший бит должен быть равен 1. Т.е. вы бинарный код можете, теоретически, запустить на ARM7TDMI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, а применительно теперь к адресам? Вот есть адрес в памяти 0x0800076F

На примере можно пояснить?

С вектора прерывания 0x0000003C туда же прыгает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Метценгерштейн сказал:

Спасибо, а применительно теперь к адресам?

Ну а чего не понятного? Функция для понимания человеком находится по адресу 0x0800076E.

Для процессора надо в этом адресе установить младший бит, поэтому получаем 0x0800076F.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял, проц прыгает по 0x0800076E, и видит, что установлен младший бит, 0x0800076F, а адрес 0x0800076F не является кратным 4, поэтому процу ясно, что это бит добавлен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Метценгерштейн said:

С вектора прерывания 0x0000003C туда же прыгает?

И снова рекомендую книгу Джозефа Ю. По нужной вам архитектуре процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, Метценгерштейн сказал:

Спасибо всем.

 

и еще не забывать про VTOR

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHHDGBC.html

https://habr.com/ru/post/275351/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Метценгерштейн сказал:

Пока всё корректно, адрес 0x0000003C. Смотрим уже после компиляции проекта (HAL), что лежит по этому адресу- куда должен прыгнуть дальше, какую ф-ю вызвать для обработки.

Это не адрес, а смещение от начала таблицы векторов прерываний. А где находится её начало - нужно смотреть VTOR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты



Более старые ядра, например ARM7TDMI, могли исполнеять оба набора. А сам набор определялся состоянием младшего бита. Новые ядра (Cortex-Mx) могут исполнять только Thumb.




Причём, Cortex-Rx и Cortex-Ax всё также умеют ARM-команды... Ж>8-\ максимальный ассортимент.

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Obam said:

Причём, Cortex-Rx и Cortex-Ax всё также умеют ARM-команды... Ж>8-\ максимальный ассортимент.

Я не работал с этими ядрами, но буду иметь это в виду)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...