gpt4 book ai didi

embedded - 裸机 ARM 应用程序启动时出现问题

转载 作者:行者123 更新时间:2023-12-02 19:19:48 27 4
gpt4 key购买 nike

我正在尝试使用 LLVM 生成用于裸机 ARM Cortex M4 开发的代码。IR 的创建进展顺利,LLVM 正在生成(在我看来)正确的 ARM Thumb ASM。

我购买了 Arm 开发套件来进行一些测试:Atmel SAM4L-EK http://www.atmel.com/tools/SAM4L-EK.aspx

我创建了一个打开开发板上黄色 LED 的应用程序。(我只是想从板上得到一些东西)我使用 Atmel Studio 运行了一个附带的应用程序,LED 工作正常。但我的应用程序似乎什么也没做...

根据手册将LED连接到PC10在ATSAM4LC4C MCU的数据表中,它说GPIO端口的地址是0x400E1000,一个端口占用 0x0200 字节的地址空间,因此端口 C 位于 0x400E1000 + 0x0400。

这是我的程序输出(LLVM 输出):

.syntax unified
.eabi_attribute 6, 10
.eabi_attribute 9, 2
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 44, 1
.file ""
.text
.globl main
.align 2
.type main,%function
.code 16
.thumb_func
main:
movw r0, #5120
movw r2, #5184
movw r3, #5200
mov.w r1, #1024
movt r0, #16398
movt r2, #16398
movt r3, #16398
.LBB0_1:
str r1, [r0]
str r1, [r2]
str r1, [r3]
b .LBB0_1
.Ltmp0:
.size main, .Ltmp0-main

此代码将 GPIOEnableRegister 中的位 10 设置为 1

然后将 OutputDriverEnableRegister 中的位 10 设置为 1

然后将 OutputValueRegister 中的位 10 设置为 1

此时 LED 应亮起...

这是我使用的启动代码:

.section INTERRUPT_VECTOR, "x"
.global _Reset
_Reset:
B Reset_Handler /* Reset */
B . /* Undefined */
B . /* SWI */
B . /* Prefetch Abort */
B . /* Data Abort */
B . /* reserved */
B . /* IRQ */
B . /* FIQ */

Reset_Handler:
#mov r0, stack_top
MOV sp,r0
BL main
B .

两个汇编程序文件都被编译为目标文件,如下所示:

as -mcpu=cortex-m4 -g startup.s -o startup.o

使用 GNU ARM 汇编器

这是我使用的链接器脚本:

ENTRY(_Reset)
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
SEARCH_DIR(.)

/* Memory Spaces Definitions */
MEMORY
{
rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 /* flash, 256K */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 /* sram, 32K */
}

SECTIONS
{
. = 0x0;
.text : {
startup.o (INTERRUPT_VECTOR)
*(.text)
}
.data : { *(.data) }
.bss : { *(.bss COMMON) }
. = ALIGN(8);0
. = . + 0x1000; /* 4kB of stack memory */
stack_top = .;
}

然后目标文件被链接到 ELF 二进制文件,如下所示:

ld -T linkerscript.ld armtest.o startup.o -o armtest.elf

使用 GNU Arm 链接器

然后我使用 Atmel Studio 将 ELF 二进制文件上传到开发板

机器人没有任何反应(重置后也没有发生)

任何见解将不胜感激!

最佳答案

cortex-m 系列不像非 cortex-m 系列 ARM 那样启动。 cortex-m 采用(非 Arm)传统中断向量表方法,而不是像全尺寸 Arm 那样的指令表。

/* vectors.s */
.thumb

.word 0x20020000 /* stack top address */
.word _start /* 1 Reset */
.word hang /* 2 NMI */
.word hang /* 3 HardFault */
.word hang /* 4 MemManage */
.word hang /* 5 BusFault */
.word hang /* 6 UsageFault */
.word hang /* 7 RESERVED */
.word hang /* 8 RESERVED */
.word hang /* 9 RESERVED*/
.word hang /* 10 RESERVED */
.word hang /* 11 SVCall */
.word hang /* 12 Debug Monitor */
.word hang /* 13 RESERVED */
.word hang /* 14 PendSV */
.word hang /* 15 SysTick */
.word hang /* 16 External Interrupt(0) */
.word hang /* 17 External Interrupt(1) */
.word hang /* 18 External Interrupt(2) */
.word hang /* 19 ... */

.thumb_func
.global _start
_start:
/*ldr r0,stacktop */
/*mov sp,r0*/
bl notmain
b hang

.thumb_func
hang: b .

您需要将堆栈顶部地址设置为特定于您的处理器的第一项。使用 llvm 您可能需要在这里调整一些指令,以上是针对 gnu 的。

关于embedded - 裸机 ARM 应用程序启动时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com