标签: arm

在单独的.S文件中编写内联汇编

我试图将我的汇编代码与我的C代码分开,因为有关于另一个问题的建议,但我收到此错误:

arm-linux-gnueabihf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -mfpu=neon -o src/ASM.o ../src/ASM.c 
In file included from ../src/ASM.c:1:0:
../src/asm.S:1:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
 mul64x64asm:
      ^
Run Code Online (Sandbox Code Playgroud)

我尝试在一堆地方放一个分号,但它没有解决我的问题,即使它与这个问题无关,任何帮助都会受到赞赏.这是我的ASM.c和asm.S文件:

ASM.c

#include "asm.S"

int main(void) {
    extern  void mul64x64asm();
    mul64x64asm();
    return 1;

}
Run Code Online (Sandbox Code Playgroud)

asm.S

mul64x64asm:
      MOVW R0,0x12f4
      MOVT R0,0x5678
Run Code Online (Sandbox Code Playgroud)

更新:我尝试了建议的答案,最后得到了这个

arm-linux-gnueabihf-as -g --gstabs -o src/asm.o ../src/asm.S 
arm-linux-gnueabihf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -mfpu=neon -o src/ASM.o ../src/ASM.c 
arm-linux-gnueabihf-gcc -o ASM src/ASM.o src/asm.o ../src/asm.S 
src/ASM.o: In function `main':
/home/yunus/eclipse-workspace/ASM/Debug/../src/ASM.c:4: undefined reference …
Run Code Online (Sandbox Code Playgroud)

c eclipse assembly arm raspberry-pi3

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

无法打印正确的浮点值

我有我的ZC706板双臂皮质32bit一个.我试图在它上面运行一个算法,作为代码的一部分,它有浮点值.

uint32_t int Ts = 69912;
float Ts_pico;
Ts_pico = 20*(10^-12)*Ts;
printf("Time stamp in picoseconds is %f", Ts_pico);
Run Code Online (Sandbox Code Playgroud)

它打印的值为4272595456.000000而不是1.39824*(10 ^ -6)

所以我通过打印测试

printf("The float point value is %f", 1.39824);
Run Code Online (Sandbox Code Playgroud)

很好地打印出以下值.

接下来,当我通过打印测试时

double f = 10^-6;
printf("The flloat point value is %f", f);
Run Code Online (Sandbox Code Playgroud)

它打印的值是-14401872.000000

如何解决浮点值问题?

c floating-point arm

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

是否可以在运行时在M0 +上设置ISR处理程序

我的SAMD21 ARM M0 +有一个"默认"resetVectors.c文件.它有一些看起来像:

__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
    ...
};
Run Code Online (Sandbox Code Playgroud)

在其中定义不同的处理程序存根的位置.出于测试目的,我想使用其中一个未使用的外设IRQ.

默认情况下,未使用的设置为NULL地址.我已向自己证明我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序.但是,是否可以在编译时间之外完成此操作?

我观察到该表似乎是基于偏移0.所以我尝试了这个:

DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
Run Code Online (Sandbox Code Playgroud)

但这只是挂板.是否有动态方式在运行时分配处理程序?

c embedded arm isr

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

如何通过shell / bash检测386,amd64,arm或arm64 OS体系结构

我在寻找一个POSIX外壳/ bash命令来确定OS架构386amd64arm,或arm64

bash shell posix arm x86-64

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

在STM32上禁用IRQ

有没有办法禁用Cortex M3 MCU中的所有irq,除了一个?

我的问题是我有一个系统运行几种具有不同优先级的irq,我想禁用所有irq,除了特定状态的irq.

我知道我可以通过使用"__disable_irq()"指令来禁用所有irq,但是如果我之前没有调用"__enable_irq()",则在调用此指令后我无法启用一个irq.

谢谢你的帮助,

问候

c arm interrupt cortex-m3 stm32

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

为什么不能在mul指令中使用立即值?

我正在为ARMv7处理器编写指令.我想知道为什么我不允许在MUL指令本身中有一个常量值?您可以使用ADD和SUB指令,为什么不使用MUL?

干杯

assembly arm instruction-set armv7

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

ARM GCC:冲突的CPU体系结构

升级到ubuntu 18.04之后,我无法再编译我的应用程序。我正在将mbed-cli与st核子板一起使用。这是命令的输出mbed compile

[Warning] test.c@1926,32: unknown option after '#pragma GCC diagnostic' kind [-Wpragmas]
Link: sensors
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o: Conflicting CPU architectures 13/1
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc.a(lib_a-setjmp.o): Conflicting CPU architectures 13/1
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc.a(lib_a-setjmp.o)
collect2: error: ld returned 1 exit status
[ERROR] /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o: Conflicting CPU architectures 13/1
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc.a(lib_a-setjmp.o): Conflicting CPU …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc arm

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

具有Cortex M3和M4的LDREX / STREX

我正在阅读LDREX和STREX以实现互斥。通过查看ARM参考手册:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100166_0001_00_zh/ric1417175928887.html

看起来LDREX / STREX仅存储地址粒度是整个内存空间,因此仅允许在最多一个32位寄存器上使用LDREX / STREX。

这是正确的还是我错过了什么?如果这样的话,会使LDREX / STREX非常有限。我的意思是您可以做一些映射的互斥锁,也许可以得到32个互斥锁。

是否有人在M3或M4上使用LDREX / STREX?如果是,他们如何使用它?

arm

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

ARM64上浮点精度的奇怪问题

我在ARM64上遇到了一个非常奇怪的浮点精度问题.我有一个非常简单的C++代码,看起来像这样:

float sx = some_float_number_1;
float sy = some_float_number_2;
float ex = some_float_number_3;
float ey = some_float_number_4;
float px = ex;
float py = ey;

float d1 = (ex - sx) * (py - sy);
float d2 = (px - sx) * (ey - sy);

float d = d1 - d2;
float t = (ex - sx) * (py - sy) - (px - sx) * (ey - sy);

//32-bit output: d == t == 0
//64-bit output: d == …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point arm floating-accuracy arm64

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

为什么这个如果编译成无限循环?

下面的C代码:

s32 load_string(char* string_new, char const* string_orign)
{
    StrEntry *entry = search_str_entry(string_orign);
    u8        buff_b[32];
    u16       buff_u[32];
    s32       read_size = 0;
    void     *str_file = 0;

    if (entry != 0){
        cmemclr(buff_b, 32);
        cmemclr(buff_u, 64);
        sprintf(&buff_b[0], "c:/data/%03d.str", entry->fid);
        c2w(&buff_u[0], &buff_b[0], 32);
        if (TryOpenFile(&str_file, buff_u, OPEN_MODE_READ) == 0){
            cmemclr(string_new, 256);
            TryReadFile(&read_size, str_file, entry->offset, string_new, entry->size);

            CloseFile(str_file);
            return (s32)entry->size;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个函数的反汇编:

  003464ac <load_string>:
  3464ac:   e92d4010    push    {r4, lr}
  3464b0:   e1a00001    mov r0, r1
  3464b4:   ebffffda    bl  346424 <search_str_entry>
  3464b8:   e3500000    cmp …
Run Code Online (Sandbox Code Playgroud)

c assembly arm

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