标签: arm

从头开始创建 cortex-m7 项目从哪里开始

我想创建自己的启动、链接器脚本和初始化文件,配置 makefile 和 gcc-toolchain。我在哪里可以找到有关它的资源、教程等?也许一些最小的示例实现?

gcc arm cortex-m

1
推荐指数
1
解决办法
1114
查看次数

在 ARM 汇编中使用 ADDS 指令而不是 ADD 指令的原因是什么?

我的课程笔记总是在他们的 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)

arm cortex-m

1
推荐指数
2
解决办法
5506
查看次数

gps 模块的 Linux 设备驱动程序

我对 linux 还很陌生,我目前正在尝试将 gps 模块集成到 linux ARM 控制器中。gps 是 ublox NEO M8N,我将它连接到 UART6。我需要帮助才能开始与 GPS 通信。我搜索了一些文件,但找不到任何相关的文件。我知道我首先需要为它编写内核设备驱动程序,但是我不知道从哪里开始。有人可以指出我正确的方向,或者告诉我如何编写设备驱动程序并开始从 GPS 读取纬度和经度。

linux arm linux-device-driver linux-kernel uart

1
推荐指数
1
解决办法
2925
查看次数

从 ARM 购买 IP 的半导体制造商是否应该满足参考手册中描述的指令的时钟周期?

对于德州仪器的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)

assembly arm instruction-set

1
推荐指数
1
解决办法
63
查看次数

使用 gcc 和 as 在 ARM 上汇编 MULS 指令

我在汇编文件中有以下指令:

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)

知道为什么吗?

assembly gcc arm raspberry-pi

1
推荐指数
1
解决办法
222
查看次数

有什么用!字符在ARM汇编中做什么?

#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)

assembly arm addressing-mode

1
推荐指数
1
解决办法
113
查看次数

gcc arm 在系统调用之前优化掉参数

我正在尝试使用 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)

c assembly arm system-calls inline-assembly

1
推荐指数
1
解决办法
105
查看次数

Xcode 构建目标差异——arm64 和 armv7、arm64

本周我在 Xcode 上为 2 个不同的应用程序创建了 2 个新项目。由于某种原因,项目之一总是无法为设备目标编译。然后我意识到两个项目的设备目标是不同的。对于工作项目“Any iOS Project (arm64)” 构建失败的项目有“Any iOS Project (armv7, arm64)”

是什么导致设备目标以这种方式改变,有什么区别?

xcode arm ios

1
推荐指数
1
解决办法
1726
查看次数

对 Apple Silicon 的 SSE/neon 支持

我正在努力让我的应用程序为 Apple Silicon 做好准备。我的应用程序目前使用适用于 Mac 的 SSE 指令和适用于 iOS 的等效 Neon 实现。

Apple 移植指南建议转向 Accelerate 框架,我现在还没有准备好。

有没有办法在 Apple 芯片的通用二进制文件中继续使用 SSE/neon(基于架构)?我可以看到 arm64_neon.h 不适用于 Apple Silicon。

macos arm sse neon apple-silicon

1
推荐指数
1
解决办法
462
查看次数

计算前导/尾随 1/0 的效率有什么不同吗?

我正在设计一个带前缀的可变长度整数。

Rust 有计算前导和尾随 1 和 0 的方法:https : //doc.rust-lang.org/std/primitive.u64.html#method.leading_zeros

这些方法在 x86_64、arm32 和 arm64 上的效率有什么不同吗?

例如,如果计算尾随的 1 比尾随的零更快,我将使用 xxxx0111 而不是 xxxx1000 作为长度编码字节(在本例中,对于后面的三个字节)。

arm bit-manipulation x86-64 rust varint

1
推荐指数
1
解决办法
330
查看次数