Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

the-led-and-delay-abstraction.md set half_period is broken. #280

Open
vringar opened this issue Dec 29, 2020 · 1 comment
Open

the-led-and-delay-abstraction.md set half_period is broken. #280

vringar opened this issue Dec 29, 2020 · 1 comment

Comments

@vringar
Copy link

vringar commented Dec 29, 2020

Now, we are going to modify this variable using the `set` command:
```
(gdb) set half_period = 100
(gdb) print half_period
$1 = 100
```
If you let program run free again using the `continue` command, you should see that the LED will
blink at a much faster rate now!
Question! What happens if you keep lowering the value of `half_period`? At what value of
`half_period` you can no longer see the LED blink?

Doesn't work anymore on rustc 1.48.0 (7eac88abb 2020-11-16).

Full asm output (built with RUSTFLAGS="--emit asm" cargo build --target thumbv7em-none-eabi
	.text
	.syntax unified
	.eabi_attribute	67, "2.09"
	.eabi_attribute	6, 13
	.eabi_attribute	7, 77
	.eabi_attribute	8, 0
	.eabi_attribute	9, 2
	.eabi_attribute	34, 1
	.eabi_attribute	17, 1
	.eabi_attribute	20, 1
	.eabi_attribute	21, 0
	.eabi_attribute	23, 3
	.eabi_attribute	24, 1
	.eabi_attribute	25, 1
	.eabi_attribute	38, 1
	.eabi_attribute	14, 0
	.file	"33ne5uerfjn3u8oj"
	.section	.text.main,"ax",%progbits
	.globl	main
	.p2align	1
	.type	main,%function
	.code	16
	.thumb_func
main:
.Lfunc_begin0:
	.file	1 "/home/stefan/projects/discovery/src/05-led-roulette/src/main.rs"
	.loc	1 7 0
	.fnstart
	.cfi_sections .debug_frame
	.cfi_startproc
	.save	{r7, lr}
	push	{r7, lr}
	.cfi_def_cfa_offset 8
	.cfi_offset lr, -4
	.cfi_offset r7, -8
	.setfp	r7, sp
	mov	r7, sp
	.cfi_def_cfa_register r7
.Ltmp0:
	.loc	1 7 1 prologue_end
	bl	_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E
	.inst.n	0xdefe
.Ltmp1:
.Lfunc_end0:
	.size	main, .Lfunc_end0-main
	.cfi_endproc
	.cantunwind
	.fnend

	.section	.text._ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E,"ax",%progbits
	.p2align	1
	.type	_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E,%function
	.code	16
	.thumb_func
_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E:
.Lfunc_begin1:
	.loc	1 8 0
	.fnstart
	.cfi_startproc
	.save	{r7, lr}
	push	{r7, lr}
	.cfi_def_cfa_offset 8
	.cfi_offset lr, -4
	.cfi_offset r7, -8
	.setfp	r7, sp
	mov	r7, sp
	.cfi_def_cfa_register r7
	.pad	#72
	sub	sp, #72
	add	r0, sp, #40
.Ltmp2:
	.loc	1 9 48 prologue_end
	bl	_ZN4aux54init17ha90da604cbc87758E
	b	.LBB1_1
.LBB1_1:
	.loc	1 0 48 is_stmt 0
	add	r0, sp, #40
	add	r1, sp, #12
	.loc	1 9 10
	ldm.w	r0, {r2, r3, r4, r12, lr}
	stm.w	r1, {r2, r3, r4, r12, lr}
	.loc	1 9 21
	ldr	r0, [sp, #60]
	ldr	r1, [sp, #64]
	str	r1, [sp, #36]
	str	r0, [sp, #32]
	mov.w	r0, #500
.Ltmp3:
	.loc	1 11 23 is_stmt 1
	strh	r0, [r7, #-2]
.Ltmp4:
	.loc	1 13 5
	b	.LBB1_2
.LBB1_2:
	.loc	1 14 9
	movw	r2, :lower16:.L__unnamed_1
	movt	r2, :upper16:.L__unnamed_1
	add	r0, sp, #32
	movs	r1, #0
	bl	_ZN73_$LT$f3..led..Leds$u20$as$u20$core..ops..index..IndexMut$LT$usize$GT$$GT$9index_mut17h381d5f4e0c621798E
	str	r0, [sp, #8]
	b	.LBB1_3
.LBB1_3:
	ldr	r0, [sp, #8]
	bl	_ZN2f33led3Led2on17hd271365517c0b11cE
	b	.LBB1_4
.LBB1_4:
	.loc	1 0 9 is_stmt 0
	add	r0, sp, #12
	mov.w	r1, #500
	.loc	1 15 9 is_stmt 1
	bl	_ZN97_$LT$stm32f30x_hal..delay..Delay$u20$as$u20$embedded_hal..blocking..delay..DelayMs$LT$u16$GT$$GT$8delay_ms17h5400aa5c3c87f438E
	b	.LBB1_5
.LBB1_5:
	.loc	1 17 9
	movw	r2, :lower16:.L__unnamed_2
	movt	r2, :upper16:.L__unnamed_2
	add	r0, sp, #32
	movs	r1, #0
	bl	_ZN73_$LT$f3..led..Leds$u20$as$u20$core..ops..index..IndexMut$LT$usize$GT$$GT$9index_mut17h381d5f4e0c621798E
	str	r0, [sp, #4]
	b	.LBB1_6
.LBB1_6:
	ldr	r0, [sp, #4]
	bl	_ZN2f33led3Led3off17hef007257bef9f451E
	b	.LBB1_7
.LBB1_7:
	.loc	1 0 9 is_stmt 0
	add	r0, sp, #12
	mov.w	r1, #500
	.loc	1 18 9 is_stmt 1
	bl	_ZN97_$LT$stm32f30x_hal..delay..Delay$u20$as$u20$embedded_hal..blocking..delay..DelayMs$LT$u16$GT$$GT$8delay_ms17h5400aa5c3c87f438E
	b	.LBB1_8
.LBB1_8:
	.loc	1 13 5
	b	.LBB1_2
.Ltmp5:
.Lfunc_end1:
	.size	_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E, .Lfunc_end1-_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E
	.cfi_endproc
	.cantunwind
	.fnend

	.type	.L__unnamed_3,%object
	.section	.rodata..L__unnamed_3,"a",%progbits
.L__unnamed_3:
	.ascii	"src/05-led-roulette/src/main.rs"
	.size	.L__unnamed_3, 31

	.type	.L__unnamed_1,%object
	.section	.rodata..L__unnamed_1,"a",%progbits
	.p2align	2
.L__unnamed_1:
	.long	.L__unnamed_3
	.asciz	"\037\000\000\000\016\000\000\000\t\000\000"
	.size	.L__unnamed_1, 16

	.type	.L__unnamed_2,%object
	.section	.rodata..L__unnamed_2,"a",%progbits
	.p2align	2
.L__unnamed_2:
	.long	.L__unnamed_3
	.asciz	"\037\000\000\000\021\000\000\000\t\000\000"
	.size	.L__unnamed_2, 16

	.section	.debug_abbrev,"",%progbits
	.byte	1
	.byte	17
	.byte	1
	.byte	37
	.byte	14
	.byte	19
	.byte	5
	.byte	3
	.byte	14
	.byte	16
	.byte	23
	.byte	27
	.byte	14
	.ascii	"\264B"
	.byte	25
	.byte	17
	.byte	1
	.byte	85
	.byte	23
	.byte	0
	.byte	0
	.byte	2
	.byte	57
	.byte	1
	.byte	3
	.byte	14
	.byte	0
	.byte	0
	.byte	3
	.byte	46
	.byte	0
	.byte	17
	.byte	1
	.byte	18
	.byte	6
	.byte	64
	.byte	24
	.byte	110
	.byte	14
	.byte	3
	.byte	14
	.byte	58
	.byte	11
	.byte	59
	.byte	11
	.byte	63
	.byte	25
	.byte	0
	.byte	0
	.byte	4
	.byte	46
	.byte	1
	.byte	17
	.byte	1
	.byte	18
	.byte	6
	.byte	64
	.byte	24
	.byte	110
	.byte	14
	.byte	3
	.byte	14
	.byte	58
	.byte	11
	.byte	59
	.byte	11
	.ascii	"\207\001"
	.byte	25
	.byte	0
	.byte	0
	.byte	5
	.byte	11
	.byte	1
	.byte	17
	.byte	1
	.byte	18
	.byte	6
	.byte	0
	.byte	0
	.byte	6
	.byte	52
	.byte	0
	.byte	2
	.byte	24
	.byte	3
	.byte	14
	.byte	58
	.byte	11
	.byte	59
	.byte	11
	.byte	73
	.byte	19
	.byte	0
	.byte	0
	.byte	7
	.byte	19
	.byte	1
	.byte	3
	.byte	14
	.byte	11
	.byte	11
	.ascii	"\210\001"
	.byte	15
	.byte	0
	.byte	0
	.byte	8
	.byte	13
	.byte	0
	.byte	3
	.byte	14
	.byte	73
	.byte	19
	.ascii	"\210\001"
	.byte	15
	.byte	56
	.byte	11
	.byte	0
	.byte	0
	.byte	9
	.byte	47
	.byte	0
	.byte	73
	.byte	19
	.byte	3
	.byte	14
	.byte	0
	.byte	0
	.byte	10
	.byte	19
	.byte	0
	.byte	3
	.byte	14
	.byte	11
	.byte	11
	.ascii	"\210\001"
	.byte	15
	.byte	0
	.byte	0
	.byte	11
	.byte	36
	.byte	0
	.byte	3
	.byte	14
	.byte	62
	.byte	11
	.byte	11
	.byte	11
	.byte	0
	.byte	0
	.byte	12
	.byte	15
	.byte	0
	.byte	73
	.byte	19
	.byte	3
	.byte	14
	.byte	51
	.byte	6
	.byte	0
	.byte	0
	.byte	13
	.byte	1
	.byte	1
	.byte	73
	.byte	19
	.byte	0
	.byte	0
	.byte	14
	.byte	33
	.byte	0
	.byte	73
	.byte	19
	.byte	34
	.byte	13
	.byte	55
	.byte	11
	.byte	0
	.byte	0
	.byte	15
	.byte	36
	.byte	0
	.byte	3
	.byte	14
	.byte	11
	.byte	11
	.byte	62
	.byte	11
	.byte	0
	.byte	0
	.byte	0
	.section	.debug_info,"",%progbits
.Lcu_begin0:
	.long	.Ldebug_info_end0-.Ldebug_info_start0
.Ldebug_info_start0:
	.short	4
	.long	.debug_abbrev
	.byte	4
	.byte	1
	.long	.Linfo_string0
	.short	28
	.long	.Linfo_string1
	.long	.Lline_table_start0
	.long	.Linfo_string2

	.long	0
	.long	.Ldebug_ranges0
	.byte	2
	.long	.Linfo_string3
	.byte	3
	.long	.Lfunc_begin0
	.long	.Lfunc_end0-.Lfunc_begin0
	.byte	1
	.byte	87
	.long	.Linfo_string4
	.long	.Linfo_string5
	.byte	1
	.byte	7

	.byte	4
	.long	.Lfunc_begin1
	.long	.Lfunc_end1-.Lfunc_begin1
	.byte	1
	.byte	87
	.long	.Linfo_string6
	.long	.Linfo_string7
	.byte	1
	.byte	8

	.byte	5
	.long	.Ltmp3
	.long	.Ltmp5-.Ltmp3
	.byte	6
	.byte	2
	.byte	125
	.byte	12
	.long	.Linfo_string8
	.byte	1
	.byte	9
	.long	159
	.byte	6
	.byte	2
	.byte	125
	.byte	32
	.long	.Linfo_string36
	.byte	1
	.byte	9
	.long	520
	.byte	5
	.long	.Ltmp4
	.long	.Ltmp5-.Ltmp4
	.byte	6
	.byte	2
	.byte	145
	.byte	126
	.long	.Linfo_string53
	.byte	1
	.byte	11
	.long	580
	.byte	0
	.byte	0
	.byte	0
	.byte	0
	.byte	2
	.long	.Linfo_string9
	.byte	2
	.long	.Linfo_string8
	.byte	7
	.long	.Linfo_string35
	.byte	20
	.byte	4
	.byte	8
	.long	.Linfo_string10
	.long	195
	.byte	4
	.byte	0
	.byte	8
	.long	.Linfo_string24
	.long	406
	.byte	1
	.byte	0
	.byte	0
	.byte	0
	.byte	2
	.long	.Linfo_string11
	.byte	7
	.long	.Linfo_string23
	.byte	20
	.byte	4
	.byte	8
	.long	.Linfo_string12
	.long	275
	.byte	4
	.byte	0
	.byte	8
	.long	.Linfo_string17
	.long	275
	.byte	4
	.byte	4
	.byte	8
	.long	.Linfo_string18
	.long	275
	.byte	4
	.byte	8
	.byte	8
	.long	.Linfo_string19
	.long	389
	.byte	1
	.byte	16
	.byte	8
	.long	.Linfo_string21
	.long	389
	.byte	1
	.byte	17
	.byte	8
	.long	.Linfo_string22
	.long	275
	.byte	4
	.byte	12
	.byte	0
	.byte	0
	.byte	2
	.long	.Linfo_string13
	.byte	7
	.long	.Linfo_string16
	.byte	4
	.byte	4
	.byte	8
	.long	.Linfo_string14
	.long	382
	.byte	4
	.byte	0
	.byte	0
	.byte	0
	.byte	2
	.long	.Linfo_string40
	.byte	2
	.long	.Linfo_string41
	.byte	7
	.long	.Linfo_string49
	.byte	1
	.byte	1
	.byte	8
	.long	.Linfo_string42
	.long	389
	.byte	1
	.byte	0
	.byte	8
	.long	.Linfo_string43
	.long	454
	.byte	1
	.byte	0
	.byte	9
	.long	345
	.long	.Linfo_string46
	.byte	0
	.byte	0
	.byte	7
	.long	.Linfo_string47
	.byte	0
	.byte	1
	.byte	8
	.long	.Linfo_string43
	.long	471
	.byte	1
	.byte	0
	.byte	9
	.long	373
	.long	.Linfo_string46
	.byte	0
	.byte	10
	.long	.Linfo_string44
	.byte	0
	.byte	1
	.byte	0
	.byte	0
	.byte	11
	.long	.Linfo_string15
	.byte	7
	.byte	4
	.byte	11
	.long	.Linfo_string20
	.byte	7
	.byte	1
	.byte	2
	.long	.Linfo_string25
	.byte	2
	.long	.Linfo_string26
	.byte	7
	.long	.Linfo_string34
	.byte	0
	.byte	1
	.byte	8
	.long	.Linfo_string27
	.long	437
	.byte	1
	.byte	0
	.byte	0
	.byte	0
	.byte	0
	.byte	2
	.long	.Linfo_string28
	.byte	2
	.long	.Linfo_string29
	.byte	7
	.long	.Linfo_string33
	.byte	0
	.byte	1
	.byte	9
	.long	490
	.long	.Linfo_string32
	.byte	0
	.byte	7
	.long	.Linfo_string48
	.byte	0
	.byte	1
	.byte	9
	.long	345
	.long	.Linfo_string32
	.byte	0
	.byte	7
	.long	.Linfo_string45
	.byte	0
	.byte	1
	.byte	9
	.long	373
	.long	.Linfo_string32
	.byte	0
	.byte	0
	.byte	0
	.byte	12
	.long	503
	.long	.Linfo_string31
	.long	0
	.byte	11
	.long	.Linfo_string30
	.byte	7
	.byte	0
	.byte	2
	.long	.Linfo_string37
	.byte	2
	.long	.Linfo_string38
	.byte	7
	.long	.Linfo_string52
	.byte	8
	.byte	1
	.byte	8
	.long	.Linfo_string36
	.long	560
	.byte	1
	.byte	0
	.byte	0
	.byte	7
	.long	.Linfo_string50
	.byte	1
	.byte	1
	.byte	8
	.long	.Linfo_string39
	.long	305
	.byte	1
	.byte	0
	.byte	0
	.byte	0
	.byte	0
	.byte	13
	.long	539
	.byte	14
	.long	573
	.byte	0
	.byte	8
	.byte	0
	.byte	15
	.long	.Linfo_string51
	.byte	8
	.byte	7
	.byte	11
	.long	.Linfo_string54
	.byte	7
	.byte	2
	.byte	0
.Ldebug_info_end0:
	.section	.text.main,"ax",%progbits
.Lsec_end0:
	.section	.text._ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E,"ax",%progbits
.Lsec_end1:
	.section	.debug_aranges,"",%progbits
	.long	36
	.short	2
	.long	.Lcu_begin0
	.byte	4
	.byte	0
	.zero	4,255
	.long	.Lfunc_begin0
	.long	.Lsec_end0-.Lfunc_begin0
	.long	.Lfunc_begin1
	.long	.Lsec_end1-.Lfunc_begin1
	.long	0
	.long	0
	.section	.debug_ranges,"",%progbits
.Ldebug_ranges0:
	.long	.Lfunc_begin0
	.long	.Lfunc_end0
	.long	.Lfunc_begin1
	.long	.Lfunc_end1
	.long	0
	.long	0
	.section	.debug_str,"MS",%progbits,1
.Linfo_string0:
	.asciz	"clang LLVM (rustc version 1.48.0 (7eac88abb 2020-11-16))"
.Linfo_string1:
	.asciz	"src/05-led-roulette/src/main.rs"
.Linfo_string2:
	.asciz	"/home/stefan/projects/discovery"
.Linfo_string3:
	.asciz	"led_roulette"
.Linfo_string4:
	.asciz	"main"
.Linfo_string5:
	.asciz	"__cortex_m_rt_main_trampoline"
.Linfo_string6:
	.asciz	"_ZN12led_roulette18__cortex_m_rt_main17h0b2223cb0e38e500E"
.Linfo_string7:
	.asciz	"__cortex_m_rt_main"
.Linfo_string8:
	.asciz	"delay"
.Linfo_string9:
	.asciz	"stm32f30x_hal"
.Linfo_string10:
	.asciz	"clocks"
.Linfo_string11:
	.asciz	"rcc"
.Linfo_string12:
	.asciz	"hclk"
.Linfo_string13:
	.asciz	"time"
.Linfo_string14:
	.asciz	"__0"
.Linfo_string15:
	.asciz	"u32"
.Linfo_string16:
	.asciz	"Hertz"
.Linfo_string17:
	.asciz	"pclk1"
.Linfo_string18:
	.asciz	"pclk2"
.Linfo_string19:
	.asciz	"ppre1"
.Linfo_string20:
	.asciz	"u8"
.Linfo_string21:
	.asciz	"ppre2"
.Linfo_string22:
	.asciz	"sysclk"
.Linfo_string23:
	.asciz	"Clocks"
.Linfo_string24:
	.asciz	"syst"
.Linfo_string25:
	.asciz	"cortex_m"
.Linfo_string26:
	.asciz	"peripheral"
.Linfo_string27:
	.asciz	"_marker"
.Linfo_string28:
	.asciz	"core"
.Linfo_string29:
	.asciz	"marker"
.Linfo_string30:
	.asciz	"()"
.Linfo_string31:
	.asciz	"*const ()"
.Linfo_string32:
	.asciz	"T"
.Linfo_string33:
	.asciz	"PhantomData<*const ()>"
.Linfo_string34:
	.asciz	"SYST"
.Linfo_string35:
	.asciz	"Delay"
.Linfo_string36:
	.asciz	"leds"
.Linfo_string37:
	.asciz	"f3"
.Linfo_string38:
	.asciz	"led"
.Linfo_string39:
	.asciz	"pex"
.Linfo_string40:
	.asciz	"gpio"
.Linfo_string41:
	.asciz	"gpioe"
.Linfo_string42:
	.asciz	"i"
.Linfo_string43:
	.asciz	"_mode"
.Linfo_string44:
	.asciz	"PushPull"
.Linfo_string45:
	.asciz	"PhantomData<stm32f30x_hal::gpio::PushPull>"
.Linfo_string46:
	.asciz	"MODE"
.Linfo_string47:
	.asciz	"Output<stm32f30x_hal::gpio::PushPull>"
.Linfo_string48:
	.asciz	"PhantomData<stm32f30x_hal::gpio::Output<stm32f30x_hal::gpio::PushPull>>"
.Linfo_string49:
	.asciz	"PEx<stm32f30x_hal::gpio::Output<stm32f30x_hal::gpio::PushPull>>"
.Linfo_string50:
	.asciz	"Led"
.Linfo_string51:
	.asciz	"__ARRAY_SIZE_TYPE__"
.Linfo_string52:
	.asciz	"Leds"
.Linfo_string53:
	.asciz	"half_period"
.Linfo_string54:
	.asciz	"u16"
	.section	.debug_pubnames,"",%progbits
	.long	.LpubNames_end0-.LpubNames_begin0
.LpubNames_begin0:
	.short	2
	.long	.Lcu_begin0
	.long	588
	.long	396
	.asciz	"cortex_m"
	.long	43
	.asciz	"__cortex_m_rt_main_trampoline"
	.long	432
	.asciz	"marker"
	.long	38
	.asciz	"led_roulette"
	.long	64
	.asciz	"__cortex_m_rt_main"
	.long	427
	.asciz	"core"
	.long	401
	.asciz	"peripheral"
	.long	149
	.asciz	"stm32f30x_hal"
	.long	270
	.asciz	"time"
	.long	154
	.asciz	"delay"
	.long	295
	.asciz	"gpio"
	.long	300
	.asciz	"gpioe"
	.long	515
	.asciz	"led"
	.long	190
	.asciz	"rcc"
	.long	510
	.asciz	"f3"
	.long	0
.LpubNames_end0:
	.section	.debug_pubtypes,"",%progbits
	.long	.LpubTypes_end0-.LpubTypes_begin0
.LpubTypes_begin0:
	.short	2
	.long	.Lcu_begin0
	.long	588
	.long	490
	.asciz	"*const ()"
	.long	580
	.asciz	"u16"
	.long	520
	.asciz	"Leds"
	.long	437
	.asciz	"PhantomData<*const ()>"
	.long	275
	.asciz	"Hertz"
	.long	159
	.asciz	"Delay"
	.long	389
	.asciz	"u8"
	.long	503
	.asciz	"()"
	.long	406
	.asciz	"SYST"
	.long	539
	.asciz	"Led"
	.long	345
	.asciz	"Output<stm32f30x_hal::gpio::PushPull>"
	.long	305
	.asciz	"PEx<stm32f30x_hal::gpio::Output<stm32f30x_hal::gpio::PushPull>>"
	.long	382
	.asciz	"u32"
	.long	471
	.asciz	"PhantomData<stm32f30x_hal::gpio::PushPull>"
	.long	454
	.asciz	"PhantomData<stm32f30x_hal::gpio::Output<stm32f30x_hal::gpio::PushPull>>"
	.long	373
	.asciz	"PushPull"
	.long	195
	.asciz	"Clocks"
	.long	0
.LpubTypes_end0:
	.section	".note.GNU-stack","",%progbits
	.eabi_attribute	30, 5
	.section	.debug_line,"",%progbits
.Lline_table_start0:

I think the relevant part of this output is section .LBB1_4 where we see that the constant 500 gets moved into r1 before calling the delay function instead of loading the variable from the stack.

@pevandenburie
Copy link

Explanation is given in issue #236 , although this does not resolve it. Maybe simply remove this gdb example from the book?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants