У меня есть много больших и Cortex-м на основе примеров http://github.com/dwelch67
Как Joachim указал вам не хватает первую запись в таблице векторов, указатель стека. в кортексе-m нет той же таблицы векторов, что и рука, что означает ту, которая загружается в режиме руки с командами рук.
Чтобы завершить ответ, хотя, для Cortex-м вы можете настроить стек, помещая начальное значение для указателя стека в том, что первое слово расположение
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start /* 1 Reset */
.word hang /* 2 NMI */
.word hang /* 3 HardFault */
.word hang /* 4 MemManage */
вы можете, конечно, когда-то работает установить указатель стека вручную, как в режиме руки или в большинстве других процессоров.
Я бы хотел, чтобы ваш код попадал в бесконечный цикл, так что, как написано, вы не попадаете в неопределенные инструкции и т. Д. (Должно быть 0xFFs, которое на кортекс-m0, я думаю, не определено, на -m3 или -m4 с поддержкой armv7 thumb2, это может быть настоящая инструкция).
Обратите внимание, что я не использовал +1 на своих векторах. Вам нужно знать свои инструменты. Вам нужно, чтобы lsbit установил для указания большого пальца/большого пальца на ветке. Хотя я извлек урок о том, что (надо будет найти так вопрос)
Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function
С ГНУ ассемблере, если вы поставите директиву.thumb_func перед меткой, этот ярлык помечен как метка большого пальца, а инструменты gnu будут использовать адрес | 1.
.thumb_func
.globl _start
_start:
Вы должны строить и разбирать и теперь каждый раз, чтобы убедиться, что ваша таблица строится правильно и ветви, и такие, что используется правильный адрес.
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000050 andeq r0, r0, r0, asr r0
c: 00000050 andeq r0, r0, r0, asr r0
10: 00000050 andeq r0, r0, r0, asr r0
см, по-видимому, у меня есть ошибка в одном из моих примеров ... он никогда ничего, кроме сброса делает (нет прерывания, используемого в данном примере, так что, как я ушел с не зная). забыла .thumb_func
hang: b .
производства
00000050 <hang>:
50: e7fe b.n 50 <hang>
изменение
.thumb_func
hang: b .
и таблица векторов переходит в
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
14: 00000051 andeq r0, r0, r1, asr r0
это интересно, измените код на
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start+1 /* 1 Reset */
.word hang+1 /* 2 NMI */
.word hang+1 /* 3 HardFault */
.word hang /* 4 MemManage */
.word hang /* 5 BusFault */
и он действительно не делает ничего, кроме одного или одного.
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
Это немного тревожно. В нижней строке, хотя, две вещи, с помощью cortex-m, вы можете настроить указатель стека в векторной таблице, во-вторых, при запуске нового проекта разобрать и проанализировать векторную таблицу, чтобы убедиться, что это то, что вы ожидаете. Esp, если он не делает то, что вы считаете нужным.
У меня много коры головного мозга и большого пальца в общих примерах на http://github.com/dwelch67. для простой такой программы я бы поставил бесконечный цикл после добавления зависания: b зависает, что-то в этом роде. –