问题标签 [armcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ARMCC:memcpy 的问题(对齐异常)
我正在将一些软件从 gcc-toolchain 移植到 armcc-toolchain(处理器保持不变(Cortex-A9))。在 C 代码中使用 memcpy。armcc 将调用 memcpy 替换为调用 __aeabi_memcpy。关于 __aeabi_memcpy 的常见问题解答如下(ARM 编译器如何处理 memcpy()?):
在许多情况下,编译对 memcpy() 的调用时,ARM C 编译器将生成对专门的、优化的库函数的调用。自 RVCT 2.1 起,这些专用功能成为 ARM 体系结构 ABI (AEABI) 的一部分,包括:
但与 gcc 相比,在我的所有情况下,对 memcpy 的调用都可以正常工作,而 armcc 对 memcpy 的调用分别 __aeabi_memcpy 不断产生对齐异常。同时我发现,对 memcpy 的调用可以处理源地址和目标地址不是 4 字节对齐的调用,但前提是它们都不是 4 字节对齐的。例如:
将工作。但例如:
将导致对齐异常。因为我使用的是 uint8_t* 类型的指针,所以我明确告诉编译器地址可以有任何对齐。但显然这个 __aeabi_memcpy 不能处理所有的对齐组合。我该如何解决这个问题(最好不使用用户特定版本的 memcpy 更改现有代码中对 memcpy 的所有调用)?感谢帮助。
gcc - gcc上的arm指令ldr错误在armcc上工作正常
上面的命令是做什么的?它编译得很好,armcc
而arm-none-eabi-gcc
它给出了一个错误
垃圾跟随指令——`ldr r2,=0x0:OR:(Region_64K<<1):OR:Region_Enable'
gcc 在哪里
在 armcc 上
c - 调用另一个宏后不断增加宏的值
我正在编写一个带有结构化架构的头文件。我的目标是定义一个在调用另一个宏后会递增的基地址。这样做的目的是保持新基地址的运行计数,并在编译时检查它是否超过最大物理地址。
我之前曾想过使用全局变量来计算地址,但这将在运行时解决,我需要在编译时,在输出任何二进制文件之前这样做,以防止可能的内存损坏。
这就是我的例子:
以下是我希望头文件在检查时也看起来像(或等效的东西):
实际上,下面的代码块会将第 1 行和第 2 行扩展为:
然后在文件末尾进行#error 检查以确保我们没有越界
正如我们从上面看到的,并不是每个内存区域都被完全使用。就像 2 和 3 之间一样,有 50 个字节的缓冲区。所以这意味着基地址可以是
- 使用#define OR 硬编码值
- 从前一个区域的基数偏移 + 前一个区域的大小
这在我使用的编译器(ARMCC RVCT 5.03)中是否可行?
提前致谢
assembly - arm 汇编指令到他们的 gnu 等效项
下面是一些与 arm assembler 兼容的代码行,我想将它们转换为它们的 gnu 等价物。基本上我试图在裸机 cortex-r4 上运行代码,在查看互联网后,我找不到 gnu 的启动和链接器文件(对于 cortex-r4),所以最终决定将这些转换为 gnu 程序集。我之前尝试并更改了这些,但出现了一些错误(但是代码编译顺利,错误是运行时)
如果您可以提供或指导我到启动或链接器文件,那将是一个加号
问候,
gcc - 编译警告的风险
我主要有两种编译警告:
1.函数的隐式声明
in a.c
,它有char *foo(char *ptr1, char *ptr2)
, in b.c
,一些函数在foo
没有任何声明的情况下使用这个函数,我发现编译器似乎会将函数foo
返回值视为整数,甚至我可以传递一些变量少于或多于foo
函数声明
2. 枚举类型与其他类型混合
我的目标芯片是ARM11,看来即使我不解决这两种编译警告,我的程序也可以运行没有任何问题,但我相信这背后一定有一些风险。谁能给我一些很好的例子说明这两种编译警告会导致一些意想不到的问题?
同时,如果这两个警告有潜在的风险,为什么c编译器允许这些警告发生而不直接将它们设置为错误?背后有什么故事吗?
c++ - MicroVision 5.13 和 ARMCC 5.05 上的 C++11
我有一个适用于 STM32F407 处理器的工作 uVision 5.13 项目,我也在使用 RTX 操作系统,我正在尝试使用一些 C++11 功能,例如范围枚举,但是当我放置 --cpp11 编译器选项时,我收到了这个来自 cmsis 标头之一的错误:
那是在编译没有 --cpp11 选项的情况下可以正常工作的相同源代码。
然后,如果我添加一个受支持的 C++11 功能,如下所示:
然后每次编译包含作用域枚举的头文件时,我开始从 Windows 接收消息“ARM C/C++ 编译器已停止工作”。这是 Windows 中的问题签名:
所以,我做错了什么或者那些是 ARMCC 错误?
我的 uVision 版本是 5.13,编译器版本是 5.05 update 1 build 106。
c++ - 在类定义中声明类型(枚举、结构等)会增加代码大小
我正在使用armcc编译器开发一些嵌入式软件。出于调试目的,使用-O0标志将优化保持在最低限度。为了提高代码的清晰度,我将一些枚举和结构定义移到了一个具有公共访问权限的类中。
由此:
对此:
并通过 myClass 与他们联系,例如;
但令我惊讶的是,即使代码没有其他差异,它也将代码大小增加了 600 字节。我假设它是由用直接值替换枚举的编译器优化(即使在 -O0 处也有一些优化活动)引起的,但对此不确定。什么可能导致代码大小增加(或阻止优化,如果是这种情况)?
c - __packed 属性在函数参数中的用途是什么
我__packed
在声明中看到了属性struct
以避免填充。__packed
但是,在函数参数中使用属性有什么好处。
作者说他曾经告诉__packed
编译器整数可能不对齐。这是什么意思?
编辑:以下内容是否适用于gcc
编译器
c++ - 交叉编译 C++ 程序时获得权限被拒绝
我安装了 gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux 用于 arm-v8 的交叉编译。但是我在构建时被拒绝许可。我使用了指令:
gcc - gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux 的编译器选项是什么?
我正在使用以下选项:
用于使用 ArmLinuxToolChain 为 arm-v7(32 位)进行交叉编译。
什么是等效的编译器选项gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux to build for armv8
?我尝试使用与 -march=armv8-a -mtune=cortex-a53 相同的选项并得到:
aarch64-linux-gnu-g++:错误:无法识别的命令行选项“-mfloat-abi=softfp”