标签: arm

为什么使用指针(低优化)会使程序更快?

我正在学习嵌入式 C 编程教程,然后意识到使用指针指向变量,然后使用它来取消引用可以使程序更快!

我有汇编的基本知识,但我不明白为什么将变量的地址分配给指针会更快,我们不是在谈论按引用或按指针或按值传递!

据我所知,

  • 没有指针的代码:内存地址已分配给寄存器R0,就像带有指针的代码中发生的情况一样。
  • 成为p_int寄存器的别名R0,这如何帮助使程序更快?

不使用指针的代码:

int counter = 0;
int main() {
    while (counter < 6) {
        ++(counter);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么大会就会像在此输入图像描述

相反,下面是带有指针的代码:

int counter = 0;
int main() {
    int *p;
    p = &counter;
    while (*p < 6) {
        ++(*p);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么大会就会像在此输入图像描述


更新

我联系了课程创建者,他很友善地为我重播并分解了它,为了帮助其他可能遇到同样问题的人,我将留下问题和答案

为了访问内存中的变量,CPU 需要该变量在寄存器之一中的地址。在最低级别的代码优化中,编译器在每次访问变量之前从代码存储器加载该地址。指针加快了速度,因为作为 main() 函数内的局部变量被分配到寄存器。这意味着该地址位于寄存器中(在本例中为 R0),不需要每次都加载并重新加载到寄存器中。在更高级别的优化下,编译器会生成更合理的代码,并且不带指针的代码与带指针的代码一样快。--彩信

c embedded assembly arm iar

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

如何使用Qemu查看内存中的内容

我正在 Qemu 中尝试这个用于 armv5 connex 板的汇编程序。我添加两个数字并将它们存储在位置标签结果中。我无法在内存位置查看结果值 40,但寄存器值 r4 = 0x28。

    .data
val1:   .4byte 10
val2:   .4byte 30
result: .4byte 0

    .text
    .align
start:
    ldr r0, =val1
    ldr r1, =val2

    ldr r2, [r0]
    ldr r3, [r1]

    add r4, r2, r3
    ldr r0, =result
    str r4, [r0]

stop:   b stop
Run Code Online (Sandbox Code Playgroud)

我的链接器脚本是

SECTIONS {
    . = 0x00000000;
    .text : {
        *(.text);
    }
    .data : {
        *(.data);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出

user@stretch:~/Desktop/Gnu_Toolchain/Data_In_Ram$ arm-none-eabi-nm -n data_in_ram.elf
00000000 t start
0000001c t stop
0000002c d val1
00000030 …
Run Code Online (Sandbox Code Playgroud)

assembly arm qemu

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

memcpy 击败 SIMD 内在函数

当 NEON 向量指令在 ARM 设备上可用时,我一直在寻找复制各种数据量的快速方法。

\n

我做了一些基准测试,并得到了一些有趣的结果。我试图理解我所看到的东西。

\n

我有四个版本来复制数据:

\n

1. 基线

\n

逐个元素复制:

\n
for (int i = 0; i < size; ++i)\n{\n    copy[i] = orig[i];\n}\n
Run Code Online (Sandbox Code Playgroud)\n

2. 霓虹灯

\n

此代码将四个值加载到临时寄存器中,然后将该寄存器复制到输出。

\n

因此,负载数量减少了一半。可能有一种方法可以跳过临时寄存器并将负载减少四分之一,但我还没有找到方法。

\n
int32x4_t tmp;\nfor (int i = 0; i < size; i += 4)\n{\n    tmp = vld1q_s32(orig + i); // load 4 elements to tmp SIMD register\n    vst1q_s32(&copy2[i], tmp); // copy 4 elements from tmp SIMD register\n}\n
Run Code Online (Sandbox Code Playgroud)\n

3. 阶梯式memcpy,

\n

使用memcpy,但一次复制 4 …

c++ performance arm simd intrinsics

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

ARM汇编如何将一个寄存器中的值存储到另一个寄存器中

假设寄存器 X12 包含值 5,并且我想将寄存器 X12 中的值移至 X13,我应该如何完成此操作?我已经学习了 LDR/STR/MOV,但我很困惑哪一个是实现这一目标的正确方法。以下是我能想到的方法,但我认为它们是错误的:

   LDR X13,[X12,#0]
   STR X12,[X13]
   MOV X13,X12
Run Code Online (Sandbox Code Playgroud)

assembly arm arm64

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

减去 0x1 - 0x80000000 如何导致溢出?

  MOV   R0, #0x80000000 
  MOV   R1, #0x1 
  SUBS  R2, R1, R0
Run Code Online (Sandbox Code Playgroud)

运行此代码后,将设置标志 N 和 Z。现在,我知道如果运算结果为负,则设置 N 标志,而当发生溢出时设置 Z 标志。

我不明白的是,如何0x1 - 0x80000000 导致溢出。任何帮助表示赞赏!

assembly arm thumb

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

AArch64 Neon 和 SVE 软件优化指南

有 ARM 软件优化指南(例如, neoverse n1 的https://developer.arm.com/documentation/srog309707/latest)。

本指南似乎不包含 Neon 或 SVE 的延迟和吞吐量。NEON 或 SVE 是否有单独的指南(例如,INSR (SIMD&FP scalar)指令的指令延迟和吞吐量)?

指针会非常有帮助!

arm neon arm64 sve

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

ARM v7:32 位浮点的 SIMD 查找表

我有一个 float32 数字向量。对于每个元素,我必须找到 cos,sin

我想使用查找表而不是默认库。是否有 ARM 内部代码可以用于此目的?

arm intrinsics neon

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

为什么中断在 STM32 上没有按预期工作?

我正在尝试编写一个简单的程序,该程序利用外部中断来控制 2 个 LED 中的哪一个闪烁。在没有中断例程的情况下,两个 LED 都会闪烁,因此 LED 引脚(PB 和 PC13)的配置是正确的。每当我尝试使用 ISR 时就会出现该程序。我正在为 STM32F103C8 MCU 使用仅带有 CMSIS 内核的 Keil uVision 5。

在下面的代码中,两个 LED 都没有闪烁。我试图将引脚 PB5 设置为输入上拉,并在将 PB5 与 GND 连接时检测下降沿作为中断。

#include "stm32f10x.h"                  // Device header

void delay(int rep);
void EXTI9_5_IRQHandler();

// global variable
int signal = 0; // this will change upon each interrupt

int main(void)
{
    // set RCC for PortC to enable the clock BUS
    RCC->APB2ENR |= (1<<4);
    // set RCC for portB to enable the clock bus …
Run Code Online (Sandbox Code Playgroud)

c embedded microcontroller arm stm32

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

使用c或c ++解码红外遥控代码

请告诉我如何使用c或c ++解码红外遥控代码.

c c++ embedded arm infrared

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

ARM平台的数据转换(来自x86/x64)

我们为x86和x64平台开发了win32应用程序.我们想在ARM平台上使用相同的应用程序.对于ARM平台,字节顺序会有所不同,即ARM平台通常使用Big endian格式.所以我们想在我们的设备应用程序中处理这个问题.

例如// In x86/x64, int nIntVal = 0x12345678
在ARM中, int nIntVal = 0x78563412

如何为ARM中的以下数据类型存储值?

  1. char数组即char chBuffer [256]
  2. Int64的

请澄清一下.

此致,Raphel

c c++ arm

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

标签 统计

arm ×10

assembly ×4

c ×4

c++ ×3

embedded ×3

arm64 ×2

intrinsics ×2

neon ×2

iar ×1

infrared ×1

microcontroller ×1

performance ×1

qemu ×1

simd ×1

stm32 ×1

sve ×1

thumb ×1