Tag: arm

如何使用Neon SIMD将unsigned char转换为有符号整数

如何使用Neon将数据类型uint8_t的变量转换为int32_t ? 这样做我找不到任何内在的东西。

如何告诉编译器使用ARM的硬件浮点指令

我正在为ARM编译程序。 makefile有一个标志-msoft-float ,告诉编译器使用软件浮点仿真。 我的问题是如何在makefile中指定使用硬件浮点指令。 我试过-mhard-float ,但如果我这样做,我就会出错。 我也尝试过-msoftfp-float,因为这个网站告诉我,但编译器甚至都没有识别出那个标志。 那么,请告诉我应该如何解决这个问题。

GCC中-O0和-O1之间的差异

编译一些代码时,我注意到在-O0和-O1之间创建的汇编程序存在很大差异。 我想要启动启用/禁用优化,直到我发现导致汇编程序发生某些变化的原因。 如果我使用-fverbose-asm来确切地找出O1与O0相比启用了哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然如此大不同? 即使我用O0运行gcc并手动添加fverbose-asm所说的用O1启用的所有标志,我也没有得到与使用O1时相同的汇编程序。 除了’-f …’和’-m ……’之外还有什么可以改变的吗? 或者只是’O1’与无法关闭的’O0’相比具有一定的魔力。 对于含糊不清的内容感到抱歉 – 这与使用GCC + ARM减少递归期间的堆栈使用有关,但是提及它使问题有点难以理解。

#define vs. enums用于寻址外设

我必须在基于ARM9的微控制器中编程外设寄存器。 例如,对于USART,我将相关的内存地址存储在enum : enum USART { US_BASE = (int) 0xFFFC4000, US_BRGR = US_BASE + 0x16, //… }; 然后,我在函数中使用指针来初始化寄存器: void init_usart (void) { vuint* pBRGR = (vuint*) US_BRGR; *pBRGR = 0x030C; //… } 但我的老师说我最好使用#define ,例如: #define US_BASE (0xFFFC4000) #define US_BRGR (US_BASE + 0x16) #define pBRGR ((vuint*) US_BRGR) void init_usart (void) { *pBRGR = 0x030C; } 他说,就像这样,你没有在堆栈中分配指针的开销。 […]

在ARM中是否有与rdtsc等效的指令?

对于我的项目, 我必须使用内联汇编指令 (如rdtsc)来计算某些C / C ++指令的执行时间。 以下代码似乎适用于英特尔,但不适用于ARM处理器: {unsigned a, d;asm volatile(“rdtsc” : “=a” (a), “=d” (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);} //The C++ statement to measure its execution time {unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);} time = t1-t0; 我的问题是: […]

将打包数据与对齐的内存访问相结合

我正在尝试执行一个理论上可行的内存优化,但我开始怀疑是arm-elf-gcc的能力。 请告诉我,我错了。 我有一个嵌入式系统,主内存非常少,电池支持的nvram数量更少。 我将校验和配置数据存储在nvram中,以便在启动时我可以validation校验和并继续先前的运行或在校验和无效时开始新的运行。 在运行期间,我在此配置数据中更新了各种大小的各种字段(并且可以使校验和无效,直到稍后重新计算)。 所有这些都在物理地址空间中运行 – 正常的sram映射在一个位置,nvram映射到另一个位置。 这是擦除 – 所有对nvram的访问必须以32位字进行; 不允许字节或半字访问(虽然它在主存中显然很好)。 因此,我可以a)将所有配置数据的工作副本存储在主存储器中,并在重新计算校验和时将其存储到nvram中或b)直接在nvram中使用它,但不知何故说服编译器所有结构都是打包和所有访问不仅必须是32位对齐 ,还必须是32 位宽 。 选项a)浪费宝贵的主存储器,我宁愿通过选项b)进行运行时权衡以保存它(尽管不是代码大小最终浪费的东西比我节省的数据大小更多)。 我希望__attribute__ ((packed, aligned(4)))或其中的一些变体可以在这里提供帮助,但到目前为止我所做的所有阅读和实验都让我失望了。 这是我正在处理的配置数据的玩具示例: #define __packed __attribute__ ((packed)) struct __packed Foo { uint64_t foo; struct FooFoo foofoo; } struct __packed Bar { uint32_t something; uint16_t somethingSmaller; uint8_t evenSmaller; } struct __packed PersistentData { struct Foo; struct Bar; /* […]

arm-none-eabi-gcc:使用printf打印浮点数

