RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1098900
Accepted
Шапкин Сергей
Шапкин Сергей
Asked:2020-03-24 12:36:16 +0000 UTC2020-03-24 12:36:16 +0000 UTC 2020-03-24 12:36:16 +0000 UTC

STM32 中的中断/异常向量,汇编器

  • 772

我正在研究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

; Объявление кодовой секции для размещения 
; подпрограмм обработчиков прерываний/исключений
ассемблер
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Storozhev DJ
    2020-03-24T13:18:42Z2020-03-24T13:18:42Z

    在STM32中,向量不仅可以放在flash中,还可以放在RAM中,同时还可以为它们指定地址。建议大家阅读STM32中断向量传输的答案 好了,然后按照项目的要求设置好一切。例如,在引导加载程序中,将向量放置在 RAM 或闪存中的程序开头地址是合乎逻辑的。最重要的是,将控制器指向SCB->VTOR 寄存器中的向量地址,该地址对应于编译器放置向量的地址。

    顺便问一下,这么奇怪的启动文件是从哪里来的?STM32外设库的文件中没有合适的吗?

    • 3
  2. Геннадий
    2020-05-12T02:37:55Z2020-05-12T02:37:55Z

    您从哪里得知向量表在 RAM 中?毕竟,定义因素是READONLY属性(只读),这意味着这是FLASH区域。而READWRITE(读/写)属性对应SRAM。而且文件一点都不奇怪,从ST的原件开始也是一样的。只有在原版中没有俄语注释,并且声明了一堆 HEAP(显然为了简化而省略了,因为我理解战斗训练文件:))。而且中断和异常向量确实位于0x08000000——栈顶,0x08000001——入口点(reset_handler),然后剩下的中断都去了。(0x08000000 FLASH的起始地址)


    理论:将程序分成单独的部分允许使用特殊指令 - AREA。它具有以下语法:AREA Section_Name {,type} {, attr} ...,其中:

    section_name - 部分名称。类型 — 部分类型。对于包含数据的部分,您必须指定 DATA 类型,对于包含命令的部分,您必须指定 CODE 类型。attr - 附加属性。例如,readonly 或 readwrite 属性指示该段应放置在哪个内存中,align=0..31 属性指定该段应如何在内存中对齐,noinit 属性用于分配不需要的内存区域初始化或初始化为零(使用该属性时,不需要指定节类型,因为它只能用于数据节)。最好借鉴:http ://www.keil.com/support/man/docs/armasm/default.htm


    如上所述,向量表确实可以转移到不同的地址(FLASH甚至SRAM),但这是完全不同的话题。

    PS:这里是ST startup_stm32f10x_hd.s文件的开头(这里只有代码,没有初始注释):

    Stack_Size      EQU     0x00000400
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    
    
    
    Heap_Size       EQU     0x00000200
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
                    PRESERVE8
                    THUMB                       
    
    
    
                    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 Handler
                    DCD     HardFault_Handler          ; Hard Fault Handler
                    DCD     MemManage_Handler          ; MPU Fault Handler
                    DCD     BusFault_Handler           ; Bus Fault Handler
                    DCD     UsageFault_Handler         ; Usage Fault Handler
    
    • 1

相关问题

  • 寄存器和数据大小

  • 请帮助 turbo pascal 程序中的汇编程序

  • 举例说明将字符串输出到屏幕的过程 [关闭]

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5