小编use*_*952的帖子

ARMCC:memcpy问题(对齐异常)

我正在将一些软件从gcc-toolchain移植到armcc-toolchain(处理器保持不变(Cortex-A9)).在C代码中使用memcpy.armcc通过调用__aeabi_memcpy替换对memcpy的调用.常见问题解答如下关于__aeabi_memcpy(ARM编译器如何处理memcpy()?):

在许多情况下,在编译对memcpy()的调用时,ARM C编译器将生成对专用的,优化的库函数的调用.从RVCT 2.1开始,这些专用函数是ARM体系结构(AEABI)的ABI的一部分,包括:

__aeabi_memcpy
This function is the same as ANSI C memcpy, except that the return value is void.
Run Code Online (Sandbox Code Playgroud)

但是与gcc相比,在我的所有情况下对memcpy的调用都可以正常工作,使用armcc对memcpy的调用__aeabi_memcpy会连续产生对齐异常.同时我发现,对memcpy的调用可以处理源和目标地址不是4字节对齐的调用,但前提是它们都不是4字节对齐的.例如:

    volatile uint32_t len = 10;
    uint8_t* src = (uint8_t*)0x06000002;         // 2-byte aligned
    uint8_t* dst = (uint8_t*)(0x06000002 + 20);  // 2-byte aligned
    memcpy(dst, src, len);
Run Code Online (Sandbox Code Playgroud)

将工作.但是例如:

    volatile uint32_t len = 10;
    uint8_t* src = (uint8_t*)0x06000002;         // 2-byte aligned
    uint8_t* dst = (uint8_t*)(0x06000002 + 22);  // 4-byte aligned
    memcpy(dst, src, len);
Run Code Online (Sandbox Code Playgroud)

会导致对齐异常.我正在使用uint8_t类型的指针*我明确告诉编译器地址可以有任何对齐.但显然这个__aeabi_memcpy无法处理每个路线组合.如何解决此问题(最好不使用用户特定版本的memcpy更改现有代码中对memcpy的所有调用)?感谢帮助.

c memory-alignment memcpy armcc

7
推荐指数
1
解决办法
4881
查看次数

ARM:"STMDB SP!,{R0-R8}"(又名PUSH {R0-R8})是原子操作吗?

我想知道STMDB SP!,{R0-R8}是否是ARM(v7)中的原子操作,因为它对我来说看起来很复杂.那么例如可能的是,CPU在"中间"某处被中断并且已经将R5-R8存储在堆栈上并且SP现在是SP_old-16并且在处理中断之后处理器继续R0-R4?谢谢.

assembly stack arm atomic

5
推荐指数
2
解决办法
2085
查看次数

标签 统计

arm ×1

armcc ×1

assembly ×1

atomic ×1

c ×1

memcpy ×1

memory-alignment ×1

stack ×1