我正在使用 buildroot 的工具链来交叉编译 ARM 应用程序。然而,某些应用程序需要的库不是为该工具链编译的。我的主机工具链上有这些库,例如 -ljack、lfftw 等。
我需要知道,如果我获得所需软件包的 tarball,那么如何配置它们,以便由 arm-gcc 编译这些库,并将标头/库复制到 buildroot 的 /usr 和 /include ?
这样我应该能够通过 buildroot 的工具链访问这些库。
谢谢,
我正在反汇编本机 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) 我正在使用 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) 我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。
经过调查,代码似乎WFI在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。
因此,在阅读了许多不清楚的规范之后,我的理解是,WFI如果存在待处理的中断,则可能不会进入睡眠状态。
WFI?我的疑问是关于通信的物理层,我从实践中知道,例如使用 teraterm 与 MCU 通信只是启用和配置 UART 外设,然后通过 USB 连接微控制器和瞧。
但对我来说,如果 USB 连接到 DN 和 DP,而 UART 使用 RX 和 TX,主机如何有效地与微控制器通信,这对我来说还没有意义?
使用arm-none-eabi-gcc工具链。
在使用-nostdlib链接器中的选项进行ARM 开发期间,我可以使用 unsigned int、int 等。但是uint8_t我必须使用 --specs=nano.specs,因为它们在 newlib 标准库中。
那么是如何unsigned int解决的呢?
我一直在使用 IDE 进行 ARM 开发。因此不知道底层的东西是如何工作的。当我遇到这些疑问时,我正在学习一些裸机教程。
谢谢你。
我在某些计算带有整数操作数的浮点表达式的代码中遇到了 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例如在堆栈上分配了一个整数。
所以我的问题是:
我所描述的尝试编译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 等主题时,我比较像新手。:)
这是来自 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) 我们公司买了一个专有的 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)