--- title: Lab8: GNU Toolchain and RTOS toc: no ... 預期目標 ------- - 在 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 之套件 .. code-block:: prettyprint sudo apt-get install lib32gcc1 - 取得 GNU Toolchain: `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`_ .. image:: /STM32-P103-01.jpg 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:: 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 cd Labs/Lab-8 - 取得最新的 QEMU-STM32: ``git clone git://gitcafe.com/embedded2012/qemu_stm32.git`` 若 git 取得失敗的話,請改用以下: .. 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 make && cd .. - 仿造 `Lab-2`_ 的操作,編譯並執行 FreeRTOS 程式 .. code-block:: prettyprint cd freertos 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 繳交作業 ------- - 寄件到 - 標題: "[NCKU/Lab8]" 開頭,後面加學號與姓名 - 可以的話,附上一份自介