我正在研究STM32的启动文件,一时看不懂。中断和异常向量位于 ROM 的开头。有一个 AREA 指令,它有两个参数 CODE 和 DATA。书上说DATA参数对应RAM内存,程序内存的CODE对应FLASH。问题是为什么向量的声明是在数据存储器中完成的,即 内存?我附上清单。部分 - AREA RESET, DATA, READONLY 特别不清楚。毕竟,它应该是 CODE,而不是 DATA。提前致谢。
; Программый модуль стартового файла StartUp_1
; Определить переменную "Размер стека" (1 К байт)
Stack_Size EQU 0x00000400
; Объявить секцию данных для размещения стека системы
; без инициализации памяти, с атрибутом выравнивания
; по 8 байтам
AREA STACK, NOINIT, READWRITE, ALIGN=3
; Зарезервировать область памяти под стек
; с числом байт Stack_Size
Stack_Mem SPACE Stack_Size ; (1 К байт)
; Метка вершины стека (авто-декрементный стек)
__initial_sp
; Vector Table
; Объявить секцию для размещения таблицы векторов
; прерываний/исключений
; Для компановщика определяется как область памяти
; данных RESET. Будет автоматически размещена компоновщиком
; в начале памяти программ
AREA RESET, DATA, READONLY
; Объявить параметры таблицы векторов - глобальными именами
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
; Инициализация векторов обработчиков
; прерываний/исключений
__Vectors DCD __initial_sp ; Вершина стека - Top of Stack
DCD Reset_Handler ; Точка выхода в обработчик исключения
; по сбросу процессора Reset Handler
DCD NMI_Handler ; Точка входа в обработчик
; немаскируемого прерывания NMI
; ...
; Далее по аналогии могут быть объявлены и остальные
; вектора обработчиков прерываний/исключений
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
; Объявление кодовой секции для размещения
; подпрограмм обработчиков прерываний/исключений