I have found severe defect inside ARM cor Cortex-M3 compiler. It occurs only in release build.
And this is compilation result. Only 8 bytes is cleared, by using STR.
0x00013F06 F88D5008 STRB r5,[sp,#0x08] 23: UINT8 data[9];
64: continue; 65: } 66: 0x00013F42 E00F B 0x00013F64
67: memset(data,0, sizeof(data)); 70: 0x00013F44 9504 STR r5,[sp,#0x10] 0x00013F46 9505 STR r5,[sp,#0x14]
71: if(ReadBlockFromSRAM(data, addr, sizeof(data))) 72: { 0x00013F48 2209 MOVS r2,#0x09
=============================================================
When I use: x2 = sizeof(data); memset(data,0,x2);
It works fine.
Here is what my compiler (
IDE-Version: µVision V4.14.4.0 Copyright (C) 2010 KEIL(TM) Tools by ARM License Information: tamir michael cmc LIC=WHY4D-85I2L-ZC4J9-244N7-FB8KA-HBEDB Tool Version Numbers: Toolchain: RealView MDK-ARM Version: 4.14 Middleware: RL-ARM Real-Time Library Version V4.13 Toolchain Path: BIN40\ C Compiler: Armcc.Exe V4.1.0.567 Assembler: Armasm.Exe V4.1.0.567 Linker/Locator: ArmLink.Exe V4.1.0.567 Librarian: ArmAr.Exe V4.1.0.567 Hex Converter: FromElf.Exe V4.1.0.567 CPU DLL: SARMCM3.DLL V4.14 Dialog DLL: DARMP1.DLL V1.20.0.4 Target DLL: BIN\UL2CM3.DLL V1.80 Dialog DLL: TARMP1.DLL V1.20.0.3
) has generated:
176: int32_t main(void) 0x00001BFA BD70 POP {r4-r6,pc} 177: { 178: int8_t buffer[7] ; 179: 0x00001BFC B50E PUSH {r1-r3,lr} 180: memset(buffer, 4, sizeof(buffer) ) ; 0x00001BFE 2204 MOVS r2,#0x04 0x00001C00 2107 MOVS r1,#0x07 0x00001C02 A801 ADD r0,sp,#0x04 0x00001C04 F001F9F8 BL.W __aeabi_memset (0x00002FF8) 181: memset(buffer, 1, sizeof(buffer) ) ; 0x00001C08 2201 MOVS r2,#0x01 0x00001C0A 2107 MOVS r1,#0x07 0x00001C0C A801 ADD r0,sp,#0x04 0x00001C0E F001F9F3 BL.W __aeabi_memset (0x00002FF8) 182: memset(buffer, 0, sizeof(buffer) ) ; 183: // uint32_t i, j, k, l_start_time ; 184: 185: #ifdef WDT_ENABLED 186: wdt_init(WDT_PERIOD_10_SECONDS) ; 187: #endif 188: 0x00001C12 2000 MOVS r0,#0x00 0x00001C14 9001 STR r0,[sp,#0x04] 0x00001C16 9002 STR r0,[sp,#0x08] 189: remap_interrupt_vectors() ;