我想创建自己的启动、链接器脚本和初始化文件,配置 makefile 和 gcc-toolchain。我在哪里可以找到有关它的资源、教程等?也许一些最小的示例实现?
我的课程笔记总是在他们的 ARM 代码片段中使用 ADDS 和 SUBS,而不是我期望的 ADD 和 SUB。例如,这是一个这样的片段:
__asm void my_capitalize(char *str)
{
cap_loop
LDRB r1, [r0] // Load byte into r1 from memory pointed to by r0 (str pointer)
CMP r1, #'a'-1 // compare it with the character before 'a'
BLS cap_skip // If byte is lower or same, then skip this byte
CMP r1, #'z' // Compare it with the 'z' character
BHI cap_skip // If it is higher, then skip this byte
SUBS r1,#32 // Else …Run Code Online (Sandbox Code Playgroud) 我对 linux 还很陌生,我目前正在尝试将 gps 模块集成到 linux ARM 控制器中。gps 是 ublox NEO M8N,我将它连接到 UART6。我需要帮助才能开始与 GPS 通信。我搜索了一些文件,但找不到任何相关的文件。我知道我首先需要为它编写内核设备驱动程序,但是我不知道从哪里开始。有人可以指出我正确的方向,或者告诉我如何编写设备驱动程序并开始从 GPS 读取纬度和经度。
对于德州仪器的CC3220S,我用C语言开发了一个函数,使用内联汇编等待1秒(不包括循环前和循环外的指令)。根据ARMv7-M 参考手册,针对 PC 的 MOV 指令需要 1 + P 个指令周期,其中 P 介于 1 和 3 之间,具体取决于管道重新填充。最坏情况这意味着循环在 6 个时钟周期内执行。
CC3220S 的时钟速度为 80 MHz。然而,循环执行 1000 万次会产生 1 秒的期望延迟(用逻辑分析仪验证)。这意味着循环使用 8 个时钟周期。我对指令使用的时钟周期数表示怀疑。因此我的问题是,从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?
void delay_1sec(void)
{
__asm(" PUSH {r4-r5,lr}");
__asm(" LDR r4, [pc, #12]");
__asm(" MOV r5, pc");
__asm(" NOP");
__asm(" SUBS r4, #1"); /* 1 instruction cycle */
__asm(" ITE NEQ"); /* 1 instruction cycle */
__asm(" MOV pc, r5"); /* 1 + P instructions (where P is …Run Code Online (Sandbox Code Playgroud) 我在汇编文件中有以下指令:
MULS R0, R0, R2
Run Code Online (Sandbox Code Playgroud)
使用 gcc (gcc -o prog pros.s) 可以很好地进行组装,并且程序可以正常工作。当我使用 as 进行汇编(as -o prog.o pros.s)时,我得到:
Rd and Rm should be different in mul
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
#include <stdio.h>
void fun();
int main()
{
int a = 10;
fun();
return 0;
}
void fun()
{
int a = 5;
}
Run Code Online (Sandbox Code Playgroud)
汇编代码。
000103e4 <main>:
103e4: e52db008 str fp, [sp, #-8]!
103e8: e58de004 str lr, [sp, #4]
103ec: e28db004 add fp, sp, #4
103f0: e24dd008 sub sp, sp, #8
103f4: e3a0300a mov r3, #10
103f8: e50b3008 str r3, [fp, #-8]
103fc: eb000005 bl 10418 <fun>
10400: e3a03000 mov r3, #0
10404: e1a00003 mov r0, r3
10408: e24bd004 sub sp, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 gcc arm 在 arm7tdmi-s 上实现一些“OSEK-Services”。不幸的是,提高优化级别会导致“错误”的代码生成。我不明白的主要事情是编译器似乎忽略了过程调用标准,例如通过将参数移动到寄存器 r0-r3 将参数传递给函数。我知道函数调用可以内联,但参数仍然需要在寄存器中才能执行系统调用。
考虑以下代码来演示我的问题:
unsigned SysCall(unsigned param)
{
volatile unsigned ret_val;
__asm __volatile
(
"swi 0 \n\t" /* perform SystemCall */
"mov %[v], r0 \n\t" /* move the result into ret_val */
: [v]"=r"(ret_val)
:: "r0"
);
return ret_val; /* return the result */
}
int main()
{
unsigned retCode;
retCode = SysCall(5); // expect retCode to be 6 when returning back to usermode
}
Run Code Online (Sandbox Code Playgroud)
我在汇编中编写了顶级软件中断处理程序,如下所示:
.type SWIHandler, %function
.global SWIHandler
SWIHandler:
stmfd sp! , …Run Code Online (Sandbox Code Playgroud) 本周我在 Xcode 上为 2 个不同的应用程序创建了 2 个新项目。由于某种原因,项目之一总是无法为设备目标编译。然后我意识到两个项目的设备目标是不同的。对于工作项目“Any iOS Project (arm64)” 构建失败的项目有“Any iOS Project (armv7, arm64)”
是什么导致设备目标以这种方式改变,有什么区别?
我正在努力让我的应用程序为 Apple Silicon 做好准备。我的应用程序目前使用适用于 Mac 的 SSE 指令和适用于 iOS 的等效 Neon 实现。
Apple 移植指南建议转向 Accelerate 框架,我现在还没有准备好。
有没有办法在 Apple 芯片的通用二进制文件中继续使用 SSE/neon(基于架构)?我可以看到 arm64_neon.h 不适用于 Apple Silicon。
我正在设计一个带前缀的可变长度整数。
Rust 有计算前导和尾随 1 和 0 的方法:https : //doc.rust-lang.org/std/primitive.u64.html#method.leading_zeros
这些方法在 x86_64、arm32 和 arm64 上的效率有什么不同吗?
例如,如果计算尾随的 1 比尾随的零更快,我将使用 xxxx0111 而不是 xxxx1000 作为长度编码字节(在本例中,对于后面的三个字节)。