分享到plurk 分享到twitter 分享到facebook

版本 6ae0ede0ed312329a54138237acb1978d309a043

Lab8: GNU Toolchain and RTOS

預期目標

  • 在 QEMU 模擬的 STM32 環境中,嘗試執行 FreeRTOS 並且學習相關的操作
  • 熟悉 FreeRTOS 的內部運作機制
  • 對 RTOS 內部運作進行視覺化,以銜接未來的硬體操作
  • 實地練習 Multi-tasking 程式設計

預先準備

  • 安裝 Ubuntu Linux,建議版本為 12.04
  • 安裝必要的套件

.. code-block:: prettyprint

sudo apt-get install zlib1g-dev libsdl1.2-dev
  • 若 Ubuntu 使用 64bit 版本 ,請額外安裝 lib32gcc1 與 lib32ncurses5 套件

.. code-block:: prettyprint

sudo apt-get install lib32gcc1
sudo apt-get install lib32ncurses5

.. code-block:: prettyprint

cd  /
sudo tar jxvf toolchain-2012_03.tar.bz2

STM32 Overview

Image

GTKWave

  • GTKWave: 強大的 wave viewer
  • 在 Ubuntu Linux 的安裝與操作

.. code-block:: prettyprint

sudo apt-get install gtkwave
cp -af /usr/share/doc/gtkwave/examples . && cd examples
vzt2vcd des.vzt > des.vcd
gtkwave des.vcd
  • 參考輸出畫面。記得要先選取左下方 Type / Signals 並以 Append 加入到分析的清單中
Image
  • 建立 sample.vcd 檔案,觀察 GTKWave 輸出。內容如下:

.. code-block:: prettyprint

$version
$end
$timescale 1
$end
$var wire 8 0x01 0x01 $end
$var wire 8 0x02 0x02 $end
$var wire 8 0x03 0x03 $end
$var wire 8 0x04 0x04 $end
$var wire 8 0x05 0x05 $end
$var wire 8 0x06 0x06 $end
$dumpvars
#0
b00000110 0x01
#174542
b00000101 0x01
#174548
b00000110 0x01
#3512733
b00000000 0x01
$end

FreeRTOS for STM32

  • 取得最新的 Lab8 程式碼

.. code-block:: prettyprint

git clone https://gitcafe.com/embedded2013/Labs.git
cd Labs/Lab-8
  • 取得最新的 QEMU-STM32: git clone https://gitcafe.com/embedded2012/qemu_stm32.git

若 git 取得失敗的話,請改用以下: qemu_stm32-git.tar.bz2

.. code-block:: prettyprint

tar jxvf qemu_stm32-git.tar.bz2
  • 配置 QEMU-STM32 組態並編譯

.. code-block:: prettyprint

cd qemu_stm32
./configure --disable-werror --enable-debug --target-list="arm-softmmu" \
    --extra-cflags=-DDEBUG_CLKTREE \
    --extra-cflags=-DDEBUG_STM32_RCC \
    --extra-cflags=-DDEBUG_STM32_UART \
    --extra-cflags=-DSTM32_UART_NO_BAUD_DELAY \
    --extra-cflags=-DSTM32_UART_ENABLE_OVERRUN \
    --extra-ldflags="-lrt"
make && cd ..
  • 仿造 Lab-2 的操作,編譯並執行 FreeRTOS 程式

.. code-block:: prettyprint

cd freertos
export PATH=/usr/local/csl/arm-2012.03/bin:$PATH
make
make qemu
  • 按下 Ctrl-Alt-2 切換到 serial0 畫面時,可發現 FreeRTOS 示範程式中的 thread 已主動作了輸出,並且可在該畫面中,進行輸入操作。請觀察其行為並比對程式碼

分析

  • 研讀 FreeRTOS 程式碼關於 scheduling 的實做
  • FreeRTOS 程式碼已經過適度修改,引入 mini tracer 的機制,並準備特製的 GDB script,使其得以紀錄 task switch 的狀況 (需要包含 timing 資訊),最終可輸出 VCD 檔案,透過 GTKWave 視覺化
  • 最終預期在 freertos 目錄下,當 make qemuauto 執行後,會自動啟動 QEMU + GDB + FreeRTOS,並在 5 秒後 kill 必要的 process 且能夠輸出 VCD 檔案,檔名為 sched.vcd。以下是參考的 GTKWave 瀏覽畫面:
Image

繳交作業

  • 截止日期:
    • 成大: March 8, 2013 (含) 之前
    • 中正: March 12, 2013 (含) 之前
  • 寄件到
    • 標題: “[NCKU/Lab8]” 開頭,後面加學號與姓名
      • 中正: 改為 “[CCU/Lab8]” 開頭
      • 格式不合者,不計分!
    • 內容:(回答以下問題)
      • context switch 的精確度
      • 目前視覺化的問題
      • 可以如何改善?(需要提及程式碼)
    • 若不麻煩的話,附上一份自介