Tag: arm

修复关于C / C ++和注册访问的知识

不可否认,我是C ++的新手。 不幸的是,我见过的大多数代码都使用asm调用或定义了一个extern函数,它的主体位于汇编文件中。 这就是为什么我很想找到下面的代码。 我已经研究了3天的代码库 。 从语法上讲,我理解下面代码的每一行; 除了那个重要的因为我不知道它是如何工作的! types.h定义了uintptr和uintptr (我见过它们) 当C和C ++代码混合时需要ifdef __cplusplus。 特别是因为extern C是C ++特定的。 如果gcc具有-fno-exceptions参数,则可以省略 volatile用于防止编译器进行任何优化,因为地址必须是完美的,因为它是从寄存器写入/读取的。 总而言之,我仍然不知道这段代码实际上是如何从寄存器写入或读取的。 #include #ifdef __cplusplus extern “C” { #endif static inline u32 read32 (uintptr nAddress) { return *(u32 volatile *) nAddress; } static inline void write32 (uintptr nAddress, u32 nValue) { *(u32 volatile *) nAddress = nValue; } […]

交叉编译或编译Native Arch for CPU Arch

编写依赖于CPU拱的软件时,例如在x86上运行的C代码或在ARM cpus上运行的C代码。 通常有两种方法可以编译这些代码,或者交叉编译到ARM CPU拱门(例如,如果你在x86系统上进行开发),或者将代码复制到本机arch cpu系统并进行天真编译。 我想知道原生方法和交叉编译方法是否有好处? 我注意到Fedora ARM团队正在使用慢速/低功耗ARM设备的构建服务器集群来“天真地”编译他们的Fedora ARM旋转……当然,由Red Hat支持的项目可以访问运行x86 cpu的一些强大的构建服务器这可以在1/2的时间内完成工作……为什么他们选择? 我是否通过交叉编译我的软件而错过了什么?

apcs-gnu ABI中的结构布局

对于此代码 : struct S { unsigned char ch[2]; }; int main(void) { _Static_assert( sizeof(struct S) == 2, “size was not 2”); } 使用带有ABI apcs-gnu (又名OABI或EABI版本0)的ARM的GCC(各种版本),我得到断言失败。 事实certificate结构的大小是4 。 我可以通过使用__attribute__((packed))解决这个问题; 但我的问题是: 使这个结构大小为4的理由是什么? 是否有任何文档指定此ABI中结构的布局? 在ARM网站上,我找到了aapcs (EABI第5版)的文档,它确实将此结构指定为大小为2; 但我找不到关于apcs-gnu任何信息。

ARM霓虹内在函数的深度变换

我试图绕过NEON内在函数,并认为我可以从一个例子开始并提出一些问题。 在这个实验中,我想将32位RGB转换为16位BGR。 将以下代码转换为使用NEON内在函数会有什么好的开始? 我在这里遇到的问题是16bit与我能看到的任何内在都不匹配。 有16×4 16×8等等。但我只是运气不好,围绕着我需要如何解决这个问题。 有小费吗? 这是我试图转换的代码。 typedef struct { uint16_t b:5, g:6, r:5; } _color16; static int depth_transform_32_to_16_c (VisVideo *dest, VisVideo *src) { int x, y; int w; int h; _color16 *dbuf = visual_video_get_pixels (dest); uint8_t *sbuf = visual_video_get_pixels (src); uint16x8 int ddiff; int sdiff; depth_transform_get_smallest (dest, src, &w, &h); ddiff = (dest->pitch […]

为什么Coredump文件不在这里生成?

我在这里有一个情况,几天前我能够在我的目标板上看到核心笨拙的文件,我通过在我的/etc/profile中添加“ulimit -c unlimited”来提供coredump生成支持。但是有人告诉我 这只会对从登录shell启动的程序产生影响,而不会对systemd启动的进程/服务产生影响,等等/限制将是设置这些默认设置的正确位置。 所以我更改了/ etc / limits文件并添加了“ulimit -c unlimited”行。但是现在我看不到Coredumped文件 我正在运行kill -9 $$来生成分段错误,它反过来会像之前那样生成coredump文件。 我们尝试更改“/ proc / sys / kernel / core_pattern”文件并明确地运行ulimit -c unlimited但它也没有运行 我们在哪里做错了?

强制GCC访问带有单词的结构

在ARM处理器(HT32F1655)上,寄存器的特定部分需要字访问。 从用户手册: 请注意,AHB总线中的所有外设寄存器仅支持字访问。 但是gcc在打包的结构上生成了一些ldrb (加载字节)和strb (存储字节)指令。 结构看起来像这样: typedef union { struct { uint32_t CKOUTSRC : 3; //!< CKOUT Clock Source Selection uint32_t : 5; uint32_t PLLSRC : 1; //!< PLL Clock Source Selection uint32_t : 2; uint32_t CKREFPRE : 5; //!< CK_REF Clock Prescaler Selection uint32_t : 4; uint32_t URPRE : 2; //!< USART Clock […]

在内核中查找进程的程序计数器

我正在尝试跟踪内核中特定进程的PC值。 为此,我查看了内核源代码并发现pc存储在task_struct->stack ,为了理解堆栈,我需要将其转换为struct thread_info * 。 因此,在gdb中,我设置了一个断点b scheduler_tick (每10ms调用一次)。 但是,当我打印出p/x ((struct thread_info *)curr->stack)->cpu_context.pc ,我收到的值为$4 = 0x804d19d8 。 我预计PC将低于0x80000000因为我的内核中的0x80000000以上的地址被配置为内核空间。 在查看内核的objdump输出时,我看到pc指向__schedule 。 对于我从用户空间开始的进程,PC不应该指向用户空间指令吗? 我的理解是,当一个中断被触发时,寄存器状态被保存,中断被服务,然后寄存器状态被恢复,所以程序继续,就像“没有”发生一样。

在为ARM7编译的C代码中,使用全局变量是增加还是降低性能?

在为ARM7嵌入式平台编译时,在C代码中使用大量全局变量是否会降低或提高性能? 代码库由多个C源代码文件组成,这些文件使用extern关键字引用彼此的全局变量。 来自不同源代码文件的不同函数指的是不同的全局变量。 一些变量是数组。 我正在使用的编译器是IAR的EW ARM kickstart版本(32kb)。

ARM + gcc:不要使用一个大的.rodata部分

我想用gcc编译一个带有ARM处理器链接时间优化的程序。 当我在没有LTO的情况下编译时,系统会被编译。 当我启用LTO(使用-flto)时,我得到以下汇编程序错误: 错误:文字常量无效:池需要更近 环顾网络,我发现这与我系统中的常量有关,这些常量放在一个名为.rodata的特殊部分中,它被称为常量池,位于我系统中的.text部分之后。 似乎在使用LTO进行编译时,由于内联和其他优化,这个.rodata部分离指令太远,因此不再可能寻址常量。 是否可以在使用它们的函数之后放置常量? 或者是否可以使用其他寻址模式,以便仍然可以解决.rodata部分? 谢谢。

在嵌入式设备上投射指针

在32位嵌入式系统上投射和修改指针时遇到了一个奇怪的问题(运行contiki OS的 redbee econotag是特定的)。 uint32_t array[2]; array[0] = 0x76543210; array[1] = 0xfedcba98; uint8_t* point = ((uint8_t*)array)+1; printf(“%08x \n”, *(uint32_t*)point ); 在我的电脑上输出: 98765432 嵌入式设备上的输出: 10765432 我的计算机的行为与我期望的一样,但嵌入式设备似乎在它到达单词的末尾时回滚。 为什么会这样?