- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 ARM Compiler 5 armcc 编译的 .c 文件中的内联汇编中的 STM/LDM 指令生成 AXI 总线突发访问。
inline void STMIA2(uint32_t addr, uint32_t w0, uint32_t w1)
{
__asm {
STMIA addr!, { w0, w1 }
}
}
但是 ARM 编译器 armcc 用户指南第 7.18 段说:“所有 LDM 和 STM 指令都扩展为一系列具有等效效果的 LDR 和 STR 指令。但是,编译器随后可能会在优化期间将单独的指令重新组合为 LDM 或 STM。”
这就是实践中真正发生的事情,LDM/STM 在某些情况下被扩展为一组 LDR/STR,并且这些指令的顺序是任意的。这会影响性能,因为我们使用针对突发处理优化的硬件。这也破坏了功能正确性,因为我们使用的硬件考虑了单词序列并忽略了偏移量(但编译器认为更改指令顺序是安全的)。
要解决此问题,可以使用嵌入式汇编器而不是内联汇编器,但这会导致额外的函数调用 - 返回影响性能的内容。
所以我想知道是否有一种方法可以在不损失性能的情况下正确生成 LDM/STM?我们能够在 GCC 中执行此操作,但没有找到任何适用于 armcc 的解决方案。
objective-c PU:Cortex M0+ (ARMv6-M)。
编辑:从设备都是片上设备,大部分是非内存设备。对于支持地址空间突发访问区域的非内存从属寄存器的每个寄存器都被保留(例如[0x10000..0x10100]),我不完全确定为什么,也许CPU或总线不支持固定(非增量) ) 地址。 HW 忽略该区域内的偏移量。例如,完整请求可以是 16 个字节,完整请求的第一个字是写入的第一个字(即使偏移量不为零)。
最佳答案
So I'm wondering if there is a way to generate LDM/STM properly without losing performance? We were able to do this in GCC, but didn't find any solution for armcc.
一些关于编译器优化的内容。 Register allocation是最艰巨的工作之一。任何编译器代码生成的核心可能都围绕着它分配物理 CPU 寄存器的时间。大多数编译器都使用 Single static assignment or SSA将您的“C”变量重命名为一堆伪变量(或时间顺序变量)。
为了让您的 STMIA 和 LDMIA 正常工作,您需要加载和存储保持一致。即,如果它是 stmia [rx], {r3,r7}
和像 ldmia [rx], {r4,r8}
这样的恢复,'r3' 映射到新的“r4”和存储的“r7”映射到恢复的“r8”。这对于任何编译器来说都不容易实现,因为“C”变量将根据需要分配。同一变量的不同版本可能在不同的寄存器中。要使 stm/ldm
工作,必须分配这些变量,以便寄存器以正确的顺序递增。即,对于上面的ldmia
,如果编译器想要在r0
中存储r7
(也许是一个返回值?),这是没有办法的在不生成额外代码的情况下创建良好的 ldm
指令。
您可能已经让 gcc 生成了这个,但这可能是运气。如果您只使用 gcc,您可能会发现它也不能正常工作。
参见:ldm/stm and gcc对于 GCC stm/ldm 的问题。
以你为例,
inline void STMIA2(uint32_t addr, uint32_t w0, uint32_t w1)
{
__asm {
STMIA addr!, { w0, w1 }
}
}
inline
的值(value)在于可以将整个函数体放在代码中。调用者可能在寄存器 R8 和 R4 中有 w0
和 w1
。如果函数不是 inline
,则编译必须将它们放在 R1 和 R2 中,但可能会生成额外的移动。任何编译器都很难通用地满足 ldm/stm
的要求。
This affects performance since HW we use optimized for bursts processing. Also this breaks functional correctness because HW we use takes into consideration sequence of words and ignores offsets (but compiler think that it's safe to change the order of instructions).
如果硬件是总线上特定的非内存从属外围设备,那么您可以将写入此从属设备的功能包装在外部包装器中并强制分配寄存器(参见 AAPCS )以便 ldm/stm
将起作用。这将导致性能下降,但可以通过设备驱动程序中的一些自定义汇编器来减轻。
但是,听起来设备可能是内存?在这种情况下,您遇到了问题。通常,像这样的存储设备只会使用缓存?如果您的 CPU 有一个 MPU(内存保护单元)并且可以同时启用数据和代码缓存,那么您可能会解决这个问题。缓存行将始终是突发访问。只需要注意设置 MPU 和数据缓存的代码。
OPs Cortex-M0+ 没有缓存并且设备是非内存的,因此这是不可能的(也不需要)。
如果您的设备是内存且没有数据缓存,那么您的问题可能无法解决(无需付出大量努力)并且您需要不同的硬件。或者您可以像外围设备一样包装它并降低性能;失去了存储设备随机访问的好处。
关于c - 如何防止 ARM Compiler 5 armcc 内联汇编程序中的 LDM/STM 指令扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33183405/
我有一个应用程序,其中许多对象都扩展了一个抽象类,该抽象类定义了诸如 create() edit() retrieve() 和 delete()。由于每个子类对这些函数使用相同的逻辑,抽象类定义了默认
我正在使用$anchorScroll滚动到页面顶部,其中 html 元素具有 ID #brand。 AngularJS 代码: $location.hash(
我想停用我的应用程序中的右键单击,该右键单击提供了在桌面上安装应用程序的选项。我该如何做这样的事情? 最佳答案 右键单击 Visual Studio 中的项目并选择属性。那里有一个复选框“启用浏览器运
我使用 jquery 定位 div,在我的 CSS 中我有一个 div.right-sm:hover{background-color: blue} 我想使用 jquery 停止悬停: $(this
所以,我正在尝试复制 html5“占位符”属性功能。 我目前坚持的一件事是,在获得元素焦点时,插入符号立即出现在输入的开头。 就目前情况而言,插入符号出现在用户单击的位置,然后当我使用 jQuery
当表单填写并发送时,如果您刷新页面,它表示表单将再次发送。 (再次提交表格)。 防止这种情况发生的好方法是什么?或者终止这个 session ? 这方面有什么指导吗? 谢谢 最佳答案 处理完POST信
我想阻止 @ 被输入到 input 中。但它不起作用,知道为什么吗? $(function() { $(document).on('keyup', '[placeholder="x"]', fun
我正在使用 PHP 创建一个应用程序并涉及 MySQL。如果在请求过程中发生错误,我将如何“将查询分组在一起”,检查它是否会成功,然后对真实表进行实际影响。如果对表的实际更新失败,则恢复到更新之前的状
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Best Java obfuscator ? 对于我的示例,我知道 eclipse 提供了一个反编译插件。而
这是一个演示我的问题的 fiddle :JSFiddle 我正在制作自定义下拉菜单(实际上我使用的是 icomoon 图标而不是 V)...它看起来不错,但是父元素的 ::after 是阻止选择:(
每当我编写需要大量条件的代码时,我都会这样做: if foo: if bar: if foobar: if barfoo: if foobarfoo:
我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制文件/程序集以绕过检查: 例如在源代码中。 bool verificationResult = verify(); if (verif
我正在寻找一种简单的方法来检查多个零件表,以确定给定零件号在添加到给定表之前是否已经存在。 我目前想到的最好的想法是一个辅助表,它简单地将所有表中的每个 PN 列在一个列中,并带有一个唯一的键;但是我
这个问题在这里已经有了答案: jquery stop child triggering parent event (7 个答案) 关闭 8 年前。 我不确定这是否真的冒泡,我会解释。 我有这个:
我有一个 Spring MVC web 应用程序(不确定该信息是否重要,但它可能是)使用 ModelAndView 将字符串值传递给 JSP 文件。 字符串值的形式是: d@.
我在这里尝试使用表单 key 方法进行 csrf 保护 http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/
htmlentities 是防止 PHP 中的 XSS 的最佳解决方案吗?我还想允许像 b、i、a 和 img 这样的简单标签。实现这一点的最佳解决方案是什么?我确实考虑过 bbcode,但发现如果没
我有一个非常基本的 JAX-RS 服务(下面的 BookService 类),它允许创建 Book 类型的实体(也在下面)。 POST负载 { "acquisitionDate": 14188
我正在使用 Polymer 1.5,我确实需要“this”变量不要映射到外部。我知道 typescript 会为某些人做这件事 valid reasons . declare var Polymer:
这个问题在这里已经有了答案: Class-level read-only properties in Python (3 个答案) 关闭 6 年前。 有没有一种方法可以通过重写实例变量的 __set
我是一名优秀的程序员,十分优秀!