All Projects → jserv → Taunix

jserv / Taunix

Licence: gpl-2.0
Realtime operating system kernel for TI TMS320F24x DSP

Programming Languages

c
50402 projects - #5 most used programming language

Taunix-0.7.4-alpha4 Date:1999-10-31

經過長時間的等候,終於 Taunix-0.7.4 版大致底定。之所以會用掉這麼多時間, 當然跟作者本人平日有修課的負擔,不能像開發第一版的 Taunix 時那麼全神灌注, 第二就是 0.7.4 版增加了對 x243 的支援。TI 的 243 DSP 雖然是與 240 大致上是 相容的,但小部份的不同卻導致了問題,大部分的時間是花在相容性的測試上,同時 修正一些由來已久的 bugs、重新設計並驗證 IPC 方面的程式碼....等等。但是 0.7.4 版是在 243 上進行開發與測試的,但此時我已沒有 240 的 EVM 板可再測試 程式碼,儘管 0.7.4 的程式碼是從 0.7.3 來的,但畢竟還沒有在 240 上測試過。

Taunix-0.7.4 版的修正與功能方面的增強如下:

1.修正 SCI 非同步運作時會導致 DSP reset 的 bug

主要問題出在 resched() 內切換工作時,switch_task() 未受到 critical section 的保護,而切換到錯誤的區段等致發生 NMI,進而 reset。修正的方法是將 switch_task() 納入 disable_int/enable_int 的 critical section 內,但由於 這麼做會導致新生的工作無法 enable 中斷,於是依照原本 TI C library 的設計 重寫 longjmp,並在 ret 指令之前,加進 clrc INTM 以使已在執行的工作與新生 的工作均可正常執行。

2.修改中斷程式的處理原則,與 resched() 及 resume() 對中斷程式的處理

增加 int_flag 旗標,以判斷目前 DSP CPU core 是否在中斷程式內。如果在中斷 程式內使用 resume(),這通常發生在回呼函式內,resume( )並不會立即呼叫 resched(),而是把 sched_flag 設成 SCHED_DELAYED,於是中斷程式在離開前, 必須先檢查是有否延遲排程的旗標,已決定離開中斷前是否須要重新排程。

3.增加週期性工作的支援

0.7.4 中增加了 at 模組,模擬UNIX下的 at daemon 與 at 指令,用於定時執行 指定的程式。atd() 設計成泛用型計時器的回呼函式的形式,因此可在系統初設時 指定給某一個計時器進行回呼,或者是在 realtime clock 中斷內直接叫用。而 週期性工作的指定可在初設時設定 ATTAB---at table,或是執行期使用 at() 函式,設定新的週期性工作。

4.改良並修正 pipe/msgq 的設計

IPC 的機制除原本的 pipe 外,再利用 pipe 形成每一個工作的 message queue, 訊息佇列,同時修正 pipe 中資料維持的錯誤。

5.加入 priList(prioirty list) 模組,並重新設計 sleep/sem 模組

原本的 sleep 模組與 sem (semaphore) 模組,其最主要的資料結構---串列,是 各自維護的,並沒有共用程式碼,在 0.7.4 中統一利用 priList 模組去實作 differential list (sleep 模組) 與一般性的 priority list (sem 模組),使 得兩個模組在資料結構的維護上,可保持一致性。

以上三部份的程式碼的驗證其實是在我的 Jupiter 工作站上進行的,由於三個 模組本身而言與硬體的相關性不高,是可以與 DSP 分開來發展的,而當時正好 240EVM 板不在手邊,新的 243 板又尚未完成的情形下,便利用安裝 LinuxPPC 的 Jupiter 工作站進行程式碼的驗證及設計,並利用 Linux 上的除錯工具 xxgdb 進行除錯,雖然並不像 Trubo debugger 方便,但比起 Code Composer 再加 DSP 板才能進行測試,還是方便許多,至少我可以在螢幕上將資料結構的內容整個 dump 出來,而 DSP 板只有幾個 LED 燈而已。

6.加入 static SECS-I 的支援

原本的 SECS 通訊協定的記憶體使用是使用動態配置的,為考慮動態配置,會在 執行期花費較多的指令週期,於是更改為靜態的記憶體配置,及配合 IPC 機制 進行工作與 secs daemon 的資料交換。

