Tag: arm

使用可装入内核模块修改framebuffer(/ dev / graphics / fb0)参数

问题:我必须配置Android平台使用的各种LCD显示器。 几乎在所有情况下,没有可用于LCD显示器的电气规格。 但通过经验和逆向工程,可以很好地猜测参数。 我正在尝试使用可加载内核模块来微调显示参数(欢迎任何其他建议)。 请在下面找到相关信息。 HW: Atmel SAMA5D31-EK(ARM 5处理器) SW:来自board-dt.c文件的Andriod Linux(目标),Ubuntu(主机系统),Sourcery CodeBench(交叉编译器)代码片段 static struct fb_videomode at91_tft_vga_modes[] = { ….. .xres =435; .yres =235; …. } static struct fb_monspecs at91fb_default_monspecs = { ……… .modedb = at91_tft_vga_modes, …… } static struct atmel_lcd_fb_info __initdata ek_lcdc_data = { ………. .default_monspecs = & at91fb_default_monspecs; ……… } 我添加了此代码,以便可加载内核模块可以访问lcdc_data结构 extern void set_fb_video(struct […]

编译ARM NEON时出现未知的GCC错误(严重)

我有一个基于ARM NEON Cortex-A8的处理器目标。 我通过使用NEON来优化我的代码。 但是当我编译我的代码时,我得到了这个奇怪的错误。 不知道如何解决这个问题。 我正在尝试使用主机上的Code Sourcery(PART2)编译以下代码(第1部分)。 我得到了这个奇怪的错误(PART3)。 我在这里做错了吗? 任何人都可以编译它,看看他们是否也得到相同的编译错误? 奇怪的是,在代码中,如果我注释掉else if(step_size == 4)代码的一部分,那么错误就会消失。 但是,遗憾的是我的优化并不完整,所以我必须拥有它。 起初我认为它是CodeSourcey编译器(在我的主机上)的问题,所以我直接在我的目标上编译程序(我的目标在Ubuntu上运行)。 我在那里使用了gcc,再一次,我得到了同样的错误,当我注释掉else if(step_size == 4)部分时,错误就消失了。 救命! 第1部分 #include #include”arm_neon.h” #define IMAGE_HEIGHT 480 #define IMAGE_WIDTH 640 float32_t integral_image[IMAGE_HEIGHT][IMAGE_WIDTH]; float32x4_t box_area_compute3(int, int , int , int , unsigned int , float); inline int min(int, int); int main() { box_area_compute3(1, 1, 4, […]

LDR – 文字池 – ARM

我知道如何使用ARM中的LDR指令加载立即值。 例如: LDR R0,=0x0804c088该指令将值( 0x0804c088 )加载到寄存器r0 。 当我尝试访问地址时,它使用gdb使用x/x $r0存储。 我收到消息: Cannot access memory at address 0x0804c088的Cannot access memory at address 。 但这不是地址,它是存储在该寄存器中的值,地址是存储在文字池中的PC相对地址。 我在那里做的错误是什么? 我明白了吗? 而且,我该如何设置文字池,你能给我一个例子吗? @Carl Norum:这是代码。 __asm__(“LDR R0,=0x0804c088”); __asm__(“LDR R1,[PC, #34];”); 来自gdb的O / p (gdb) info registers r0 0x804c088 134529160 r1 0xf2c00300 4072669952 r2 0x0 0 r3 0x1 1 r4 0x8961 35169 r5 0x0 […]

在arm-linux中打印堆栈跟踪

我按照这篇文章打印堆栈跟踪如何在我的gcc C ++应用程序崩溃时生成堆栈跟踪。 它在x86 linux中运行良好。 谁能教我如何让它在arm-linux上运行? 我正在使用arm-linux-gcc 4.4.3。 [root@FriendlyARM /]# ./test1 Error: signal 11: [0x0] 在x86中 mickey@mickeyvm:~/Desktop/workspace/test/testCatchSeg/src$ ./test1 Error: signal 11: ./test1(_Z7handleri+0x19)[0x804876d] [0xedd400] ./test1(_Z3bazv+0x10)[0x80487c2] ./test1(_Z3barv+0xb)[0x80487e1] ./test1(_Z3foov+0xb)[0x80487ee] ./test1(main+0x22)[0x8048812] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37] ./test1[0x80486c1] 这就是我为arm-linux编译的方法 arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg

未定义的引用`kill’

我在C中开发了一个ARM7嵌入式系统的应用程序。现在我想用C ++编译和链接它以便使用一些C ++特性。 为此,我使用的是mipsel-elf-g++而不是mipsel-elf-gcc 。 我可以使用mipsel-elf-g++成功编译我的代码,但在链接步骤中我得到错误: /opt/mipsel/lib/gcc/mipsel-elf/3.4.6/../../../../mipsel-elf/lib/libc.a(lib_a-abort.o):在函数“`abort’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c:63: undefined reference to d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c “`abort’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/stdlib/abort.c:63: undefined reference to _exit’` /opt/mipsel/lib/gcc/mipsel-elf/3.4.6/../../../../mipsel-elf/lib/libc.a(lib_a-signalr.o):在函数“`_kill_r’: /cygdrive/d/Files/cross/mips/newlib-1.15.0/newlib/libc/reent/signalr.c:61: undefined reference to kill’` collect2:ld返回1退出状态 我搜索了这个问题,发现我应该实现自己的_exit和kill函数,所以我将这些代码添加到我的项目中: void _exit(int code) { while(1); } int _DEFUN (kill, (pid, sig), int pid _AND int sig) { if(pid == __MYPID) _exit(sig); return 0; } 通过添加这两个函数,对“_exit”错误的未定义引用是固定的,但对“kill”错误的未定义引用仍然存在。 我该怎么做才能解决这个问题?

有人可以解释exynos ARM中的电源控制寄存器吗?

在Linux内核中,更准确地说是3.9- rc6上的/arch/arm/mach-exynos/cpuidle.c ,这些行读取 static unsigned int g_pwr_ctrl, g_diag_reg; static void save_cpu_arch_register(void) { /*read power control register*/ asm(“mrc p15, 0, %0, c15, c0, 0” : “=r”(g_pwr_ctrl) : : “cc”); /*read diagnostic register*/ asm(“mrc p15, 0, %0, c15, c0, 1” : “=r”(g_diag_reg) : : “cc”); return; } 在研究了这个问题后,这似乎是gcc内联汇编。 考虑到它是一个关键组件, asm正在阅读它 更快,因此更有效率 不适用于C. 我检查了ARM手册中的MCR因为我正在学习汇编,但我可以告诉MCR是一个协处理器,因为它有三个字母长度。 内联asm似乎访问功率控制寄存器并将结果(从寄存器)保存到第一行中的无符号整数(我希望在某个时刻调用)。 关于电源控制寄存器,臂手册列出, 实现Cortex-A9处理器的时钟延迟 动态时钟门控。 […]

在ARM Linux中,每个线程在内核堆栈“底部”保留​​的少数字节的目的是什么

问题 : 为什么在创建内核堆栈的“底部”时保留8个字节? 背景 : 我们知道struct pt_regs和thread_info共享相同的2个连续页面(8192个字节),其中pt_reg位于较高端, thread_info位于较低端。 但是,我注意到这两个页面的最高地址保留了8个字节: 在arch / arm / include / asm / threadinfo.h中 #define THREAD_START_SP (THREAD_SIZE – 8)

在core_cm4.h上为什么会像((uint32_t)(int32_t)IRQn那样)?

在core_cm4.h的以下代码中,为什么会有双重转换((uint32_t)(int32_t)IRQn) ? 例如,在以下function中: __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); } 这样做的目的是什么?

ARM程序集:在重新加载’asm’时无法在类’GENERAL_REGS’中找到寄存器

我试图在ARM Cortex-a8上实现一个函数,该函数将32位操作数与ARM组件中的256位操作数相乘。 问题是我的寄存器用完了,我不知道如何减少这里使用的寄存器的数量。 这是我的function: typedef struct UN_256fe{ uint32_t uint32[8]; }UN_256fe; typedef struct UN_288bite{ uint32_t uint32[9]; }UN_288bite; void multiply32x256(uint32_t A, UN_256fe* B, UN_288bite* res){ asm ( “umull r3, r4, %9, %10;\n\t” “mov %0, r3; \n\t”/*res->uint32[0] = r3*/ “umull r3, r5, %9, %11;\n\t” “adds r6, r3, r4; \n\t”/*res->uint32[1] = r3 + r4*/ “mov %1, r6; \n\t” “umull […]

返回寄存器中的结构 – GCC中的ARM ABI

在ARM ABI文档中,我遇到了如下定义的函数: __value_in_regs struct bar foo(int a, int b) { … } 但是GCC( 4.3.3 )不允许它,我能找到的只是对一些RealView编译器的引用。 从GCC有没有办法做到这一点? 我已经尝试过-freg-struct-return但它并没有什么区别。 因为它是一个ABI我无法改变原始程序,并返回一个常规结构破坏堆栈。 如果可以避免,我宁愿不使用组件,因为它没有必要。 谢谢!