版本 3539f3a40434fae3dabadcfced285efeb1f0f8a0
Changes from 3539f3a40434fae3dabadcfced285efeb1f0f8a0 to current
---
title: Lab3: GNU Toolchain and RTOS
toc: no
...
預期目標
-------
- 學習 GNU Toolchain 的使用
- 在 QEMU 模擬的 STM32 環境中,嘗試執行 `FreeRTOS<http://www.freertos.org/>`_ 並且學習相關的操作
* 搭配[第三周](/embedded/2012w3)與[第四周](/embedded/2012w4)課程進度
- 更進一步學習 GNU Toolchain 的使用,特別用在自動化分析環境
- 在 QEMU 模擬的 STM32 環境中,嘗試執行 [FreeRTOS](http://www.freertos.org/) 並且學習相關的操作
- 熟悉 FreeRTOS 的內部運作機制
- 對 RTOS 內部運作進行視覺化,以銜接未來的硬體操作
- 實地練習 Multi-tasking 程式設計
GTKWave
--------------
- [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 加入到分析的清單中
![](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
----------------------------------
- 仿造 [Lab-2](/embedded/Lab2) 操作,取得最新的 Lab3 程式碼
- 狀況一:只是在課堂練習
.. code-block:: prettyprint
git clone git://gitcafe.com/embedded2012/Labs.git
cd Labs/Lab-3
- 狀況二:整合到 P-<username>,準備可提交作業的環境。以 [jserv](/User/jserv) 為例:
.. code-block:: prettyprint
cd P-jserv
git fetch labs
git rebase labs/master
cd Lab-3
- 上個階段可能會面臨 GIT merge 失敗的狀況,可以先 ``git commit -a`` 然後 ``git rebase --skip`` 繼續
- 取得最新的 QEMU-STM32:
``git clone git://gitcafe.com/embedded2012/qemu_stm32.git``
- 配置 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](/embedded/Lab2) 的操作,編譯並執行 FreeRTOS 程式
.. code-block:: prettyprint
cd freertos
make
make qemu
- 按下 Ctrl-Alt-2 切換到 serial0 畫面時,可發現 FreeRTOS 示範程式中的 thread 已主動作了輸出,並且可在該畫面中,進行輸入操作。請觀察其行為並比對程式碼
作業 (A)
-------------
- 研讀 FreeRTOS 程式碼關於 scheduling 的實做
- 在這過程,可進一步學習 GDB 工具的使用。有很多視覺化工具可輔助,如:
![](/embedded/Lab3/ddd.png)
- 適度修改 FreeRTOS 程式碼,引入 mini tracer 的機制,並準備特製的 GDB script,使其得以紀錄 task switch 的狀況 (需要包含 timing 資訊),最終可輸出 VCD 檔案,透過 GTKWave 視覺化
* 提示:可準備 gdb2vcd.py 一類的工具程式,協助將 GDB 操作過程作分析與轉換
- 最終預期在 freertos 目錄下,當 ``make qemuauto`` 執行後,會自動啟動 QEMU + GDB + FreeRTOS,並在 5 秒後 kill 必要的 process 且能夠輸出 VCD 檔案,檔名為 ``sched.vcd``。以下是參考的 GTKWave 瀏覽畫面:
![](/embedded/Lab3/gtkwave.png)
- 提示:
* 舉凡 FreeRTOS, main.c, GDB scripts, emulate.sh 等檔案都能修改,重點是建立 mini tracer 的機制,以利後續 RTOS 追蹤分析使用
作業 (B)
-------------
- 以 FreeRTOS 的 multi-tasking 重寫 [Lab2](/embedded/Lab2) 的作業 (B),基本條件照舊,只是改為兩個以上的 Task
.. code-block:: prettyprint
cd Lab3/mtask
make
- 不得在 C 程式引入 <string.h> 檔頭,而是用 ``mtask`` 目錄下的 string-util.c 與 string-util.h
- 其中負責接收 UART 輸入的 Task 必須呼叫 ``my_strtok`` 來進行輸入字串的分析,而負責進行 ROT13 編碼與在 UART 輸出的 Task 也應該呼叫 ``my_strtok`` 來作字串統計
- 當輸入字串為 "<END>" (不包含括號) 時,系統應該停止運作,並輸出統計結果,如下:(範例)
.. code-block:: prettyprint
Most frequent input: the
Length of the longest word: 9
- 提示:
* 呼叫 ``my_strtok`` 的過程,會遇到 Reentrancy 的問題,請作必要的修改
參考資訊
--------------
- Efficient Debugging and Tracing of System Level Designs
* http://www.cecs.uci.edu/technical_report/TR06-08.pdf
- Reentrancy
* http://en.wikipedia.org/wiki/Reentrancy_%28computing%29
- RTOS Design Tutorial
* http://www.freertos.org/tutorial/
- FreeRTOS Training
* [Task Management](http://www.slideshare.net/amraldo/free-freertos-coursetask-management)
* [Queue Management](http://www.slideshare.net/amraldo/m3-introduction-to-free-rtos-v605)
* [Semaphore/Mutex Management](http://www.slideshare.net/amraldo/freertos-course-semaphoremutex-management)