标签: arm

ARM工具链编译库(buildroot)

我正在使用 buildroot 的工具链来交叉编译 ARM 应用程序。然而,某些应用程序需要的库不是为该工具链编译的。我的主机工具链上有这些库,例如 -ljack、lfftw 等。

我需要知道,如果我获得所需软件包的 tarball,那么如何配置它们,以便由 arm-gcc 编译这些库,并将标头/库复制到 buildroot 的 /usr 和 /include ?

这样我应该能够通过 buildroot 的工具链访问这些库。

谢谢,

gcc arm cross-compiling toolchain buildroot

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

了解 ARM ASM 中的函数调用

我正在反汇编本机 Android 库 (armeabi-v7a),这些库很可能是由 C++ 或 C 代码创建的,并且已被删除。目标是创建一个函数调用树以供以后分析。

我在理解反汇编输出时遇到问题。

采用以下创建的汇编器片段arm-linux-androideabi-objdump -d libledger.so > output.txt

00014988 <_ZSt10__pop_heapIN9__gnu_cxx17__normal_iteratorIPSsSt6vectorISsSaISsEEEENS0_5__ops15_Iter_less_iterEEvT_S9_S9_T0_>: 
   ...
   149e0:   4620        mov r0, r4
   149e2:   f030 fadd   bl  44fa0 <_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE+0x2a7ec>
   149e6:   e7ff        b.n 149e8 <_ZSt10__pop_heapIN9__gnu_cxx17__normal_iteratorIPSsSt6vectorISsSaISsEEEENS0_5__ops15_Iter_less_iterEEvT_S9_S9_T0_+0x60>
   149e8:   4628        mov r0, r5
   149ea:   f030 fad9   bl  44fa0 <_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE+0x2a7ec>
   149ee:   f004 fe55   bl  1969c <__cxa_end_cleanup>
   149f2:   bf00        nop
   149f4:   b154        cbz r4, 14a0c <_ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPSsSt6vectorISsSaISsEEEEiNS0_5__ops15_Iter_less_iterEEvT_S9_T0_T1_+0x14>
   149f6:   0005        movs    r5, r0

000149f8 <_ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPSsSt6vectorISsSaISsEEEEiNS0_5__ops15_Iter_less_iterEEvT_S9_T0_T1_>:
   149f8:   e92d 4ff0   stmdb   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, …
Run Code Online (Sandbox Code Playgroud)

c++ assembly android arm android-ndk

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

无法从 FIT 映像启动

我正在使用 Xilinx Zynq-7000 SoC,并尝试从“传统”(uImage + DTB + initramfs 映像)过渡到“现代”(FIT 映像)引导流程。这是我用来启动我的板的当前命令序列(输出省略):

setenv bootargs "console=ttyPS0,115200 root=/dev/ram rw ramdisk_size=0x1600000 earlyprintk init=/sbin/init"
tftpboot 0x2000000 devicetree.dtb
tftpboot 0x2080000 uImage
tftpboot 0x4000000 initramfs.img
bootm 0x2080000 0x4000000 0x2000000
Run Code Online (Sandbox Code Playgroud)

我正在开发一个现有项目,据我所知,TFTP 加载地址(0x2080000等)是任意的。我认为它们并不重要,除了它们映射到 RAM 并且不与加载地址重叠这一事实之外。如果我在这里错了,请纠正我。

执行该bootm命令会生成以下输出:

Zynq> bootm 0x2080000 0x4000000 0x2000000
## Booting kernel from Legacy Image at 02080000 ...
   Image Name:   Linux-4.0.0-00011-gcfd1f62
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3297728 Bytes = 3.1 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying …
Run Code Online (Sandbox Code Playgroud)

linux arm u-boot zynq

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

ARM WFI 不会休眠

我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。

经过调查,代码似乎WFI在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。

因此,在阅读了许多不清楚的规范之后,我的理解是,WFI如果存在待处理的中断,则可能不会进入睡眠状态。

  1. 你能确认最后一句话吗
  2. 如何确保在调用之前清除所有挂起的中断WFI

arm interrupt cortex-m

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

串行控制台通信如何在微控制器中工作?

我的疑问是关于通信的物理层,我从实践中知道,例如使用 teraterm 与 MCU 通信只是启用和配置 UART 外设,然后通过 USB 连接微控制器和瞧。

但对我来说,如果 USB 连接到 DN 和 DP,而 UART 使用 RX 和 TX,主机如何有效地与微控制器通信,这对我来说还没有意义?

c embedded microcontroller arm uart

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

嵌入式系统的 unsigned int 在哪里定义?

使用arm-none-eabi-gcc工具链。

在使用-nostdlib链接器中的选项进行ARM 开发期间,我可以使用 unsigned int、int 等。但是uint8_t我必须使用 --specs=nano.specs,因为它们在 newlib 标准库中。

那么是如何unsigned int解决的呢?

