Метценгерштейн 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Стало интересно как в STM32 задаются вектора прерываний. Из RM08 ясно, что (возьмем SysTick), при прерывании по SysTick, происходит аппаратное прерывание на адрес 0x0000003C, откуда идет направление в функцию void SysTick_Handler(void). Вот даташит RM08: Пока всё корректно, адрес 0x0000003C. Смотрим уже после компиляции проекта (HAL), что лежит по этому адресу- куда должен прыгнуть дальше, какую ф-ю вызвать для обработки. Видим по памяти, что лежит там 0x0800076F. Наводим мышку на ф-ю SysTick, и видим что она расположена по адресу 0x0800076E Вопрос- почему, и где я ошибся в рассуждениях? STM32F103CB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 130 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Младший бит адреса должен быть установлен в 1 для указания CPU, что он исполняет код из набора Thumb/-2. За подробностями в мануал на ядро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба не понял немного. Можно чуть подробней объяснить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 130 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 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-набора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 5 minutes ago, Метценгерштейн said: Можно чуть подробней объяснить? Было (а может быть и есть) два набора инструкций для процессора: ARM (32-бита) и Thumb (16-бит). Более старые ядра, например ARM7TDMI, могли исполнеять оба набора. А сам набор определялся состоянием младшего бита. Новые ядра (Cortex-Mx) могут исполнять только Thumb. И для совместимости младший бит должен быть равен 1. Т.е. вы бинарный код можете, теоретически, запустить на ARM7TDMI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Спасибо, а применительно теперь к адресам? Вот есть адрес в памяти 0x0800076F На примере можно пояснить? С вектора прерывания 0x0000003C туда же прыгает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 130 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Только что, Метценгерштейн сказал: Спасибо, а применительно теперь к адресам? Ну а чего не понятного? Функция для понимания человеком находится по адресу 0x0800076E. Для процессора надо в этом адресе установить младший бит, поэтому получаем 0x0800076F. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Понял, проц прыгает по 0x0800076E, и видит, что установлен младший бит, 0x0800076F, а адрес 0x0800076F не является кратным 4, поэтому процу ясно, что это бит добавлен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 4 minutes ago, Метценгерштейн said: С вектора прерывания 0x0000003C туда же прыгает? И снова рекомендую книгу Джозефа Ю. По нужной вам архитектуре процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба Спасибо всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 39 минут назад, Метценгерштейн сказал: Спасибо всем. и еще не забывать про VTOR http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHHDGBC.html https://habr.com/ru/post/275351/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 24 января, 2020 Опубликовано 24 января, 2020 · Жалоба 4 часа назад, Метценгерштейн сказал: Пока всё корректно, адрес 0x0000003C. Смотрим уже после компиляции проекта (HAL), что лежит по этому адресу- куда должен прыгнуть дальше, какую ф-ю вызвать для обработки. Это не адрес, а смещение от начала таблицы векторов прерываний. А где находится её начало - нужно смотреть VTOR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 24 января, 2020 Опубликовано 24 января, 2020 (изменено) · Жалоба Более старые ядра, например ARM7TDMI, могли исполнеять оба набора. А сам набор определялся состоянием младшего бита. Новые ядра (Cortex-Mx) могут исполнять только Thumb. Причём, Cortex-Rx и Cortex-Ax всё также умеют ARM-команды... Ж>8-\ максимальный ассортимент. Изменено 24 января, 2020 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 25 января, 2020 Опубликовано 25 января, 2020 · Жалоба 5 hours ago, Obam said: Причём, Cortex-Rx и Cortex-Ax всё также умеют ARM-команды... Ж>8-\ максимальный ассортимент. Я не работал с этими ядрами, но буду иметь это в виду) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться