天天看點

eCos Synthetic實踐(三)——I/O輔助程序

mingdu.zheng <at> gmail <dot> com      

1. 簡介

I/O輔助程序為eCos Synthetic提供不能簡單通過系統調用實作的裝置模拟。 I/O輔助程序為eCos和虛拟裝置之間提供了标準接口,通過該接口可以模拟資料讀寫和中斷。 I/O輔助程序提供了一個使用者界面, 通過使用者界面可以為開發人員提供一個直覺的狀态訓示。 I/O輔助程序的主要部分使用TCL編寫,是以其模拟裝置的實作也可以使用TCL語言實作,這使得擴充I/O輔助程序變得更加容易。

本文是《eCos Synthetic實踐》系列的第三篇,介紹怎樣配置、編譯、安裝I/O輔助程序,以及相關的裝置子產品, 配置、編譯、安裝過程是标準的configure, make, make install三部曲。以及I/O輔助程序的使用和tdf配置檔案。

2. 安裝附加軟體

首先需要安裝tcl-dev和tk-dev,分别是tcl和tk的開發包,I/O輔助程序使用TCL實作,使用Tk實作其使用者界面, 是以需要安裝這兩個開發包。

sudo apt-get install tcl-dev      

安裝tcl-dev開發包,如果未安裝該軟體包,那麼将出現錯誤:unable to locate Tcl configuration file tclConfig.sh

sudo apt-get install tk-dev      

安裝tk-dev開發包,如果未安裝該軟體包,那麼将出現錯誤:unable to locate Tk config file tkConfig.sh

3. I/O輔助程序的編譯安裝

3.1. 編譯安裝I/O輔助程序主子產品和Console子產品

mkdir ~/build
cd ~/build
~/ecos-hg/packages/hal/synth/arch/current/host/configure
make
sudo make install      

預設安裝到/usr/local/libexec/ecos/hal/synth/arch/<version>目錄下。 主要檔案包括ecosynth, ecosynth.tcl, console.tcl。ecosynth是由C語言編譯的二進制可執行檔案, ecosynth初始化TCL的運作環境,然後調用TCL解釋器運作ecosynth.tcl腳本,ecosynth.tcl是I/O輔助程序的主體部分, 提供資料傳輸、中斷管理、使用者界面等功能。console.tcl是終端模拟裝置,用來接收eCos的診斷輸出并将輸出顯示在I/O輔助程序的視窗内, console.tcl由ecosynth.tcl根據tdf配置選項決定是否加載。不能直接執行這三個檔案中的任意一個,這也是将這幾個檔案存儲在libexec目錄下的原因, ecosynth由eCos在初始化時建立執行。

3.2. 編譯安裝Ethernet子產品

rm * -rf
 ~/ecos-hg/packages/devs/eth/synth/ecosynth/current/host/configure
make
sudo make install      

預設安裝到/usr/local/libexec/ecos/devs/eth/synth/ecosynth/>version<目錄下。 主要檔案包括ethernet.tcl、rawether,ethernet.tcl是虛拟以太網裝置的實作檔案,由ecosynth.tcl根據tdf配置選項進行加載, rawether是由C語言編譯的二進制可執行檔案,用來幫助ethernet.tcl完成一些使用TCL語言不能實作的底層操作, 主要是對Linux以太網裝置的讀寫,可以是真實的網卡,也可以是TAP裝置。

3.3. 編譯安裝Framebuffer子產品

rm * -rf
~/ecos-hg/packages/devs/framebuf/synth/current/host/configure
make
sudo make install      

預設安裝到/usr/local/libexec/ecos/devs/framebuf/synth/>version<目錄下。 主要檔案包括framebuf.tcl、framebuf,framebuf.tcl是虛拟顯示裝置的實作檔案,由ecosynth.tcl根據tdf配置選項進行加載, framebuf是由C語言編譯的二進制可執行檔案,用來幫助framebuf.tcl完成一些使用TCL語言不能實作的底層驅動, 主要是像素格式換行和對X Server的繪圖輸出。

3.4. 編譯安裝Watchdog子產品

rm * -rf
~/ecos-hg/packages/devs/watchdog/synth/current/host/configure
make 
sudo make install      

預設安裝到/usr/local/libexec/ecos/devs/watchdog/synth/>version<目錄下。 Watchdog是相對簡單的裝置,由watchdog.tcl實作,不需要C語言實作的其它程式來輔助,watchdog.tcl由ecosynth.tcl根據tdf配置選項進行價值。

4. 簡單執行個體

接下來我們将建立一個比較簡單的執行個體,該執行個體将引用診斷輸出和看門狗這兩種相對簡單的裝置。

4.1. 配置編譯eCos庫

請參考《eCos Synthetic實踐(一)——Hello World!》3. 配置編譯eCos Synthetic庫。

需要補充的是需要添加Watchdog IO device,這裡的執行個體将引用Watchdog元件。

圖 1. 添加Watchdog IO device元件

​​​

eCos Synthetic實踐(三)——I/O輔助程式

​​

4.2. 建立Eclipse工程

打開Eclipse,通過菜單File > New > Project,選擇C/C++分類下的C++ Project, 打開C++ Project項目建立向導, Project name 輸入 synth-hello,Project type選擇Hello World C++ Project, 點選Finish完成項目建立。 剩下的工作請參考《eCos Synthetic實踐(一)——Hello World!》5. 建立Hello World工程

執行個體C++代碼,将下列代碼覆寫Eclipse工程的源代碼, 在這個代碼中,不斷增加複位看門狗的延時時間,直到看門狗逾時停止eCos應用程式。

#include <cyg/infra/diag.h>
#include <cyg/kernel/kapi.h>
#include <cyg/io/watchdog.hxx>

int main(void)
{
    diag_printf("Start watchdog.\n");
    Cyg_Watchdog::watchdog.start();

    for(int i = 0; ; i++)
    {
        diag_printf("Delay %d ticks.\n", i * 10);
        cyg_thread_delay(i * 10);

        diag_printf("Reset watchdog.\n");
        Cyg_Watchdog::watchdog.reset();
    }

    return 0;
}      

執行個體tdf檔案,儲存到~/.ecos/synth/default.tdf,tdf檔案是I/O輔助程序的配置檔案。

synth_device console {
    filter trace {^TRACE:.*} -foreground HotPink1 -hide 1
}

synth_device watchdog {
    use wallclock_time
}      

4.3. 編譯工程

通過菜單Project > Build Project編譯工程,在Console視圖可以看到編譯輸出及結果。

4.4. 運作eCos應用和I/O輔助程序

預設情況下,調試或運作eCos不會執行I/O輔助程序,需要為eCos可執行檔案加上–io選項才會執行I/O輔助程序。 如果在Eclipse環境下調試,那麼通過Run > Debug Configurations…打開調試配置對話框, 在C/C++ Application上右鍵,選擇New, 建立一個 C/C++ Application類型的調試配置。 選擇Arguments标簽頁,在Program arguments輸入框内加入選項“–io”。

圖 2. 添加程式參數

​​​

eCos Synthetic實踐(三)——I/O輔助程式

​​

再切換到Environment标簽頁,添加環境變量ECOS_REPOSITORY=”~/ecos-hg/packages”,這個環境變量指向所使用的eCos倉庫的根目錄。

圖 3. 添加環境變量

​​​

eCos Synthetic實踐(三)——I/O輔助程式

​​

如果沒有添加ECOS_REPOSITORY環境變量,那麼預設使用編譯I/O輔助程序的那個eCos倉庫作為目前的eCos倉庫, 但是ecosynth.tcl檔案存在一個bug,變量名引用錯誤,實際上不能正确使用預設的eCos倉庫。 如果沒有添加環境變量,那麼将導緻錯誤:can’t read “synth::_ecos_repository”: no such variable,

如果通過終端運作eCos程式,那麼在程式前設定環境變量,程式名後添加–io參數。

ECOS_REPOSITORY=~/ecos-hg/packages/ ./synth-hello --io      

4.5. 運作效果

下圖是看門狗逾時後的I/O輔助程序主界面,可以看到diag_printf輸出的文字資訊顯示在程式主界面中,右上角顯示看門狗狀态, 圖中的狗叫圖形象地展示了逾時狀态。

圖 4. 運作效果

​​​

eCos Synthetic實踐(三)——I/O輔助程式

​​

5. 參考資料

  1. ​​《eCos Synthetic實踐(二)——簡單外設》​​
  2. ​​《eCos Synthetic實踐(一)——Hello World!》​​
  3. ​​《XXXVIII. eCos Synthetic Target》​​:官方參考手冊。
  4. ​​《eCos的Linux Synthetic Target簡介》​​:官方參考手冊的部分翻譯。
  5. ​​《eCos需要Synthetic虛拟目标闆的理由》​​:誰需要Synthetic,什麼情況下需要Synthetic?
  6. ​​《虛拟實驗室eCos開發環境的配置 (Linux)》​​:使用基于QEMU的模拟器運作eCos。
  7. ​​VirtualBox​​:虛拟機軟體。
  8. ​​Xubuntu​​:易于使用又節省資源的Linux發行版。

繼續閱讀