问题标签 [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 - 防止 Keil uVision 中布尔值的“枚举类型与另一种类型混合”警告
我正在将我在 CodeWarrior v5.2 中开发的应用程序迁移到使用 ARM C 编译器 v5.06 的 Keil uVision v5.25。
在我的代码中,我用来bool
表示布尔值,它types.h
在我的项目的文件中定义为:
当我尝试编译我的代码时,编译器会生成有关我将比较结果隐式分配给具有这种类型的变量的行的警告:
我理解为什么会产生这些警告。我知道我可以通过显式转换为来抑制这些警告bool
,例如:
但是,对每个布尔条件都这样做是非常难看的。我想知道是否有一种方法可以将 Keil uVision / ARM 编译器(或修改我的代码)配置为不生成关于 的警告bool
,而不会完全禁用有关将枚举类型与其他类型混合的警告。
这些是我可用于配置编译器的选项:
c - 为什么 ARM 将“0xFFFFFFFF”视为超出“int”范围的枚举而不是分配?
我正在尝试用 C (armcc file.c) 编译以下代码:
我只收到枚举分配的警告,而不是整数变量分配的警告,尽管在我看来,两者都不应出现警告。
警告如下:
警告::
#66-D
枚举值超出“int”范围FEBRUARY= 0xFFFFFFFF
我在这里错过了什么吗?
c++ - 即使使用 --no_rtti_data,Keil armcc 也会生成类型信息名称
我在 Keil 5.25 中使用 ARM Compiler 5 (ARMCC)。我正在使用 c++11。
我正在使用 c++11 和 std::function 的自制类似物(因为 armcc 提供的 STL 中没有 std::function )。最近我注意到我的二进制文件包含几个看起来很奇怪的字符串,比如N8callback14DelegateLambdaIZN5tasks13BatteryTask_t6worker
等等。
我在链接器 .map 文件中查找了它们的地址,发现这些是我的一些 lambda 的“类型信息名称”。
我很确定我不需要这些名称,也不使用它们。但是即使使用 --no_rtti 和 --no_rtti_data 编译器仍然会生成它们,即使使用 --feedback 链接器也不会丢弃它们。
我怎样才能摆脱它们?它们往往会占用大量空间。
linker-scripts - ARMCC 链接器:创建一个未初始化的区域
我正在尝试让 ARMCC 链接器将变量放入未初始化的 RAM 区域,但失败了(因为我需要它们在重置后仍然存在)。我在 scatter-link 文件中创建的区域指定UNINIT
,并且在我的__attribute__
调用中,我指定这是zero_init
RAM(否则我知道 ARM 链接器认为它是Data
RAM 并且不管你说什么都将它初始化为零) . 对于我下面的测试代码,.map
文件显示链接器将我的测试变量放入正确的区域:
然而,有了这个测试代码:
...我得到的输出是:
谁能发现我做错了什么?
这是我的完整分散链接文件,RW_IRAM1
我正在谈论的区域在哪里:
仅供参考,这是在具有 64 KB RAM 的 Nordic NRF52832 芯片上,我碰巧正在使用 mbed-os 构建,尽管我不认为这应该与问题有关。ARMCC 版本是 5.06 更新 6(内部版本 750)。
c - 定义具有特定对齐方式的自动变量的优雅方式
我正在使用 ARM 编译器并有一个硬件外围设备(具有直接内存访问),它需要对传递给它的内存缓冲区进行特定对齐(32 字节对齐)。aligned
当缓冲区是全局/静态的并且可以使用编译器支持的属性来定义时,这不是问题。只要需要在本地传递某个函数中定义的缓冲区,即具有自动存储类,就会出现问题。我试图做类似以下的事情:
这很高兴地编译并在x86编译器上工作。但不是在armcc,这是抱怨:
警告:#1041-D:自动对象的对齐方式不得大于 8
所以这种方法行不通。还有一个,我认为很丑:
虽然ALIGN_UP_32
是一个宏,用于返回其中的第一个对齐地址unalignedBuffer
(我猜这里的实现细节并不重要)。
正如我所说,我不喜欢这种方法,想知道是否有更优雅的方法来实现同样的效果?
arm - 将 R0 寄存器总是在其他任何东西之前使用吗?
编译器是否总是按顺序使用 R0?
arm - 关于使用ARM伪指令UND的问题
我正在尝试使用http://www.keil.com/support/man/docs/armasm/armasm_dom1361289918908.htm中提到的伪指令来生成未定义的指令
我的内联汇编代码如下:
但是我收到了这个错误:
对我来说,无论我如何使用 0xe7f000f0 值部分,似乎都无法识别 UND ,总是显示此错误,想知道是否有人尝试过 UND 指令以及我的内联汇编可能有什么问题?
c - arm 编译器 5 不完全尊重 volatile 限定符
考虑以下代码:
生成此机器代码(使用工具链的objdump生成):
现在,由于它是易失的,当到达语句status
时它应该已经从内存中读取。if
我希望在将其 ( cmp
) 与进行比较之前看到一些加载命令SUCCESS_CONST
,不管它被分配了函数的返回值process_package_header()
并存储在内存中,因为status
它是易失性的,并且可能在str
指令和cmp
指令之间进行更改。
请尝试忽略if
条件的动机,其目的是尝试检测对 CPU 的物理攻击,其中条件标志和寄存器可以通过物理设备从外部更改。
工具链ARM DS-5_v5.27.0 arm 编译器:ARMCompiler5.06u5 (armcc)
目标是 ARM CortexM0+ CPU
assembly - 如何使用 __asm 在 C 中执行 DCD?
我正在尝试DCD 0xf7f0a000
在 ARM C 代码中执行 ASM 指令。
我尝试的以下方法和我得到的错误:
错误:#3061:无法识别的指令操作码
错误:隐式物理寄存器 R0 应定义为变量。
错误:隐式物理寄存器 R1 应定义为变量。
更新:
ARM 编译器版本:ARM Compiler 5.06 update 6
PS:我正在尝试通过执行未定义的操作来生成异常。
c++ - PFYvv 代表什么?(不是 PFvv!)
我正在尝试将符号的文件与标头中生成的损坏的文件链接起来。(将 ROM 定位的功能与 RAM 的功能相匹配。)
在 .sym 中,我有一个带有“ PFvv ”参数的函数,通常被分解为 -> VOID (fn*)(VOID)。
编译器改为生成以下输出作为参数:PFYvv
结果:链接器没有链接。
问题:
Y 代表什么?是否有 ARM mangling 的参考文档?
.sym 错位名称:
编译器生成的名称:
.h 定义
回复后代码:
以下是生成 PFvv 和 PFYvv 重整名称的方法: