2016-03-09 44 views
0

我安裝的Visual Studio 2015年VisualGDB和設置使用HAL的LED閃爍的項目,如本例說明:http://visualgdb.com/tutorials/arm/stm32/stm32l4/VisualGDB與STM32L476RG核蛋白

安裝正確的工具,而我的項目遵循的例子正好,包括第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! 

與此同時,我得到彈出一個對話框:「用於堆棧的內存位置不可寫,請檢查設備類型和鏈接器CRIPT。您可以禁用自動堆棧通過VisualGDB項目屬性」

檢查展望這是構建過程中產生的.MAP文件,沒有什麼接近0x61000000或爲0x01000000任何東西。有一個_estack = 0x20020000。

我在鏈接器標誌(LDFLAGS:= -Wl,-N,-gc-sections)中添加-N,以查看這是否會影響任何內容,並且ID沒有。

對於可能出錯的任何想法?

提前致謝。

+0

錯誤後調試器可以停止目標,這是在Default_Handler()startup_stm32l476xx.c在文件的底部。 每說評論功能,增加了生成文件參數DEFAULT_INTERRUPT_HANDLERS然後 的土地我的HardFault_Handler()。根據函數 中的註釋,發生了未處理的中斷,並且需要一個處理它的函數定義:** extern「C」void HardFault_Handler();但是,根本原因似乎是未正確配置的內存,無論是在鏈接器文件中還是在另一個VisualGDB設置中。仍然試圖解決這個問題... – Walt

+0

我的工作在我的項目來診斷硬故障,並發現這篇文章有幫助:http://support.code-red-tech.com/CodeRedWiki/DebugHardFault這提供了更多的信息發生故障時處理器的狀態。我正在開發STM32F0(Cortex M0),它不包含所有「故障狀態」寄存器,所以我不得不刪除代碼中的那些部分,儘管表明了適用性。 – mbmcavoy

回答

1

當VisualGDB嘗試測試堆棧末尾(_estack - 4)是否可寫時,將出現「用於堆棧的內存位置不可寫入」錯誤。

如果切換GDB會話窗口的所有GDB交互模式,你會看到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設備定義中也可能存在一個錯誤。

您可以通過您的鏈接腳本在你的設備數據表中描述的RAM的結束地址_estack的地址比較發現這一點。

+0

STM32L476x數據表顯示所有變體的128K RAM,並且.map文件在0x20020000處顯示_estack。 SRAM1爲96K,起始地址爲0x20000000,SRAM2爲32K,但起始地址爲0x10000000。由於SRAM塊不是連續的,在我看來_estack值是不正確的。 VisualGDB在其支持的設備表中顯示具有正確存儲容量的STM32L476RG。我重建了STM32L476RC,但得到相同的結果。你可以檢查設備定義,或者讓我知道是否還有別的東西我應該看看。我也嘗試在startup_stm..xx.c文件中取消註釋行941,但不包括 – Walt

+0

在通過VisualGDB更新選項啓動該過程後,軟件自行更新,現在調試運行良好。謝謝! – Walt