簡體   English   中英

在ARM Cortex M3匯編器中的任何地址進行編程

[英]Program at any address in ARM cortex M3 assembler

有誰知道如何將程序放入內存中任意地址的ARM匯編器中? 默認情況下,該程序位於地址0x00000008開始,但是有必要將其例如定位在地址0x20002000上。 我嘗試使用DCD 0x20002000 ,但這只會更改寄存器指針,而程序仍保留在舊地址。 SPACE 0x400命令運行良好,但是如果地址太大,則編譯將花費很長時間。 告訴我,也許面對這個?

在此處輸入圖片說明

基本上,有兩種方法可以使用Keil來控制代碼區域的位置。 使用分散文件,或使用構建選項對話框中的“目標”選項卡。

您可以定義一個IROM區域,其中包括您要放置代碼的區域。 您也可以使用此對話框開始生成初始分散文件,然后根據Keil文檔修改分散文件。

但是,您在此處給出的位置在RAM區域中,這有點不尋常(可能效率低下,但有效)。 您是否考慮過重啟電源后如何初始化目標?

最大的問題是,在復位時,Cortex-M3總是會從地址0、4(由於預取而導致的地址為8)進行讀取。 您需要提供一個初始堆棧指針(或不使用堆棧),以及復位向量(設置為0,即T位)。 內存映射可能存在硬件存儲區(特定於設備),但是程序員的觀點始終是,這些提取始於地址0。

通常,您可以通過修改所使用的鏈接描述文件或為GNU ld提供某些命令行選項來獲得此結果。

根據您提供的信息,我假設您的代碼當前正好在兩個第一個向量條目表(即初始SP值和重置值)之后開始,並且您的向量表位於0x00000000。

example1.s應該或多或少看起來像您當前的代碼:

        .cpu    cortex-m3
        .thumb    
        .syntax unified
        .global Reset_Handler
        .equ    StackTop, 0x1000
        .word   StackTop         
        .word   Reset_Handler
Reset_Handler:
         b .
        .end


/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example1.o -c example1.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler -Ttext-segment=0x00000000 -Map=example1.map -o example1.elf example1.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d example1.elf

example1.elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 <Reset_Handler-0x8>:
   0:   00001000        .word   0x00001000
   4:   00000008        .word   0x00000008

00000008 <Reset_Handler>:
   8:   e7fe            b.n     8 <Reset_Handler>

該代碼將位於0x00000008。

example2.s定義了一個名為.vectors的新鏈接器節。

現在,我們將使用GNU ld --section-start命令行選項來強制.vectors節駐留在0x00000000,並且仍然使用-Ttext-segment來強制.text節/文本段駐留在0x20002000。

example2.s:

    .cpu    cortex-m3                                                                                                                                                                                                                                              
    .thumb                                                                                                                                                                                                                                                                 
    .syntax unified                                                                                                                                                                                                                                                        
    .global Reset_Handler                                                                                                                                                                                                                                                  
    .equ    StackTop, 0x1000                                                                                                                                                                                                                                               

    .section .vectors                                                                                                                                                                                                                                                      
    .word   StackTop                                                                                                                                                                                                                                                       
    .word   Reset_Handler                                                                                                                                                                                                                                                  

    .section .text                                                                                                                                                                                                                                                         

Reset_Handler:
b。

/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example2.o -c example2.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler --section-start=.vectors=0x00000000 -Ttext-segment=0x20002000 -Map=example2.map -o example2.elf example2.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld: warning: address of `text-segment' isn't multiple of maximum page size
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d -j .vectors -j .text -d example2.elf

example2.elf:     file format elf32-littlearm


Disassembly of section .vectors:

00000000 <.vectors>:
   0:   00001000        .word   0x00001000
   4:   20002000        .word   0x20002000

Disassembly of section .text:

20002000 <Reset_Handler>:
20002000:       e7fe            b.n     20002000 <Reset_Handler>
        .end    

向量表仍位於正確的內存位置,但是代碼現在位於0x20002000。

為了描述在鏈接器腳本中實現相同結果所需的確切更改,我需要查看其內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM