Tag: arm

ARM未对齐的内存访问解决方法

我必须将源代码移植到运行Linux的ARM平台。 不幸的是,我遇到了未对齐的内存访问问题。 源使用指针强制转换和访问。 像下面这样的代码像病毒一样遍布代码库。 由于gcc -Wcast-align命令行选项,我可以查明有问题的位置,但是有超过一千个实例要经历。 u = (IEC_BOOL); (((*(IEC_LINT*)pSP).H < bH) || (((*(IEC_LINT*)pSP).H == bH) && ((*(IEC_LINT*)pSP).L > u); *(IEC_DWORD OS_SPTR *)pSP = (IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP < bL))) ? 1 : 0); u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0); 使用echo 2 > /proc/cpu/alignment on会使Linux内核修复问题,但应用程序的性能会降低到不再可接受的程度。 我在网上搜索了类似于GCC(v4.4.1)编译器的__unaligned或__packed关键字,但截至目前为止还是空的。 我认为很多问题的代码行可以通过一个或多或少复杂的正则表达式/替换来修复,但现在,在我做了一段时间之后,我发现,这种方法也需要大量繁琐的工作。 你们有什么建议如何完成这项工作? 我认为一个gcc 4.5编译器插件会有点矫枉过正但是有没有比正则表达式好的东西? 您还能提出哪些其他建议? 不一定所有问题实例都必须修复,因为我仍然可以依赖内核来处理一些罕见的情况。

计算没有std函数或C99的atan2

我正在计算3轴加速度计的角度,但我的编译器没有atan或atan2function。 它有一个保留的内存插槽,但它调用了一个我在任何文件中都找不到的function。 我的编译器是运行ARMCC编译器的KeilμVision4。 编译有文件math.h,但函数是extern并且不存在: extern _ARMABI double atan2(double /*y*/, double /*x*/); 是否有我可以包含的lib或函数,它具有arctan函数的实现? 或者是否有另一种function来计算加速度计的角度? 我需要完整的3轴角度校准。 编辑:我希望避免一个充满预先计算值的表格。

SMC调用的Svc处理程序

如何在C中编写一个svc处理程序来调用SMC(监控模式)指令切换到arm cortex a9的监控模式? 即从主管模式到监控模式在svc处理程序中需要完成的工作,如何在C中编写相同的内容。详细解答赞赏…

带有objcopy的巨大二进制文件

我在ARM9处理器的基本C程序中定义全局变量时遇到问题。 我正在使用EABI GNU编译器,12KB精灵生成的二进制文件是4GB! 我假设问题出在我的分散文件中,但我无法理解它。 我有256KB的ROM(基地址0xFFFF0000)和32KB的RAM(基地0x01000000) SECTIONS { . = 0xFFFF0000; .text : { * (vectors); * (.text); } .rodata : { *(.rodata) } . = 0x01000000; sbss = .; .data : { *(.data) } .bss : { *(.bss) } ebss = .; bssSize = ebss – sbss; } 我的计划如下: int a=10; int main() { int […]

NEON pack vector将结果比较到位图

我有两个浮点操作数的比较结果如下; 我需要做的是基于比较的结果需要执行以下操作:即: neon_gt_res = vcgtq_f32(temp1, temp2); if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 但是这样的写作再次等同于多重比较。 我如何在氖C内在函数中以最佳方式编写它。 在x86上,这将是array[0] |= _mm_movemask_ps(cmp_gt_res);

学习嵌入式C / C ++开发的最佳评估套件是什么?

我正在尝试改进我在ARM体系结构上的嵌入式C / C ++开发。 我最近从68K开发转向ARM,并希望利用我的业余时间深入挖掘平台并学习最佳实践,尤其是开发移动平台。 优选地,32位架构将有助于支持开发工具。 学习过程中的一些乐趣可以增强我对平台的理解

使用硬件计数器测量ARM Cortex-A8上的执行时间

我正在使用Exynos 3110处理器(1 GHz单核ARM Cortex-A8,例如在Nexus S中使用),并尝试测量特定function的执行时间。 我在Nexus S上运行了Android 4.0.3。我尝试了这个方法 [1] 如何在ARM Cortex-A8处理器中测量程序执行时间? 我加载了内核模块以允许在用户模式下读取寄存器值。 我正在使用以下程序来测试计数器: static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile (“MRC p15, 0, %0, c9, c13, 0\t\n”: “=r”(value)); return value; } static inline void init_perfcounters (int do_reset, int enable_divider) { // in general enable all counters […]

哪些变量类型/大小在STM32微控制器上是primefaces的?

以下是STM32微控制器上的数据类型: http : //www.keil.com/support/man/docs/armcc/armcc_chr1359125009502.htm 。 这些微控制器使用32位ARM核心处理器。 哪些数据类型具有自动primefaces读取和primefaces写入访问权限? 我很确定所有32位数据类型都有(因为处理器是32位),并且所有64位数据类型都不行(因为读取或写入64位字需要至少2个处理器操作),但是bool (1字节)和uint16_t / int16_t (2字节)怎么样? 上下文:我在STM32上的多个线程(单核,multithreading,或称为FreeRTOS中的 “任务”)之间共享变量,需要知道是否需要通过关闭中断来强制执行primefaces访问,互斥体等 更新: 请参阅此示例代码: volatile bool shared_bool; volatile uint8_t shared u8; volatile uint16_t shared_u16; volatile uint32_t shared_u32; volatile uint64_t shared_u64; volatile float shared_f; // 32-bits volatile double shared_d; // 64-bits // Task (thread) 1 while (1) { // Write to the values in […]

Cortex M3的Bootloader

我正在使用mbed的LPC 1768板(带有cortex M3 cpu),我正在尝试在这里实现一些function,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是一个bootloader / nano-kernel,以及一个用户应用程序(helloworld将开始): 在0x00地址运行的Bootloader / nano-kernel,它会做一些检查并最终获取SD卡上的二进制文件 Bootloader / nano-kernel会将这个二进制文件复制到地址0x9000(以后可能需要更改,但bootloader / nano-kernel不会使用此空间,所以应该没问题) Bootloader跳转到0x9000 + 4的用户应用程序 Sd卡很容易解决,我遇到了跳跃部分的问题。 这是跳跃函数的代码。 void run(void) { void (*user_code_entry)(void); unsigned *p; SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80); // Load contents of second word of user flash – the reset handler address // in the applications vector table p = (unsigned *)(USER_FLASH_START […]

未对齐访问会导致ARM Cortex-M4出错

我有一个对象,其地址不是4字节对齐的。 当存在STR指令保存2个寄存器时,这会在cpu中导致HardFault错误。 这是生成的代码: 00000000 : 0: b510 push {r4, lr} 2: 4604 mov r4, r0 4: 6042 str r2, [r0, #4] 6: e9c4 3102 strd r3, r1, [r4, #8] a: 2001 movs r0, #1 c: 7420 strb r0, [r4, #16] e: b921 cbnz r1, 1a 这些是“4:6042 ……”行的寄存器 R0 08738B82 R8 0 R1 08738BAE R9 0 […]