- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试为 Atmel SAM R21 开发自己的引导加载程序。我的想法是首先运行引导加载程序,因此它将决定是否需要执行更新或只是跳转到应用程序。主要问题是中断 vector 表位于 0x0000_0000 地址,因此需要在应用程序代码之前重新定位,因此如果引导加载程序在链接器文件中设置了 8KB 空间并以这种方式使用 BOOTPROT 熔丝(设置这个 fuse (假设通过 fuse 选择的内存量会有一些保护), vector 表应该从 0x0000_2000 地址开始。为了重新定位 vector 表,我假装使用 VTOR 寄存器,这是一个应用于原始表地址 (0x0000_0000) 的偏移量。汇编代码如下:
asm(" LDR R0,=0xE000ED08 "); //VTOR ADDRESS
asm("LDR R1,=0x00002000"); //OFFSET
asm(" STR R1, [R0]");
asm(" LDR R0,[R1] ");
asm(" MOV SP, R0");
asm(" LDR R0,[R1, #4]");
asm(" BX R0");
LDR 指令给我以下错误:错误[Og006]:内联汇编语法错误:“错误[401]:操作数语法错误”
我做错了什么?也许我正在尝试使用 ARM 指令而不是 Thumb 指令?
我将非常感谢任何建议。
我也怀疑一旦我重新定位了中断 vector 表,我是否也应该计算初始 MSP 值?我的意思是,如果中断 vector 表在重定位后从地址 0x0000_2000 开始,我应该计算 4(bytes) * Interrupt 以便知道哪个应该是初始应用程序地址,不是吗?如果有人对此有所了解,那就太好了。我知道我很接近(或者我认为如此),但我需要澄清这些要点。
2016 年 6 月 27 日 13:04 编辑。该指令有效 LDR R0,[R1]所以我猜这与将 32 位地址接收到寄存器有关,但我不明白为什么它会提示这个。
解决方案:
作为对我问题的回答,有人发帖说并非所有汇编指令都可以内联使用,所以我需要创建一个汇编文件 my_file.s在这个文件中应该创建一个从外部调用的函数,如下所示:
#define _PORT_ASM_ARM_SRC
#define __ASSEMBLY__
;/****************************************************************************
;** **
;** ASSEMBLY FUNCTIONS **
;** **
;****************************************************************************/
NAME start_app
RSEG CODE:CODE(2)
THUMB
PUBLIC jump_to_app
;/***************************************************************************/
;/***************************************************************************/
;/* jump_to_app()
; * Jump to application function.
; */
jump_to_app:
LDR R0,=0xE000ED08 ; Set R0 to VTOR address
LDR R1,=0x00010000 ; User’s flash memory based address
STR R1, [R0] ; Define beginning of user’s flash memory as vector table
LDR R0,[R1] ; Load initial MSP value
MOV SP, R0 ; Set SP value (assume MSP is selected)
LDR R0,[R1, #4] ; Load reset vector
BX R0 ; Branch to reset handler in user’s flash
END
执行此操作后,函数原型(prototype)应作为普通函数包含到项目的 .h 文件中,使用如下内容:
void jump_to_app(void);
最好的问候,
伊万。
最佳答案
上面的汇编代码在语法上没有任何错误。如果你将汇编代码放入一个asm文件中并汇编它,它就会构建(至于它是否按照你的意图我没有检查过)。
出于某种原因,内联汇编器不喜欢 LDR Rd, =expr
。
请参阅 IAR Embedded Workbench 帮助中的以下引述:
The pseudo-instruction LDR Rd, =expr is not available from inline assembler
同样来自 ARM:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472j/chr1359124248868.html
关于c - Bootstrap 。 ARM CORTEX M0+ 重定位中断表组件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049143/
我有以下代码行 #define SCB_VTOR SCB_VTOR_REG(SystemControl_BASE_PTR) #define SCB_VTOR_REG(base)
我已经用 C 语言编写了这个函数(函数应该接收一个 char*,分配必要的空间,并插入字符,给出一个指向指针后面字符索引的指针) void add_to_str(char *character, ch
我正在构建一个 ELF 二进制文件,它需要能够在运行时处理和反转其自身的重定位。 (显然,反转将发生在单独的缓冲区中,而不是原始代码页中。)这样做的目的是内存中的模块内容可以进行 HMAC 运算,并与
我花了很多时间来查找错误原因。下面是我的一段 C++ 程序,它使用 vector 来存储数据。我已经看到,当 vector 增加自身大小时,所有引用都会发生变化。因此,通过 back() 对象保存对
首先,对于我的代码中可能出现的废话,我深表歉意,我还只是个初学者。我正在尝试用 编译这段代码 #include #include #include //initial conditions //#de
基本上,我一直在图像上测试 ImageMapster 插件。但是,我希望每个区域标签的工具提示(或信息面板)彼此相邻。 > http://jsfiddle.net/jagmitg/eQCL6/ 目前,
我正在使用 Devtoolset-7在 CentOS 7 上构建了 Boost 1.65.1 w/它。但是当我链接我的应用程序时,我得到了以下信息: /opt/rh/devtoolset-7/root
我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“好玩”)。目前我的加载器非常简单,旨在仅加载包含位置无关代码的静态链接 ELF 文件。 通常,当一个程序被内核的 ELF
GWT 将生成一个 gwt-unitCache包含一些缓存文件的目录。经过几天的工作,该目录可能会产生超过 1GB 的缓存文件。我担心生成这些文件可能会损坏我的 SSD 硬盘。 我创建了一个 2GB
假设我正在使用一个 int a vector : vector a {1, 2, 34, 1222, 0}; 然后,我想像这样 push_back 一些数据: a.push_back (data);
我刚刚开始进行嵌入式 arm 开发,有一段代码真的让我很烦恼: /* Initialize the relocate segment */ pSrc = &_etext; pDest = &_srel
所以我有一个 block 在 iPhone 内置加速度计的帮助下移动,另一个 block 随机出现在屏幕上。我正在尝试使用 if 语句来确定移动 block 是否点击或触摸了固定目标 block ,如
我想弄清楚重定位是如何工作的,但我似乎无法理解它。 This document描述了在重定位 ELF 文件时可能遇到的不同类型。 我们以 R_ARM_ALU_SB_G0_NC (#70) 为例。 类型
我正在尝试通过 OS X 中的 __builtin_return_address() 获取返回地址: /* foo.c */ #include void foo() { printf("re
我正在寻找与 Gulp 一起使用的插件链,它提供: 源映射支持 少 缩小 串联 URL 替换( rebase )以解决重定位/连接 我目前有前四个,但我找不到现有插件的组合也能给我最后一个(URL r
我正在编写一些适用于 .o 文件的自定义 ELF 二进制后处理代码。部分处理包括对二进制数据执行重定位。输入文件由 GNU 汇编程序根据我自己的汇编代码生成。 看看 GNU 汇编程序生成的这些疯狂的重
所以我一直在编写 32 位代码,昨天我需要构建一个 dll,但我遇到了一些问题。反正我解决了here . 不幸的是,即使我认为一切正常,但当我将程序和 makefile 移动到其他运行 64 位的计算
在今天下午的华为全场景智慧生活新品发布会上,华为还发布了一款华为儿童手表 4X,在防水和定位性能方面进行了升级。 据介绍,华为儿童手表 4X 采用机甲设计风格,一体化表带,防水升级到 50 米
我正在尝试编译的项目一点也不复杂,除了标准库和一个独立的库(一切都在另一个系统上编译正常)之外,什么都不引用。正如标题所示,它甚至不能链接到标准库中的某些东西,因为那里的东西应该没有用 -fPIC 编
我是一名优秀的程序员,十分优秀!