我一直在使用 IDE 进行 ARM 开发。因此不知道底层的东西是如何工作的。当我遇到这些疑问时,我正在学习一些裸机教程。

谢谢你。

c embedded arm bare-metal

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

如何避免在皮质 M4 上浮动的未对齐访问异常

我在某些计算带有整数操作数的浮点表达式的代码中遇到了 HardFault 异常。操作数按地址传递,然后将其转换(隐式或显式转换)为浮点数。当操作数不是 32 位对齐时(这不在我的控制之下),我得到异常。

我试图在这里重现 Godbolt 上的行为,生成的代码与我在设备上得到的一致。

基本上,下面的反汇编代码

vldr.32 s0, [r0]  @ int
Run Code Online (Sandbox Code Playgroud)

vldr需要对齐地址的指令中直接使用传递给函数的可能未对齐的地址。

我发现这个问题解决了类似的问题,但他们在那里谈论浮点指针。在这种情况下,我知道浮动不能未对齐。

在我的情况下,我正在处理整数,允许未对齐,但编译器假定它仍然可以使用 vldr 指令中的地址。更让我困惑的是这段代码

uint32_t pippo =  *(uint32_t *)src;

float pippof = pippo * 10.0f;
Run Code Online (Sandbox Code Playgroud)

当提供未对齐的地址时,可能会或可能不会产生异常,这取决于优化级别,因为-O0例如在堆栈上分配了一个整数。

所以我的问题是:

  • 这是编译器(或后端,也许)的正确行为吗?由于整数可以未对齐,我希望生成的代码从 CPU 寄存器传递。
  • 当即使通过临时 int 变量也不安全时,避免此类问题的正确策略是什么?

c assembly gcc arm memory-alignment

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

无法使用 GCC 编译 C

我所描述的尝试编译test.c的这个NanoPi新指南。但是,当我尝试运行 gcc 命令进行编译时,我收到此错误消息...

GNU ld (GNU Binutils for Ubuntu) 2.26.1
  Supported emulations:
   armelf_linux_eabi
   armelfb_linux_eabi
/usr/lib/gcc/arm-linux-gnueabihf/5/../../../arm-linux-gnueabihf/crt1.o: In function `_start':
(.text+0x28): undefined reference to `main'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

...命令...

sudo gcc -Wall -o test.c -lwiringPi -lpthread -Wl,-V
Run Code Online (Sandbox Code Playgroud)

...以及我正在尝试编译的代码...

#include <wiringPi.h>
int main(void)
{
  wiringPiSetup() ;
  pinMode (7, OUTPUT) ;
  for(;;)
  {
    digitalWrite(7, HIGH) ;
    delay (500) ;
    digitalWrite(7,  LOW) ;
    delay (500) ;
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以猜想这是一个可能的链接问题吗?我只是不确定,我真的知道如何改变它。在涉及 C、Linux 等主题时,我比较像新手。:)

c linux ubuntu gcc arm

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

为什么在许多 arm64 程序中的程序结束之前有 ab(分支)指令?

这是来自 linux 源代码 arch/arm64/kernel/head.S 显示内核启动。代码首先调用preserve_boot_args和下一个调用el2_setup使用bl(分支和链接)。我也展示了程序preserve_boot_args

SYM_CODE_START(primary_entry)
        bl      preserve_boot_args
        bl      el2_setup                       // Drop to EL1, w0=cpu_boot_mode
        adrp    x23, __PHYS_OFFSET
        and     x23, x23, MIN_KIMG_ALIGN - 1    // KASLR offset, defaults to 0
        bl      set_cpu_boot_mode_flag
        bl      __create_page_tables
        /*
         * The following calls CPU setup code, see arch/arm64/mm/proc.S for
         * details.
         * On return, the CPU will be ready for the MMU to be turned on and
         * the TCR will have been set.
         */
        bl …
Run Code Online (Sandbox Code Playgroud)

assembly arm abi eabi arm64

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

如何测量 C 中任意函数调用使用的堆栈量?

我们公司买了一个专有的 C 函数:我们有一个编译库ProcessData.a和一个接口文件来调用它:

# ProcessData.h
void ProcessData(char* pointer_to_data, int data_len);
Run Code Online (Sandbox Code Playgroud)

我们想在ARM嵌入式 CPU上使用这个函数,我们想知道它可能使用多少堆栈空间。

问题:如何测量任意函数的堆栈使用情况

到目前为止,我尝试的是实现以下辅助功能:

static int* stackPointerBeforeCall;

void StartStackMeasurement(void) {
    asm ("mov %0, sp" : "=r"(stackPointerBeforeCall));
    // For some reason I can't overwrite values immediately below the
    // stack pointer. I suspect a return address is placed there.
    static int* pointer;
    pointer = stackPointerBeforeCall - 4;
    // Filling all unused stack space with a fixed constant
    while (pointer != &_sstack) {
        *pointer = 0xEEEEEEEE;
        pointer--; …
Run Code Online (Sandbox Code Playgroud)

c assembly callstack arm stack-size

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