Assembly 我应该在固件中填写多少异常向量?

Assembly 我应该在固件中填写多少异常向量?,assembly,arm,stm32,firmware,thumb,Assembly,Arm,Stm32,Firmware,Thumb,我正在用STM32F103C8T6蓝色药丸板玩ARM。根据its(第2.3.4节向量表),总共需要设置83个异常向量。但是,仅填充前6个和前10个。奇怪的是,我可以验证这两个固件是否按预期执行,尽管没有很多异常处理程序 为了澄清,下面就是我所指的部分()。如您所见,只有前几个单词被分配了一个处理程序,所有后续的空格都被用来存放.text部分 .section .isr_vector .align 2 .global _isr_vector _isr_vector: .long __

我正在用STM32F103C8T6蓝色药丸板玩ARM。根据its(第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代码。”但是,上面的代码显然不遵循此约定,因此如何在引导时正确调用重置处理程序?

理论上,您只能设置两个。初始堆栈和重置处理程序。如果您没有调用任何中断(并且您的程序没有以硬故障结束),则不必设置任何中断

.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>
虽然你可以混合代码和向量,如果你最终使用一个中断处理程序作为外设,那么你可能不想在异常和中断处理程序向量所在的任何地方混合代码。如果你真的非常需要flash中的代码空间,那么技术上你可以


就最低限度而言,p_uj_u的答案就是答案。我添加此答案是为了涵盖lsbit问题。

我确实记得有一次JLink拒绝下载我的代码,我记得JLink软件期望将校验和放在向量表的内存位置。校验和存储在一个保留位置ons。我提到过,以防有人对一个很短的向量表有问题。@ElliotAlderson J-link没有单独放置任何数据。此评论不是事实。这是几年前发生的,所以我可能记不起问题的确切性质。@ElliotAlderson那么你的评论的原因是什么?你刚刚做了一个测试有什么地方出错。\n我发表评论的原因是,有一段时间,除非向量表中的值满足某些要求,否则JLink软件不会对设备进行编程。我为无法记住细节而深表歉意,但我认为这可能会为其他有问题的人提供线索。我的评论并非故意的作为对您答案的批评或更正。8000004处的反汇编不是0800000c吗?(其中“一”是?)重置处理程序是0x0800000c,因此向量表中的向量必须是0x0800000c | 1,即0x0800000D。这就是问题所在,如果您正确使用工具(一),则需要为处理器设置lsbit才能工作如果你不知道,他们会帮你做的。向量表没有什么神奇之处,它只是ram。你是说“rom”吗?因为AFAIK,向量表与
.text
一起存储在闪存上,而不是存储在RAM上。此外,我的印象是
\u start
通常用作入口点,而不是指示向量表的开始?
.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 .