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

版本 1e3fde18c112453d1f6513b0e506f5d3ce5aa1f2

embedded/Lab8

Changes from 1e3fde18c112453d1f6513b0e506f5d3ce5aa1f2 to current

---
title: Lab8: GNU Toolchain and RTOS
toc: no
...

預期目標
-------
- 在 QEMU 模擬的 STM32 環境中,嘗試執行 `FreeRTOS<http://www.freertos.org/>`_ 並且學習相關的操作
- 在 QEMU 模擬的 STM32 環境中,嘗試執行 [FreeRTOS](http://www.freertos.org/) 並且學習相關的操作
- 熟悉 FreeRTOS 的內部運作機制
- 對 RTOS 內部運作進行視覺化,以銜接未來的硬體操作
- 實地練習 Multi-tasking 程式設計

預先準備
-------
- 安裝 Ubuntu Linux,建議版本為 12.04
- 安裝必要的套件

.. code-block:: prettyprint

    sudo apt-get install zlib1g-dev libsdl1.2-dev

- 若 Ubuntu 使用 **64bit 版本** ,請額外安裝 lib32gcc1 之套件
- 若 Ubuntu 使用 **64bit 版本** ,請額外安裝 lib32gcc1 與 lib32ncurses5 套件

.. code-block:: prettyprint

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

- 取得 GNU Toolchain: `toolchain-2012_03.tar.bz2</embedded/Lab1/toolchain-2012_03.tar.bz2>`_ 並解開到 /usr/local/csl/arm-2012.03 目錄,操作如下
- 取得 GNU Toolchain: [toolchain-2012_03.tar.bz2](/embedded/Lab1/toolchain-2012_03.tar.bz2) 並解開到 /usr/local/csl/arm-2012.03 目錄,操作如下

.. code-block:: prettyprint

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


STM32 Overview
--------------
- Powerful but Cheap
  - Wireless Connectivity
  - Computing/Prototyping
  - One for most use cases
  - `Introduction presentation</embedded/CM-STM32.pdf>`_
  - [Introduction presentation](/embedded/CM-STM32.pdf)

.. image:: /STM32-P103-01.jpg
![](/STM32-P103-01.jpg)


GTKWave
--------------
- `GTKWave<http://gtkwave.sourceforge.net/>`_: 強大的 wave viewer
- [GTKWave](http://gtkwave.sourceforge.net/): 強大的 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:: http://www.gentoo.org/proj/en/science/electronics/tests/gtkwave.png
![](http://www.gentoo.org/proj/en/science/electronics/tests/gtkwave.png)

- 建立 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 git://gitcafe.com/embedded2012/Labs.git
    git clone https://gitcafe.com/embedded2013/Labs.git
    cd Labs/Lab-8

- 取得最新的 QEMU-STM32:
    ``git clone git://gitcafe.com/embedded2012/qemu_stm32.git``
    ``git clone https://gitcafe.com/embedded2012/qemu_stm32.git``

若 git 取得失敗的話,請改用以下: `qemu_stm32-git.tar.bz2</embedded/qemu_stm32-git.tar.bz2>`_
若 git 取得失敗的話,請改用以下: [qemu_stm32-git.tar.bz2](/embedded/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-cflags=-DSTM32_UART_ENABLE_OVERRUN \
        --extra-ldflags="-lrt"
    make && cd ..

- 仿造 `Lab-2</embedded/Lab2>`_ 的操作,編譯並執行 FreeRTOS 程式
- 仿造 [Lab-2](/embedded/Lab2) 的操作,編譯並執行 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:: /embedded/Lab3/gtkwave.png
![](/embedded/Lab3/gtkwave.png)


繳交作業
-------
- 截止日期:
   * 成大: March 8, 2013 (含) 之前
   * 中正: March 12, 2013 (含) 之前

- 寄件到 <jserv.tw@gmail.com>
  - 標題: "[NCKU/Lab8]" 開頭,後面加學號與姓名
    * 中正: 改為 "[CCU/Lab8]" 開頭
    * 格式不合者,不計分!

  - 內容:(回答以下問題)
    * context switch 的精確度
    * 目前視覺化的問題
    * 可以如何改善?(需要提及程式碼)
  - 可以的話,附上一份自介

  - 若不麻煩的話,附上一份自介