我试图产生 AXI总线突发访问与ARM编译器armcc 5编译.c文件使用内联组件STM/LDM指令。如何防止ARM Compiler 5 armcc内嵌汇编程序中的LDM/STM指令扩展?
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在某些情况下,这些instuctions的顺序是任意的。 这会影响性能,因为我们使用HW优化了突发处理。此外,这破坏了函数的正确性,因为我们使用的HW考虑了字的序列并忽略了偏移量(但编译器认为改变指令的顺序是安全的)。
要解决这一点,是可以使用的,而不是内联汇编嵌入式汇编程序,但是这会导致额外的函数调用,返回什么影响性能。
所以我想知道如果有一种方法来生成LDM/STM正确不失的表现?我们能够在GCC中做到这一点,但没有找到任何解决方案。
目标CPU:Cortex M0 +(ARMv6-M)。
编辑: 从属设备都是片上设备,其中大多数是非存储设备。对于支持地址空间突发访问区域的每个非存储器从站寄存器(例如[0x10000..0x10100]),我不完全确定为什么,也许CPU或总线不支持固定(非增量)地址。 HW忽略该区域内的偏移量。例如,完整请求可以是16个字节,并且完整请求的第一个字是第一个写入的字(即使偏移量不为零)。
如果你很在乎性能,然后写更多的,你在一个单独的汇编程序文件所需要的。考虑到编译器处理代码的其余部分有多糟糕,内联C函数中的单个指令不会让你感到太多。我的运营主体总是 - 如果您关心时间关键的例程的性能,请自己写(使用汇编程序)。 – BitBank
@ imiron13:我怀疑你是搞砸了。基尔内联汇编让优化器无所不能,对“优化”功能缺乏细粒度的控制。如果您使用正常的易失性指针来确保写入器与64位类型的顺序以尝试组合写入,那么代码生成有多糟糕? – doynax
@BitBank:我的假设是,性能命中并不是孤立于单个重要的内部环路,这可以很容易地手动调整,但写入内联生成代码库的重要部分。 – doynax