我使用VisualGDB设置Visual Studio 2015,并使用HAL设置LED Blink项目,如本例所述:http://visualgdb.com/tutorials/arm/stm32/stm32l4/
工具安装正确,我的项目完全遵循示例,包括步骤6,然后直到步骤7.但是,在设置断点并尝试按步骤8运行它之后,我在输出窗口:
Open On-Chip Debugger 0.9.0 (2015-10-08-15:57)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 500 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : clock speed 480 kHz
Info : STLINK v2 JTAG v24 API v2 SWIM v10 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.263434
Info : stm32l4x.cpu: hardware has 6 breakpoints, 4 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0800027c msp: 0x20020000
adapter speed: 4000 kHz
Info : accepting 'gdb' connection on tcp/3333
Info : device id = 0x10076415
Info : flash size = 1024kbytes
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0800027c msp: 0x20020000
adapter speed: 4000 kHz
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0800027c msp: 0x20020000
adapter speed: 4000 kHz
Warn : Padding 4 bytes to keep 8-byte write size
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000004a msp: 0x20020000
Warn : block write succeeded
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0800027c msp: 0x20020000
Error: Memory write failure!
同时,我收到一个对话框弹出窗口,指出:&#34;用于堆栈的内存位置不可写。请检查设备类型和链接描述文件。您可以通过VisualGDB项目属性禁用自动堆栈检查&#34;
查看在构建期间生成的.map文件,0x61000000附近没有任何内容,或者在0x01000000处没有任何内容。有一个_estack = 0x20020000。
我在链接器标志(LDFLAGS:= -Wl,-N,-gc-sections)中添加了一个-N,看看这是否会影响任何东西,并且id没有。
关于可能出错的任何想法?
提前谢谢。
答案 0 :(得分:1)
当VisualGDB尝试测试堆栈结尾(_estack-4)是否可写时,会发生“堆栈使用的内存位置不可写”错误。
如果您将GDB会话窗口切换到All GDB Interaction模式,您将看到VisualGDB正在尝试在那里写一个随机值,然后检查它是否可以被回读:
-data-evaluate-expression "&_estack" ^done,value="0x20020000" -var-create - * "*((void **)0x2001fffc)" ^done,name="var1",numchild="0",value="0x80002ad ",type="void *",has_more="0" -var-assign "var1" 0x1b5bfd22 ^done,value="0x1b5bfd22" -data-evaluate-expression "\*\(\(void\ \*\*\)0x2001fffc\)" ^done,value="0x1b5bfd22"
如果没有,很可能在创建项目时选择了不正确的设备(例如,当您选择具有64K RAM的设备时,您的设备实际上有32KB的RAM)。 VisualGDB设备定义中也可能存在错误。
您可以通过比较链接描述文件中_estack的地址和设备数据表中描述的RAM的结束地址来找到它。