qemu stm32特製版源碼編譯及調試--Apple的學習筆記 一,前言 二:編譯可調試的stm32_qemu二次開發源碼 三,通過gdb源碼調試解決運行時的問題 四,備份調試命令

一,前言

qemu虛擬機還有下文,因爲qemu最吸引我的地方就是二次開發,可以模擬各種外設。可以參考我之前的blogqemu虛化原理入門--Apple的學習筆記Qemu2.8虛擬機源碼分析—Apple的學習筆記我已經掌握了qemu2.8源碼的基礎及2.8源碼的編譯。並且我也使用過了基於stm32開發板的qemu二次開發環境。但是我的目的是能修改qemu源碼,達到更加深入的理解程度,而stm32的qemu二次開發源碼就成爲了我現在主要研究的對象。

二:編譯可調試的stm32_qemu二次開發源碼

通過查看版本發現是基於qemu2.8開發的,對比STM32二次開發的源碼和qemu2.8。能發現CONFIG_GNU_MCU_ECLIPSE宏定義打開後,就可以支持STM32開發板。
1.運行命令生成帶調試的makefile
./configure --target-list=gnuarmeclipse-softmmu --enable-debug
出錯提示需要安裝SDL2
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-image-dev

2.完成後打開config目錄
/work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu# cat config-target.mak
在文件最後添加-DCONFIG_GNU_MCU_ECLIPSE的預編譯宏定義

# Automatically generated by configure - do not modify
TARGET_ARM=y
TARGET_NAME=gnuarmeclipse
TARGET_BASE_ARCH=arm
TARGET_ABI_DIR=arm
CONFIG_SOFTMMU=y
TARGET_XML_FILES= /work/qemu-gnuarmeclipse-dev/gdb-xml/arm-core.xml /work/qemu-gnuarmeclipse-dev/gdb-xml/arm-cortexm.xml /work/qemu-gnuarmeclipse-dev/gdb-xml/arm-vfp.xml /work/qemu-gnuarmeclipse-dev/gdb-xml/arm-vfp3.xml /work/qemu-gnuarmeclipse-dev/gdb-xml/arm-neon.xml
CONFIG_I386_DIS=y
CONFIG_ARM_DIS=y
LDFLAGS+=
QEMU_CFLAGS+=-DCONFIG_GNU_MCU_ECLIPSE
  1. make編譯成功
    原版是2.8.0的bin,我由於下載的dev的最新分支,所以版本其實是2.8.5的。
  2. export PATH=/work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu:$PATH
    運行qemu-system-gnuarmeclipse -M help能看到開發板信息
  3. cd /work/STM32F429_Discovery_FreeRTOS_9/Projects/LED
  4. 運行qemu-system-gnuarmeclipse --verbose --verbose --board STM32F429I-Discovery --mcu STM32F429ZI -d unimp,guest_errors --image led.elf --semihosting-config enable

三,通過gdb源碼調試解決運行時的問題

問題1

qemu: qemu_mutex_unlock: Operation not permitted
Board: 'STM32F429I-Discovery' (ST Discovery kit for STM32F429/439 lines).
Picture file 'STM32F429I-Discovery.jpg' not found.

首先確認stm32f429i_discovery_board_init_callback函數能正常進入。通過調試發現調用graph.c導致的,通過搜索源碼,我可以先不用LCD顯示,於是添加-nograph可以繼續調試了。
問題2
接着又出現JSON SVD file '(null)' not found.通過調試發現qemu_find_file會傳入參數STM32F429x-qemu.json,就是文件名,但是找不到此文件路徑,而默認的路徑爲

#define SHARE_SUFFIX "/share/qemu"
#define BUILD_SUFFIX "/pc-bios"

根據調試信息,我把相關qemu-stm32運行過程中需要使用的文件copy到對應的路徑/usr/local/share/qemu後,成功運行。

[New Thread 23930.23938]

Thread 1 "qemu-system-gnu" hit Breakpoint 1, qemu_find_file (type=23, 
    name=0x803443a8 "STM32F429x-qemu.json") at vl.c:2539
2539        if (access(name, R_OK) == 0) {
(gdb) c
Continuing.

Thread 1 "qemu-system-gnu" hit Breakpoint 2, qemu_find_file (type=23, 
    name=0x803443a8 "STM32F429x-qemu.json") at vl.c:2576
2576        for (i = 0; i < data_dir_idx; i++) {
(gdb) p data_dir[0]
$1 = 0x808e9210 "/work/qemu-gnuarmeclipse-dev/pc-bios"
(gdb) p data_dir[1]
$2 = 0x8035d28b "/usr/local/share/qemu"
(gdb) c
Continuing.

所以我在此路徑添加文件。並且這些文件都是從原版的路徑中copy出來的。(上一行是原版的)原版是ok的,只是原版是二進制不支持調試。
並且這個文件解決後,由於我copy的完整的需要的文件,所以第一個必須要加-nogragh才能調試的問題也成功解決了。

四,備份調試命令

gdbserver localhost:2345 /work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu/qemu-system-gnuarmeclipse --board STM32F429I-Discovery --mcu STM32F429ZI --image led.elf
另外再開一個窗口,輸入gdb然後運行如下命令
target remote localhost:2345



至此,qemu_stm32二次開發環境已經搭建完成咯~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章