[英]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.