Сколько векторов исключений я должен заполнить в прошивке? - PullRequest
0 голосов
/ 04 февраля 2020

Я играю с ARM с использованием доски Blue Pill STM32F103C8T6. Согласно Руководству по программированию (Раздел 2.3.4 Таблица векторов), в общей сложности необходимо установить 83 вектора исключений. Однако этот учебник заполняет только первые 6, а этот учебник - первые 10. Любопытно, что я могу убедиться, что обе прошивки работают должным образом, несмотря на отсутствие большого количества обработчиков исключений.

Просто чтобы уточнить, ниже приводится та часть, на которую я ссылаюсь ( ссылка на оригинальный файл ). Как вы можете видеть, только первым нескольким словам присваивается обработчик, и все последующие пробелы используются для хранения раздела .text.

.section .isr_vector
.align  2
.global _isr_vector
_isr_vector:
    .long   __StackTop /* we will need this later */
    .long   Reset_Handler
    .long   Default_Handler
    .long   Default_Handler
    .long   Default_Handler
    .long   Default_Handler
    .long   Default_Handler
    .long   0
    .long   0
    .long   0
    .long   0
    .long   Default_Handler
    .long   Default_Handler
    .long   0
    .long   Default_Handler
    .long   Default_Handler

Это смущает меня: каков наименьший объем обработчиков исключений Мне нужно заполнить? В моем случае использования (который является не чем иным, как игрушечным проектом) нет исключений, которые могут быть исключены, поэтому я могу просто установить обработчик сброса?

В качестве бонуса, Руководство по программированию указывает, что «Наименьшее -значительный бит каждого вектора должен быть равен 1, указывая, что обработчиком исключения является код Thumb. " Однако приведенный выше код явно не следует этому соглашению, так как он правильно вызывает обработчик сброса при загрузке?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2020

теоретически вы можете установить только два. начальный стек и обработчик сброса. Если вы не вызываете никаких прерываний (и ваша программа не попадает в серьезную ошибку, вам не нужно устанавливать

2 голосов
/ 04 февраля 2020
.thumb
.global _start
_start:
.word 0x20001000
.word one
.word two
.align
.thumb_func
one:
    b .
two:
    b .

arm-none-eabi-as so.s -o so.o
arm-none-eabi-ld -Ttext=0x08000000 so.o -o so.elf
arm-none-eabi-objdump -D so.elf

so.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <_start>:
 8000000:   20001000    andcs   r1, r0, r0
 8000004:   0800000d    stmdaeq r0, {r0, r2, r3}
 8000008:   0800000e    stmdaeq r0, {r1, r2, r3}

0800000c <one>:
 800000c:   e7fe        b.n 800000c <one>

0800000e <two>:
 800000e:   e7fe        b.n 800000e <two>

Во-первых, _start не требуется, вы получите предупреждение, просто вставить его туда.

Вам необходимо объявить метку как функцию, есть несколько способов сделать это в гну ассемблере. .thumb_fun c легко, ему не обязательно быть строкой перед тем, как вы можете иметь другие вещи между .thumb_fun c и меткой, но следующая метка помечена как функция.

Вы увидите выходные данные компилятора делают что-то вроде этого (используйте -save-temps или -S, чтобы увидеть выходные данные компилятора), есть другой способ объявить функцию в газе, для полноразмерной руки есть другой, который вы должны использовать.

Вы можете видеть, что при правильном объявлении инструменты заботятся о вас и обращаются к lsbit адреса в таблице векторов, когда вы не объявляете его правильно, тогда вы получаете неправильный адрес в таблице векторов, который не будет работать.

И как ответили минимум, две записи только потому, что вам нужно что-то иметь по смещению / адресу 4. Обратите внимание, что 0x08000000 отображается на 0x00000000 при загрузке на этих платформах STM32. Минимум - это вектор сброса, если вам не нужны другие, но, находясь со смещением, вы должны заполнить первые четыре байта. Можно также поместить туда начальное значение указателя стека и тот же код, который позже настроит его.

В таблице векторов нет ничего по-настоящему волшебного, это просто адресное пространство, которое вы можете делать как для выборок, так и для данных. циклы.

Два - минимум, но если вы в конечном итоге столкнетесь с ошибкой выравнивания или другой ошибкой, то он попытается найти там вектор, если четное число будет проблемой, если нечетное, то попробуйте выполнить с этого адреса (lsbit удален, p c не имеет нечетного числа в нем, это просто механизм, показывающий большой палец против руки). Таким образом, хотя технически один вектор, сброс - это минимум, вероятно, это хорошая идея, чтобы охватить первые 16 (15) на всякий случай.

.thumb
.global _start
_start:

.word 0x20001000
.word reset
.word loop
.word loop

.word loop
.word loop
.word loop
.word loop

.word loop
.word loop
.word loop
.word loop

.word loop
.word loop
.word loop
.word loop

.thumb_func
reset:
    b .

.thumb_func
loop:
    b .

Хотя вы можете смешивать код и векторы, если в итоге вы используете прерывание обработчик для периферийного устройства, то вы, вероятно, хотите не связываться с микшированием кода между исключениями и там, где находится ваш вектор обработчика прерываний. Если вы действительно отчаянно нуждаетесь в кодовом пространстве во флаге sh, то технически вы можете ...

Насколько ответом будет минимальный ответ P__J __. Добавил этот ответ, чтобы покрыть вопрос lsbit.

...