開發紀錄 - Homework7 / Homweork8
Nov 18, 2015 (含) 之前

HW7

作業要求 (A)
  • 安裝和設定 QEMU
  • 依據指示,將 00-Semihosting, 00-HelloWorld, …, 07-Threads 均實際測試並研讀程式碼
  • 在 github 上 fork mini-arm-os,並修改 07-Threads (不要增加新的目錄!),提供基本的 shell,然後能夠用新建立的 thread 計算 fibonacci 數列
  • shell 程式碼可參照 rtenv+ 的 main.c,裡頭提供 shell 實做
  • 建立新的 Hackpad,列於「+作業區」,需要標注「開發紀錄 (A)」
 
安裝QEMU
 
 安裝必要套件
sudo apt-get install git zlib1g-dev libsdl1.2-dev automake* autoconf* libtool libpixman-1-dev
sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi
  • 若 Ubuntu 使用 64bit 版本 ,額外安裝 lib32gcc1 套件
sudo apt-get install lib32gcc1 lib32ncurses5
 
STM32 on QEMU 環境建立與測試 
cd ~
mkdir -p workspace
git clone qemu_stm32
cd qemu_stm32
git submoduel 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=~/workspace/qemu-stm32/arm-softmmu:$PATH
cd ~workspace
git clone mini-arm-os.git
 
安裝過程沒有出現warning或是error應該是順利完成了,要特別注意PATH設定,因為就算錯誤也不會顯示的QQ
 
mini-arm-os測試
00-HelloWorld
  • 【hello.ld】 
ENTRY Point是reset_handler
MEMORY設定FLASH的起始位址為0x00000000,長度為128K
SECTIONS內:
KEEP(要保留的section):因為linker有garbage collection,如果要保證section不會被回收,可以用該指令
 
  • 【reg.h】
定義memory map。
I/O device必須透過I/O port來存取與控制,每個I/O port都會被指定一個memory address,稱為I/O port address(或port address),此即所謂的memory mapped I/O。
Memory-mapped I/O的觀念是將I/O port或I/O memory “mapping” 到 memory address上,此位址稱為I/O port address。採用memory-mapped I/O觀念的主要好處是可以將I/O device的存取變成記憶體存取。因此,對使用者而言,存取I/O裝置就會變成跟CPU的記憶體存取一樣。
RISC 架構的處理器,在 system design 方面,也都採取 memory-mapped I/O (I/O memory) 的觀念。