開發紀錄HW7

安裝套件與環境建立

  • 安裝套件
sudo apt-get install git zlib1g-dev libsdl1.2-dev automake* autoconf* libtool libpixman-1-dev flex bison
sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi
  • 使用64位元系統,要在安裝以下32位元的套件
sudo apt-get install lib32gcc1 lib32ncurses5
 
  • Qemu環境建立
  • 到所要的資料夾,下載qemu_stm32
  • 下載完後進入qemu_stm32資料夾,建立環境
cd qemu_stm32
git submodule update --init dtc || sudo apt-get install libfdt-dev
./configure --disable-werror --enable-debug \
    --target-list="arm-softmmu" \
    --extra-cflags=-DSTM32_UART_NO_BAUD_DELAY \
    --extra-cflags=-DSTM32_UART_ENABLE_OVERRUN \
    --disable-gtk
make
  • 設定路徑
export PATH=/home/willy/Desktop/Embedded_System_2015Fall/hw7/qemu_stm32/arm-softmmu:$PATH
 
  • 在hw7資料夾,取得mini_arm_os程式碼
 
 
 

測試

進入mini_arm_os資料夾,開始測試
 
00-HelloWorld
  • 輸入make qemu,出現
Press Ctrl-A and then X to exit QEMU
 
qemu-system-arm -M stm32-p103 -nographic -kernel hello.bin
LED Off
Hello World!
  • 分析:
  • reg.h:
  • 主要做memory map的動作,根據 STM32F103規格書 P.39的memory map圖,宣告暫存器位址
  • __REG_TYPE define為volatile是為了避免compiler自作聰明將__REG_TYPE最佳化
  • startup.c
  • isr_vector : 藉由reset_handler進入hello.c的main()
  • 由hello.ld可知,程式進入點在此
  • hello.c
  • puts()將字串印出來
  • while(1)可以讓程式卡在這邊不結束,像是system("pause")
  • USART_FLAG_TXE = (uint16_t) 0x0080 = 0000 0000 0100 0000  ,用&取出USART2_SR的第七個bit,這個bit代表transmit data register empty, 1 表示transmit complete,此時跳出迴圈
  • hello.ld