经过测试,使用CubeMX新建工程,使用以下代码会出错
[C] 纯文本查看 复制代码 #include "main.h"
/****************
当优化等级为o0和o1时会出错
如果rsv数组小于32不出错
后面不再使用该指针中的变量不出错
****************/
typedef struct
{
uint8_t rsv[32]; //此处大于等于32时会出现汇编代码异常
uint8_t val;
} test_typedef;
void unused(uint8_t n)
{
}
void testfunc(test_typedef *p)
{
p->val=(p->val)+1;
unused(p->val); //如果后面会使用p-val,会出现汇编代码异常
}
o0等级和o1等级都会出错,o0等级下汇编代码如下
[Asm] 纯文本查看 复制代码 AREA ||i.testfunc||, CODE, READONLY, ALIGN=1
testfunc PROC
PUSH {lr}
MOV r1,r0
LDRB r0,[r1,#0x20]!
ADDS r0,r0,#1
STRB r0,[r1,#0]
LDRB r0,[r1],#-0x20
BL unused
POP {pc}
ENDP
是否出错与结构体中数组大小有关,数组小于32时不出错。
MDK工程见附件,欢迎交流指导
|