zacck / embedded_volatile

Example project showing effect of volatile keyword

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Example code to demostrate use and need of volatile LEVEL 0 Optimization

10                    	uint32_t value = 0;
080001ee: 00 23         movs    r3, #0
080001f0: 7b 60         str     r3, [r7, #4]
11                    	uint32_t *p = (uint32_t *)SRAM_ADDRESS1;
080001f2: 04 4b         ldr     r3, [pc, #16]   ; (0x8000204 <main+28>)
080001f4: 3b 60         str     r3, [r7, #0]
15                    		value = *p;
080001f6: 3b 68         ldr     r3, [r7, #0]
080001f8: 1b 68         ldr     r3, [r3, #0]
080001fa: 7b 60         str     r3, [r7, #4]
16                    		if(value) break;
080001fc: 7b 68         ldr     r3, [r7, #4]
080001fe: 00 2b         cmp     r3, #0
08000200: f9 d0         beq.n   0x80001f6 <main+14>
20                    	while(1);

================================================================================================ LEVEL 02 Optimization without volatile keyword

080001e6: 00 08         lsrs    r0, r0, #32
15                    		value = *p;
                      main:
080001e8: 4f f0 00 53   mov.w   r3, #536870912  ; 0x20000000
080001ec: 5b 68         ldr     r3, [r3, #4]
16                    		if(value) break;
; compiler optimizes away reads 
080001ee: 03 b9         cbnz    r3, 0x80001f2 <main+10>
080001f0: fe e7         b.n     0x80001f0 <main+8>
20                    	while(1);

================================================================================ Level 02 Optimization with volatile keyword Note the generated assembly code now branches on comparison With volatile keyword

080001e6: 00 08         lsrs    r0, r0, #32
16                    		value = *p;
                      main:
080001e8: 4f f0 00 52   mov.w   r2, #536870912  ; 0x20000000
080001ec: 53 68         ldr     r3, [r2, #4]
17                    		if(value) break;
; compiler jumps back to read every loop
080001ee: 00 2b         cmp     r3, #0
080001f0: fc d0         beq.n   0x80001ec <main+4>
21                    	while(1);
080001f2: fe e7         b.n     0x80001f2 <main+10>

About

Example project showing effect of volatile keyword


Languages

Language:Assembly 78.5%Language:C 21.5%