天天看點

eCos Synthetic實踐(二)——簡單外設

1. 簡介

Synthetic Target同樣包含多種硬體裝置,當然它們都是虛拟的, 其中一部分裝置通過Linux系統調用就可以實作,不需要I/O輔助程序的參與, 這類裝置包括Disk、ADC、Flash、WallClock(實時時鐘)、RTC(系統嘀嗒), 另一部分裝置必須和I/O輔助程序相配合才能實作,這類裝置包括Ethernet、Framebuffer、Watchdog。 此外,Synthetic下的診斷輸出既可以通過Linux系統調用直接輸出到終端, 也可以通過I/O輔助程序輸出到I/O輔助程序的主視窗上。

本文是《eCos Synthetic實踐》系列的第二篇,介紹不需要I/O輔助程序參與的簡單裝置。

Synthetic基本原理請閱讀參考資料的《eCos的Linux Synthetic Target簡介》。

2. Diag(診斷輸出)

診斷輸出是作為HAL的一部分提供的,并不是單獨的子產品。

調用diag_printf函數輸出診斷資訊,diag_printf函數原型和printf函數原型一緻, 可以像使用printf函數一樣使用diag_printf函數,隻是diag_printf不支援浮點數。 要列印浮點數,隻能使用printf函數,printf函數需要ISO C library standard input/output functions元件, 而且需要勾上Floating point support選項。盡量避免使用printf,因為printf的實作是基于I/O子系統的, 會繞很大一個彎才将字元輸出,而diag_printf是直接引用HAL接口實作的。

在沒有I/O輔助程序的情況下,診斷輸出到終端,在有I/O輔助程序的情況下,診斷輸出到I/O輔助程序主視窗。

3. RTC(系統嘀嗒)

再一次解釋,在eCos中,RTC指的是Tick Timer,也就是嘀嗒定時器或者系統嘀嗒或者時鐘嘀嗒, 是指為作業系統提供逾時、時間片輪的定時器,不是指提供年月日時分秒的實時時鐘, 雖然RTC的英文字面确實是實時時鐘的意思,提供年月日時分秒的實時時鐘在eCos中被稱為WallClock, 字面意思為挂鐘,為什麼當年eCos的作者會選擇這個名字呢? 一個可能的原因是早期計算機的系統嘀嗒和實時時鐘是由同一塊電路提供的, 即使是現在,很多實時時鐘晶片仍然提供32.768KHz的周期信号, 完全可以使用該32.768KHz信号作為嘀嗒定時器的時鐘源,這種實作方式還可以将系統嘀嗒和實時時鐘同步起來。

跟診斷輸出一樣,RTC是作為HAL的一部分提供的,并不是單獨的子產品。

與RTC相關的選項

  1. Real-time clock period: 為系統嘀嗒的時間間隔,機關為微秒。
  2. Real-time clock denominator: Real-time clock numerator除以Real-time clock denominator所得值也是系統嘀嗒的時間間隔,機關為納秒。
  3. Real-time clock numerator: Synthetic Target下的Real-time clock numerator參數是使用Real-time clock numerator和Real-time clock denominator計算出來的,不能直接修改。

圖 1. RTC選項

eCos Synthetic實踐(二)——簡單外設

4. Wallclock(實時時鐘)

Wallclock提供實時時鐘功能,跟Linux一樣,eCos的實時時鐘提供的時間值是從1970-01-01 00:00:00開始到目前時刻的秒數, 通過C庫函數可以将這個值轉換成直覺的日期和時間。

使用Wallclock需要添加Wallclock device framework(CYGPKG_IO_WALLCLOCK)元件,通過eCos Configuration Tool的菜單Build > Packages打開Packages對話框, 在左邊的清單中選擇Wallclock device framework點選Add>>按鈕添加到右邊清單。

圖 2. 添加新元件

eCos Synthetic實踐(二)——簡單外設

與Wallclock相關的選項

  1. Hardware wallclock: 選擇使用硬體時鐘,事實上在Synthetic不存在任何真實硬體,一切都是軟體實作的,選擇這個選項将使用Linux系統的時鐘。
  2. Name of file wich holds system-eCos wallclock offset: 該配置項指定一個檔案名,該檔案儲存eCos系統時鐘與Linux系統時鐘的偏差,在eCos系統内修改時鐘不會影響Linux系統時鐘, 而是記錄兩個時鐘時間的偏差,eCos系統讀取時鐘時首先通過系統調用讀取Linux系統時鐘,然後在Linux系統時鐘的基礎上加上偏差。

