在 Cortex-M7 中,我有一个用-Os
编译的函数,它位于特定的地址中,我通过函数指针调用它,如下所示(+1
用于thumb模式):
//Some code above...
memset(.....)
uint32_t (*caller)(uint32_t taskid, ...);
caller = (uint32_t(*)(uint32_t, ...))((uint32_t)0x08020000 + 1U);
for (size_t i = 0; i < 3; ++i) {
caller(i);
}
字符串
函数被调用3
次并返回,但函数内部的i
参数不是0,1,2
,而是garbage,0,1
。如果我不使用-Os
编译器选项,情况就不是这样了。
检查反汇编,似乎for循环是展开的,有movs r0, #1
和movs r0, #2
,它甚至被重新排序。
memset(shared_ram, 0x00, sizeof(*shared_ram));
8000968: 2000 movs r0, #0
caller(i);
800096a: 4d1a ldr r5, [pc, #104] ; (80009d4 <main+0xc0>)
memset(shared_ram, 0x00, sizeof(*shared_ram));
800096c: 6018 str r0, [r3, #0]
800096e: 6058 str r0, [r3, #4]
8000970: 6098 str r0, [r3, #8]
caller(i);
8000972: 47a8 blx r5
8000974: 2001 movs r0, #1
8000976: 47a8 blx r5
8000978: 2002 movs r0, #2
800097a: 47a8 blx r5
型
这是一个编译器bug吗?
Cortex-M7缓存未启用,如果这很重要的话。
编译标志:
-fdata-sections -ffunction-sections --specs=nano.specs -Wl,--gc-sections -g -mthumb -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -Og -g3 -ggdb -fno-eliminate-unused-debug-symbols -fdata-sections -ffunction-sections -Wall -Wextra -Wpedantic -Wno-unused-parameter -Os -std=gnu11
型
1条答案
按热度按时间3bygqnnd1#
问题与编译器无关(99.9%的情况)。我的函数包含相同的分支,因此编译器选择了
default
方式,并没有理会变量值。字符串