Tag: arm

程序接收信号SIGTRAP,跟踪/断点陷阱

我正在调试一个(嵌入式)软件。 我在一个函数上设置了一个断点,由于某种原因,一旦我到达那个断点并continue我总是回到函数(这是一个初始化函数,只能调用一次)。 当我删除断点并continue ,GDB告诉我: Program received signal SIGTRAP, Trace/breakpoint trap. 由于我正在使用断点,我假设我陷入了“断点陷阱”。 什么是断点陷阱?

使用NEON内在函数除以浮点数

我当时正在处理一个四像素的图像,这在Android应用程序的armv7 。 我想将float32x4_t向量除以另一个向量,但其中的数字从大约0.7到3.85不等,在我看来,除法的唯一方法是使用右移,但这是一个2^n 。 此外,我是新手,所以欢迎任何建设性的帮助或评论。 例: 如何使用NEON内在函数执行这些操作? float32x4_t a = {25.3,34.1,11.0,25.1}; float32x4_t b = {1.2,3.5,2.5,2.0}; // somthing like this float32x4 resultado = a/b; // {21.08,9.74,4.4,12.55}

测量皮质m7上的时钟周期计数

我一直在测量皮层m4上的时钟周期计数,现在想在皮层m7上进行测量。 我使用的主板是STM32F746ZG。 对于m4,一切顺利: volatile unsigned int *DWT_CYCCNT; volatile unsigned int *DWT_CONTROL; volatile unsigned int *SCB_DEMCR; void reset_cnt(){ DWT_CYCCNT = (volatile unsigned int *)0xE0001004; //address of the register DWT_CONTROL = (volatile unsigned int *)0xE0001000; //address of the register SCB_DEMCR = (volatile unsigned int *)0xE000EDFC; //address of the register *SCB_DEMCR = *SCB_DEMCR | 0x01000000; *DWT_CYCCNT = 0; […]

Hello world,裸机Beagleboard

我正试图在我的Beagleboard-xm rev上运行一个’hello world’类型的程序。 C,通过从程序puts调用C puts函数。 到目前为止,我一直在使用它作为参考: http : //wiki.osdev.org/ARM_Beagleboard 这是我到目前为止所拥有的,但没有输出。 你好ç volatile unsigned int * const UART3DR = (unsigned int *)0x49020000; void puts(const char *s) { while(*s != ‘\0’) { *UART3DR = (unsigned int)(*s); s++; } } void hello() { puts(“Hello, Beagleboard!\n”); } boot.asm .global start start: ldr sp, =stack_bottom bl hello b . linker.ld […]

尝试在目标设备上运行交叉编译的可执行文件失败:没有这样的文件或目录

我陷入了不那么阳光明媚的交叉编译世界。 我正在尝试为我的BeagleBone Black(运行TI Cortex-A8处理器)编译一个简单的hello world应用程序。 首先,我使用gcc在x86上编译并成功运行了hello world应用程序 然后我将编译设置更改为以下内容: arm-linux-gnueabi-gcc -c -O0 -g3 -Wall main.c -o bin/obj/main.o arm-linux-gnueabi-gcc bin/obj/main.o -o bin/hello_world 我通过SCP将文件传输到BeagleBone,并使用chmod +x hello_world设置可执行权限 运行它( ./hello_world )后,我唯一的回答是: -bash: ./hello_world: No such file or directory file的输出与/sbin/init的输出匹配,正如我所期望的那样: $ file hello_world hello_world: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x24b659b7a41fe043a6f4649d4ebfb5e692ebf0c7, […]

每个周期的ARM M4指令(IPC)计数器

我想计算在ARM cortex-M4(或cortex-M3)处理器上执行的每个周期的指令数。 它需要的是:我想要分析的代码的指令数量 (在运行时执行)以及代码执行的周期数 。 1 – 周期数 使用循环计数器非常简单直接。 volatile unsigned int *DWT_CYCCNT ; volatile unsigned int *DWT_CONTROL ; volatile unsigned int *SCB_DEMCR ; void reset_timer(){ DWT_CYCCNT = (int *)0xE0001004; //address of the register DWT_CONTROL = (int *)0xE0001000; //address of the register SCB_DEMCR = (int *)0xE000EDFC; //address of the register *SCB_DEMCR = *SCB_DEMCR | 0x01000000; […]

如何在ARM Cortex-a8中使用乘法和累加内在函数?

如何使用GCC提供的Multiply-Accumulate内在函数? float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t); 任何人都可以解释我必须传递给这个函数的三个参数。 我的意思是源和目标寄存器以及函数返回的内容? 救命!!!

mutex_unlock是否可用作内存栅栏?

我将描述的情况发生在iPad 4(ARMv7s)上,使用posix libs进行互斥锁定/解锁。 我在其他ARMv7设备上看到过类似的东西(见下文),所以我想任何解决方案都需要更全面地了解ARMv7的互斥锁和内存栅栏的行为。 场景的伪代码: 线程1 – 生成数据: void ProduceFunction() { MutexLock(); int TempProducerIndex = mSharedProducerIndex; // Take a copy of the int member variable for Producers Index mSharedArray[TempProducerIndex++] = NewData; // Copy new Data into array at Temp Index mSharedProducerIndex = TempProducerIndex; // Signal consumer data is ready by assigning new Producer Index to […]

如何获得调用堆栈回溯? (深入嵌入,没有库支持)

我希望我的exception处理程序和调试函数能够打印调用堆栈回溯,基本上就像glibc中的backtrace()库函数一样。 不幸的是,我的C库(Newlib)没有提供这样的调用。 我有这样的事情: #include // GCC’s internal unwinder, part of libgcc _Unwind_Reason_Code trace_fcn(_Unwind_Context *ctx, void *d) { int *depth = (int*)d; printf(“\t#%d: program counter at %08x\n”, *depth, _Unwind_GetIP(ctx)); (*depth)++; return _URC_NO_REASON; } void print_backtrace_here() { int depth = 0; _Unwind_Backtrace(&trace_fcn, &depth); } 这基本上有效,但结果痕迹并不总是完整的。 例如,如果我这样做 int func3() { print_backtrace_here(); return 0; } int func2() { return […]

((Port *)0x41004400UL)在这里是什么意思?

我正在开发一种基于32位ARM的微控制器的开发板(即电路板是Atmel SAM D21J18A)。 我还处于学习阶段,我还有很多工作要做,但我真的很喜欢嵌入式系统。 我有一些C背景。但是,这显然是不够的。 我正在查看Atmel的一个示例项目的代码,我并没有真正得到它的一些部分。 这是其中之一: #define PORT ((Port *)0x41004400UL) /**< \brief (PORT) APB Base Address */ 端口定义为: typedef struct { PortGroup Group[2]; /**< \brief Offset: 0x00 PortGroup groups [GROUPS] */ } Port; 和PortGroup定义为: typedef struct { __IO PORT_DIR_Type DIR; /**< \brief Offset: 0x00 (R/W 32) Data Direction */ __IO PORT_DIRCLR_Type DIRCLR; /**< \brief […]