首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >启动裸机ARM应用程序时出现问题

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

Stack Overflow用户
提问于 2013-06-15 13:04:17
回答 1查看 1.7K关注 0票数 5

我正在尝试使用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工作正常。但我的应用程序似乎什么也没做...

根据手册,在GPIO微控制器的数据表中,该发光二极管连接到PC10,其地址为0x400E1000,其中一个端口占用0x0200字节的地址空间,因此端口C在0x400E1000 + 0x0400上。

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

代码语言:javascript
运行
AI代码解释
复制
.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应该打开...

这是我使用的启动代码:

代码语言:javascript
运行
AI代码解释
复制
.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 .

这两个汇编文件都被编译成目标文件,如下所示:

代码语言:javascript
运行
AI代码解释
复制
as -mcpu=cortex-m4 -g startup.s -o startup.o

使用GNU ARM汇编程序

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

代码语言:javascript
运行
AI代码解释
复制
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二进制文件,如下所示:

代码语言:javascript
运行
AI代码解释
复制
ld -T linkerscript.ld armtest.o startup.o -o armtest.elf

使用GNU Arm链接器

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

机器人什么都不发生(也不是在重置之后)

任何真知灼见都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-15 13:16:36

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

代码语言:javascript
运行
AI代码解释
复制
/* 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的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17123958

复制
相关文章
从零开始ARM裸机开发之建立开发环境
–参考朱有鹏ARM裸机课程
全栈程序员站长
2022/08/23
7270
ARM Linux 启动时的自解压过程 | Linux 内核
最近业余时间都在学习 Linux 内核和英语,或者是陪家人玩耍,没有投入太多的时间在文章。
用户8639654
2021/08/26
2.9K0
SpringBoot2.x基础篇:应用程序在启动时访问启动项参数
SpringBoot应用程序在启动时,我们可以传递自定义的参数来进行动态控制逻辑,比如我们使用--debug启动参数时就会使用debug启动应用程序,在控制台打印一些调试日志信息。
恒宇少年
2020/03/20
2.5K0
SpringBoot2.x基础篇:应用程序在启动时访问启动项参数
adb shell 启动,停止 android 应用程序一、adb启动 应用程序二、adb停止 应用程序
包名和Activity类的类名一定要输入正确,可以用re-sign工具(在最后的弹出信息框会显示出包名和Activity类名)。
一个会写诗的程序员
2018/08/20
5.9K0
python启动应用程序和终止应用程序
每天上班,工作需要,电脑上需要每天开机启动一些软件,下班时候,需要关掉一些软件。一个一个打开和关闭貌似是很繁琐的,于是乎,这个脚本产生了。
py3study
2020/01/07
2.4K0
arm linux启动过程_项目冷启动和热启动的区别
常把单片机系统的复位分为冷启动和热启动。所谓冷启动,也就是一般所说的上电复位,冷启动后片内外RAM的内容是随机的,通常是0x00或0xFF;单片机的热启动是通过外部电路给运行中的单片机的复位端一复位电平而实现的,也就是所说的按键复位或看门狗复位。复位后,RAM的内容都没有改变。在某些场合,必须区分出设备的重启是热重启还是冷重启。常用的方法是:确定某内存单位为标志位(如0x40003FF4~0x40003FF7 RAM单元),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如为0xAA55AA55),就认为是热启动,否则就是冷启动。
全栈程序员站长
2022/11/16
2.3K0
office打开文件时出现向程序发送命令时出现问题_向文件发送命令时错误
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说office打开文件时出现向程序发送命令时出现问题_向文件发送命令时错误,希望能够帮助大家进步!!!
Java架构师必看
2022/10/24
8.2K0
安卓7.0在线更新解析包时出现问题
关于7.0行为变更,FileProvider应用共享文件的问题可以看鸿洋大佬的这篇博客 https://blog.csdn.net/lmj623565791/article/details/72859156 但是我遇到的这个问题是明明有授权临时权限,FileProvider的XML也有写,但是在下载apk后解析安装包出错,后面回顾一圈代码发现,有问题。
萬物並作吾以觀復
2018/12/12
1.5K2
ARM64 的多核启动流程分析
工作中遇到的多核 ARM CPU 越来越多,总结分享一些多核启动的知识,希望能帮助更多小伙伴。 在 ARM64 架构下如果想要启动多核,有 spin-table 和 psci 两种方式,下面针对这两种启动流程进行分析。 代码版本 boot-wrapper-aarch64 version : 28932c41e14d730b8b9a7310071384178611fb32 linux v5.14 多核 CPU 的启动方式 嵌入式系统的启动的基本流程是先运行 bootloader ,然后由 bootloade
刘盼
2022/03/10
2.4K0
嵌入式ARM设计编程(四) ARM启动过程控制
(4) 掌握通过memory/register/watch/variable 窗口分析判断结果。
timerring
2023/02/24
1.5K0
嵌入式ARM设计编程(四) ARM启动过程控制
Android源码分析--应用程序启动
1.AMS通过调用startProcessLocked方法向Zygote进程发送请求。
xuexiangjys
2022/04/18
6320
Android源码分析--应用程序启动
应用程序进程启动过程
1.AMS在启动应用程序时会检查者应用程序需要的应用进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程
用户3112896
2019/09/26
7440
应用程序进程启动过程
ARM64 SMP多核启动(下)- PSCI
上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令,说他简单是相对于功能来说的,因为他只是实现了从处理器的启动,仅此而已,所以,现在社区几乎很少使用spin-table这种方式,取而代之的是psci,他不仅可以启动从处理器,还可以关闭,挂起等其他核操作,现在基本上arm64平台上使用多核启动方式都是psci。下面我们来揭开他神秘的面纱,其实理解了spin-table的启动方式,psci并不难(说白了也是需要主处理器给从处理器一个启动地址,然后从处理器从这个地址执行指令,实际上比这要复杂的多)。
用户7244416
2021/08/06
3K0
应用程序启动速度的优化
Mozillaproject师通过优化Static Initializer(静态初始化,或全局建构函数, Global Constructor)和Binary布局来提升FireFox启动速度的文章。很有參考价值。
全栈程序员站长
2022/07/06
5560
Zynq的AMP多核处理
写的是Zynq 7000系列的,arm有两个核。主要有AMP和SMP两种方式,SMP是两个核运行一个操作系统,跑LINUX的话,使能SMP,资源会自动分配给两个核运行。AMP是两个核独立运行,每个核可以运行操作系统也可以裸机运行。
用户9736681
2023/09/01
6000
Zynq的AMP多核处理
eclipse启动时和开发时优化
1 eclipse.ini参数优化 -startup plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.401.v20161122-1740 #加载jvm -vm C:\Program Files\Java\jre1.8.0_121\bin #注意这是jre的bin
闵开慧
2018/04/02
1K0
eclipse启动时和开发时优化
springboot启动时执行
可以实现CommandLineRunner接口然后重写run方法,在run方法里执行
阿超
2022/08/16
4230
裸机安全谁负责?
很多人希望硬件商品可以成为软件定义网络的支撑框架,但是裸机交换机中软件的安全该由谁负责呢?这是上周黑帽会议上探讨的安全问题之一。软件供应商需要硬件解决方案,而交换机制造商只提供裸机。 该问题的导火线是
SDNLAB
2018/04/03
7890
裸机安全谁负责?
docker启动mysql指定挂载目录时无法启动
使用-it模式启动也会直接退出,通过docker logs 退出的mysql容器id返回下面的提示信息:
johnhuster的分享
2022/03/28
6.2K0
点击加载更多

相似问题

ARM -裸机平台上的MPI?

228

如何为裸机arm应用程序编写动态加载器

10

裸机嵌入式系统(ARM)评测

21

Linux环境下的ARM裸机开发

23

对ARM裸机开发板的GNAT支持

348
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档