cortex r5 处理器的启动文件和链接器文件中应包含哪些内容?重置处理器后我们需要遵循哪些具体步骤?(特定于 cortex r5)知道如何为 Arm 的 GNU-GCC 执行此操作吗?
谢谢!
如果我有一个ARM Thumb 2指令流,如下所示:
itt NZ
mov r1,r2
it MI
mov r3,r4
Run Code Online (Sandbox Code Playgroud)
第一个IT指令的IT块包含mov第二个IT指令it.这个序列是允许的,还是未定义的行为?
我正在进入微控制器,所以我想知道像esp32和esp8266这样的微控制器和其他同类产品是基于x86还是arm架构?我尝试在互联网上搜索,但没有得到足够的线索
如果它使用这两种架构中的任何一种,是否有机会在这些控制器中安装Linux,我想到了这一点,因为freeRTOS说它是微控制器的操作系统,我认为它不是
但不知何故,如果它是一个操作系统,那么像Linux这样的其他操作系统呢,他们今天有机会安装在MCU中吗?或者甚至在未来五年内他们有机会吗?
我time()在ARM微控制器上使用。达到此功能后,处理器将重新启动。
奇怪的是,当我处于调试模式时,代码可以完美运行,但是当我想以独立方式应用它时,就会遇到重置。
我在俯视什么吗?是否可以代替此功能?
代码部分是这样的
#include <sys/time.h>
#include <stdio.h>
void main (void)
{
static time_t rawtime = 0;
rawtime = time (NULL);
}
Run Code Online (Sandbox Code Playgroud) 让我们考虑一个8位处理器来简化我的问题。我知道-2被存储为其2的补码,即0b1111_1110,该数据块的小数表示为254,对吗?现在,我的问题是,由于ARM处理器的二进制表示形式相同,因此它们将如何区分“ -2”和“ 254”?
我尝试查找整个互联网,每个人都在不断解释处理器如何存储负数。我需要知道的是它们是如何区分的。
所以现在我读了《ARM Cortex-M3/M4 权威指南》一书,无法理解为什么 16 位指令无法访问高级通用寄存器 R8-R12。
它说实际上很少有人可以访问这些寄存器,但大多数不能。
我的主要源文件:
L0 LDR R0, =prompt
BL WriteString ;print prompt
BL ReadInt ;R0 = n
CMP R0, #0
BGE L1
LDR R0, =res0 ; invalid input
BL WriteString
B L0
L1 MOV R1, #2
L2 UDIV R2, R0, R1
MLS R2, R1, R2, R0
CBZ R2, L3
BL WriteInt
ADD R1, #1
CMP R1, R0
BLT L2
L3 SUB R0, #1
CBZ R0, L0 ;Error: A1176E: Branch offset 0xFFFFFFC8 out of range.
B L1
prompt DCB "Enter a positive integer: ", …Run Code Online (Sandbox Code Playgroud) 我正在检查 ARM Cortex A9 的向量表,并偶然发现了两种类型的指令:
B_boot
和
LDR PC,_boot
有人可以向我解释一下使用 B 或 LDR 的区别吗?两个代码应该做同样的事情,但显然一定有区别。和链接寄存器有关系吗?
谢谢你的时间!
通过一些研究,我意识到 ARM 和 RISC 几乎可以互换使用,x86 和 CISC 也是如此。我理解RISC和CISC是架构。我的理解是,架构(即 RISC 或 CISC)是一种指令集,进程必须能够执行这些指令才能成为这些架构之一。例如,RISC-V 有一个它可以执行的指令列表,CISC 有一个它可以执行的指令列表。要成为 RISC 或 CISC,处理器必须能够执行特定的指令列表之一。但是,我不明白ARM和RISC以及x86和CISC分别有什么区别。ARM和x86不也是架构吗?我经常读到“ARM 架构”或“x86 架构”。感谢您为我澄清这一点。
在我的源代码中,我看到了arm编译器的奇怪行为,它对字符串进行了冗余迭代,这是不必要的。我在这里展示了一个最小的例子来说明这一点,并在下面提出我的问题
#include <string.h>
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
int MAX_FILE_NAME = 2500;
int F(char *file){
int file_len = MIN(strlen(file), MAX_FILE_NAME - 1);
return file_len;
}
int main(void) {
F(__FILE__);
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
编译为:
arm-none-eabi-gcc -nostdlib -Xlinker -Map="m7_experiments.map" -Xlinker --cref -Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -T "m7_experiments_Debug.ld" -o "m7_experiments.axf" ./src/cr_startup_cm7.o ./src/crp.o ./src/flashconfig.o ./src/m7_experiments.o
Run Code Online (Sandbox Code Playgroud)
导致:
Dump of assembler code for function F:
0x00000104 <+0>: push {r4, lr}
0x00000106 <+2>: mov r4, r0
0x00000108 …Run Code Online (Sandbox Code Playgroud)