我正在为SAM3N arm cortex-M3微控制器编写一个C程序。 当我尝试打印浮点数时,它只打印’f’。 示例: printf(“%f”,43.12); 仅打印f ,而不是43.12 。 但用整数打印效果很好。 如何启用浮动的完整打印? 我知道默认情况下,编译器禁用浮动打印以减少代码大小(即看起来,它们链接了缩减版本)。 另请注意,makefile中没有使用CFLAGS=-Dprintf=iprintf 。 工具详情: ARM / GNU C编译器:(crosstool-NG 1.13.1 – Atmel build:13)4.6.1 以上工具附带Atmel studio 6.0。

加载共享库时未定义的符号

在我的程序中,我需要使用dlopen()动态加载共享库。 程序和共享库都成功交叉编译为ARM体系结构,并在我的x86上安装了交叉编译器。 但是,每当程序尝试在ARM上运行时加载库时,它都会失败,并显示以下错误: 未定义的符号:_dl_hwcap 我找不到这个错误的罪魁祸首。 让我详细介绍如何在x86上构建共享库( libmyplugin.so )。 我使用g++交叉编译器如下: /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -march=armv7-a -mfloat-abi=hard -c -s -fPIC -o build/module1.o module1.cpp /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -march=armv7-a -mfloat-abi=hard -c -s -fPIC -o build/module2.o module2.cpp /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -o dist/libmyplugin.so build/module1.o build/module2.o –sysroot /home/me/arm/sysroot/ -Wl,–no-as-needed -ldl -lX11 -lXext /home/me/arm/libstatic.a -shared -s -fPIC 请注意以下注意事项: module1.cpp和module2.cpp是我的源代码文件。 libstatic.a是一个大型的对象.o文件存档,它实现了module1.cpp和module2.cpp直接调用/引用的东西。 这些目标文件已由其他人编译为与我相同的ARM体系结构,具有相同的编译器标志,但使用稍微更新的g++编译器( v4.9而不是我的v4.8.3 )。 不幸的是,我无法控制这些物体的构建。 –sysroot /home/me/arm/sysroot/表示我的ARM OS的远程文件系统,本地g++交叉编译器在链接时可以从中获取本机库。 -Wl,–no-as-needed -ldl -lX11 […]

未定义的_sbrk引用

我遇到了_sbrk的问题。 在编译的链接阶段,我使用下面的命令链接我的对象,我得到未定义的引用_sbrk。 arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a 我正在编译arm926ej-s并在ARM模式下,所以我想我选择了正确的multilib(libc.a和libgcc.a),它位于文件夹home / ziga / projects / cs_lite / arm-none-eabi / lib / 。 我一直在网上搜索_sbrk函数,它是某种内存管理调用,它不包含在标准C库中,因为它依赖于微处理器。 所以我必须自己编写_sbrk函数吗? 我该怎么做? 你有arm926ej-s的例子吗? 编写此函数后,我打算将其编译为目标文件,并将其与其他对象库连接在一起。 亲切的问候,Ziga。 我解决了这个问题并将在这里发布解决方案,所以我回馈社区。 函数_sbrk位于ARM的NXP CDL包中。 包可供下载(链接适用于所有不熟悉此function的人): http ://www.lpclinux.com/Downloads/WebHome在子文件夹CDL_v005 / csps / lpc313x / bsps / ea3131 / source中,您将找到命名的源文件libnosys_gnu.c应该添加到项目中并编译到目标文件,之后链接到可执行文件以及其他对象和库。 祝愿和成功。

在C中运行时模拟?

这已经在我的列表中待了很长时间。 简而言之 – 我需要在运行mocked_dummy()在运行mocked_dummy()运行mocked_dummy() ,而不需要修改factorial() 。 我不关心软件的切入点。 我可以添加任意数量的附加function(但不能修改/*—- do not modify —-*/内的代码/*—- do not modify —-*/ )。 我为什么需要这个? 对一些传统C模块进行unit testing。 我知道有很多可用的工具,但如果可以运行时模拟我可以改变我的UT方法(添加可重用的组件)让我的生活更轻松:)。 平台/环境? Linux,ARM,gcc。 我正在尝试的方法? 我知道GDB使用陷阱/非法指令来添加断点( gdb内部 )。 使代码可自行修改。 用非法指令替换dummy()代码段,并作为紧接的下一条指令返回 。 控制转移到陷阱处理程序。 陷阱处理程序是一个可重用的函数,它从unix域套接字读取。 传递mocked_dummy()函数的地址(从映射文件中读取)。 模拟函数执行。 从这里开始存在问题。 我还发现这种方法很繁琐,需要大量的编码,有些也在组装中。 我还发现,在gcc下,每个函数调用都可以被挂钩/检测 ,但是再次不是很有用,因为该函数是用来模拟的,无论如何都会被执行。 我可以使用其他任何方法吗? #include #include void mocked_dummy(void) { printf(“__%s__()\n”,__func__); } /*—- do not modify —-*/ void dummy(void) { printf(“__%s__()\n”,__func__); […]