7.增加對 x243 的支援

Taunix version 0.7.4 版整個均是在 x243 的板子上進行測試 (thanks to PIGOIL),雖然 TI 是宣稱 243 與240 完全相容,但在設計核心的角度上來看, 細微的不同卻非常容易導致導致 DSP 發生 NMI 並進一步 reset。儘管,x243 與 x240 的差異性大部分由核心及各週邊驅動程式所覆蓋,但是幾個地方還是要注意

(1) x243 沒有可調整的鎖相迴路設計

x240 尚可使用 PLLLOCK 巨集調整 DSP 內的 CPU 及系統時脈,但是 x243 卻是
固定的,x243 上對應 x240 為 ckcr0 及 ckcr1 的地方,是不能存取的,否則
將會發生 NMI。故 x243 的內部時脈就只能固定在 20 MHz。

(2) x243 沒有即時時鐘中斷

x243 有看門狗,但卻沒有即時時鐘可用來於固定時間中斷 DSP CPU core,並
進行看門狗重設的中斷源,也就是說,如果想要有即時時鐘的服務,得另外想
辦法。


Taunix for x243 的設計是利用一個外部中斷: XINT1 當作即時時鐘中斷,而
中斷的訊號源,則必須由外部額外拉進來,比方說,我在設計階段是利用第二個
計時器的 compare output 產生一個週期性的 pulse,並用跳線拉到 x243 上的
XINT1 接腳。當然,也可以增加額外的電路以產生一個週期脈衝,來模擬即時
時鐘,不過這些都應該是在你的目標應用上需要即時時鐘的服務才需要的。

如果沒有即時時鐘中斷,會受到影響而無法運作的模組有: sleep, static
SECS-I, sys_time 結構體。如果在實際的運用上用不到這些模組的話,沒有
即時時鐘中斷是沒有關係的。

當然,你可以選擇使用泛用型計時器,但是...

(3) x243 只有兩個泛用型計時器,x240 有三個

因此,x240 的程式如果有使用到第三個計時器的話,是不能直接 port 到 x243
上的。

(4) x243 的 ADC 外部的 channel 有八組,x240 有十六組

同樣的,如果原本的 240 程式會用到相當多的 ADC channel,也是不能直接
port 到 x243 上的。

(5) x243 的 capture unit 有三個,x240 有四個

也是要注意的地方。

其他大致上 Taunix for x240 與 x243 是相同的。還有一點,x243 上是內建 CAN Bus controller,Taunix 0.7.4 for x243 目前尚未完成 CAN Bus driver,建龍, 加油,靠你了!

除了核心程式本身之外,Taunix 的前端程式產生器 TaunixFE,目前仍是搭配 version 0.7.3 for x240 使用,用於 version 0.7.4 for x240 應該是可以的, 但由於 Taunix for x243 在許多地方有所改變,因此目前版本的 TaunixFE 並不能 直接使用在 Taunix for x243。

在文件方面,將逐漸進行一項 TDP:Taunix Documentation Project。雖然 Taunix for x240 已有部分的文件,但由於這次的改版,部分的資料可能會不正確,而使得 有必要重新檢視以前的文件,並進行有計劃的分類與整理。

還有什麼有待改進的呢?

目前最重要的就是文件的建立,就算前端程式產生器沒有完成,但至少有文件可看, 有範例可參考,程式還寫得下去,所以文件是第一要務。

第二個就是確定所有驅動程式的介面,也就是所謂的 switch table 介面,因為介面 固定了,文件也自然就能固定。同時確立介面後,規劃已久的 TVFS (Taunix Virtual File System) 模組才能架得上去,以支援未來版本的 Taunix 核心與工作可分開編譯 及分別上載至 DSP 的目的,甚至可動態的載入週邊驅動程式,而不必像現在,必須 所有的程式全部編譯成一個 .out 檔後上載至 DSP 執行。

此外,第三個就是 TaunixFE 的開發,穩定的核心加上方便使用的程式開發工具, 才能大幅縮短 TTM (Time To Market)。

最後,感謝 PIGOIL 提供 x243 的原型機版,並實際運用 Taunix 在其電動機車的 計劃上。

Max Yin in Tau Workshop E-mail: [email protected] [email protected]

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].