圖 3. Wallclock選項

eCos Synthetic實踐(二)——簡單外設

5. ADC(模數轉換器)

使用ADC需要添加Generic ADC Support(CYGPKG_IO_ADC)元件,通過eCos Configuration Tool的菜單Build > Packages打開Packages對話框, 在左邊的清單中選擇Generic ADC Support點選Add>>按鈕添加到右邊清單。

與ADC相關的選項

  1. Hardware ADC device drivers: 使能硬體驅動,隻有在這個選項有效的情況下,驅動程式才有效。
  2. Sample size: 指定采樣位數,預設為16位ADC。
  3. Default sample rate: 指定預設采樣速率,即每秒鐘采樣的次數。
  4. Device name: 該通道ADC在eCos中的裝置名。
  5. Size of data buffer: 資料緩存大小,ADC總是每次采樣一個資料,而應用程式可以一次讀取多個資料, ADC驅動首先把資料存儲在緩存裡,然後等着應用程式讀取,緩存是個FIFO隊列。
  6. Channel source: 資料源,可以配置成CONST、RANDOM、FILE這3種模式中的一種, CONST模式下,讀取ADC将傳回常量,常量由選項Constant sample value指定, RANDOM模式下,讀取ADC将傳回随機數, FILE模式下,讀取ADC将傳回檔案中的值,如果到達檔案尾部,那麼重頭開始,檔案名由選項Sample data filename指定。
  7. Constant sample value: 如果Channel source選擇CONST,那麼該選項指定常量值。
  8. Sample data filename: 如果Channel source選擇FILE,那麼該選項指定提供資料源的檔案名,為Linux系統下的檔案。

圖 4. ADC選項

eCos Synthetic實踐(二)——簡單外設

6. Disk(磁盤)

Synthetic下的Disk使用Linux系統下的檔案作為存儲媒介,eCos中對磁盤的讀寫最終都轉換成Linux系統調用對檔案進行讀寫, 如果Disk中的内容是有效的檔案系統,那麼可以在Linux系統下将存儲在檔案内的檔案系統挂載到Linux(mount -o loop)。

使用Disk需要添加Disk deivce drivers(CYGPKG_IO_DISK)元件,通過eCos Configuration Tool的菜單Build > Packages打開Packages對話框, 在左邊的清單中選擇Disk deivce drivers點選Add>>按鈕添加到右邊清單。

與Disk相關的選項

  1. Provide disk 0 device: 使能Disk驅動,隻有将這個選項勾上,驅動程式才有效。
  2. Device name for ecosynth disk 0 device: Disk在eCos中的裝置名。
  3. Linux file name for ecosynth disk 0 device: 指定鏡像檔案名。
  4. Size in bytes for ecosynth disk 0: Disk大小(存儲空間)。

圖 5. Disk選項

eCos Synthetic實踐(二)——簡單外設

7. Flash(閃存)

與Disk裝置類似,Flash也是使用Linux系統下的檔案作為存儲媒介的,對Flash的讀寫擦除都是對Linux檔案的讀寫, 一樣可以将鏡像檔案進行挂載。

使用Flash需要添加Generic FLASH memory support(CYGPKG_IO_FLASH)元件,通過eCos Configuration Tool的菜單Build > Packages打開Packages對話框, 在左邊的清單中選擇Generic FLASH memory support點選Add>>按鈕添加到右邊清單。

與Flash相關的選項

  1. Provid /dev block devices: Flash裝置可以通過I/O子系統函數,例如cyg_io_lookup,cyg_io_read等函數通路,也可以直接通過Flash API通路, 如果需要通過I/O子系統通路,那麼需要将選項勾上。
  2. Base address of flash: Flash的起始位址。
  3. Size of one block of synth flash: Flash塊大小,Flash是按塊為機關進行擦除的。
  4. Number of blocks in the synth flash: Flash塊數目。
  5. Number of boot blocks in the synth flash: 引導區的塊數目。
  6. Size of the boot blocks in the synth flash: 引導區的塊大小。
  7. Is the boot blocks at the bottom of the flash: 是否在Flash底部提供引導區,預設使能。
  8. Name of file emulating synth flash: 鏡像檔案名,在Synthetic中,Flash實際上是存儲在Linux系統上的一個檔案,這個選項指定檔案名。

圖 6. Flash選項

8. 參考資料

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

繼續閱讀