天天看點

TI 實時作業系統SYS/BIOS使用總結

SYS/BIOS 是一個可擴充的實時的作業系統。具有非常快速的響應時間(在中斷和任務切換時達到較短的延遲),響應時間的确定性,強壯的搶占系統,優化的記憶體配置設定和堆棧管理(盡量少的消耗和碎片)。能夠實作系統的子產品化并可裁剪。

最大的特點就是:實時。

XDCtools 是SYS/BIOS引用的一種實時的軟體元件技術(RTSC),它包括一些有用的工具,标準的API函數,靜态配置檔案和打包(packaging)操作。XDC最主要的亮點在于它标準化了傳遞過程,并簡化了在應用程式中引用目标平台下其他包的過程。

         在工程建立的時候需要先建立一個基于RTST的平台,用來配置設定和管理記憶體和緩存,它可以自動的生成對應的cmd檔案。建立的過程如下:(基于TI DM6437平台)

TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結

線程是一組在存儲在存儲器中的代碼,一旦寄存器被正确初始化,CPU就會執行這些代碼。線程可以是任何類型的,SYS/BIOS定義了四種線程類型:

硬體中斷(HWI),軟體中斷(SWI),任務(TASK),空閑(Idle)。

硬體中斷:時間要求最為嚴格,要就實時響應的任務:一般為外設和内部的實時時間和定時器子產品(定時器子產品是通過硬體中斷實作的,使用硬體的定時器)。

軟體中斷:對時間要求較為低的一種中斷線程。(時鐘子產品是基于軟體中斷子產品的定時器子產品)

任務:CPU執行的主要線程,和軟體中斷的差別,可以被阻塞(可以等待)

空閑:優先級最低

各線程有隐式和顯示的優先級:隐式優先級是由線程的類型決定的,顯示優先級由軟體的程式設計者決定,并且允許搶占的:就是高優先級的線程能夠搶線程占低優先級的線程,優先執行,這種高于優先級的排程管理機制保證了最高優先級的線程能在第一時間被執行。下面是線程的搶占的示意圖:

TI 實時作業系統SYS/BIOS使用總結

CCS提供了兩種元件的配置的方法,一種是圖形化的配置方法,使用者可以點選添加相應的子產品:

TI 實時作業系統SYS/BIOS使用總結
TI 實時作業系統SYS/BIOS使用總結

另外一種方式,是通過手動編輯.cfg檔案,該檔案采用Javascript語言編寫,同樣也可以配置元件。

SYS/BIOS線上程建立和配置方面,提供兩種方式,一種是靜态的建立,通過XDCtools建立和配置。一種是動态的建立,就是在程式中建立,下面就以HWI為例程,分别列出;兩種建立方式:

靜态建立:可以通過圖形化的界面進行配置,也可以通過JavaScript腳本語言手動編寫.cfg檔案進行配置,下面寫出手動編寫.cfg檔案配置Hwi:

var hwi0Params =new Hwi.Params();

hwi0Params.instance.name= "Uart_Handle";

hwi0Params.eventId= 85;

Program.global.Uart_Handle= Hwi.create(8, "&Int_Uart1ISR", hwi0Params);

動态配置:在程式中進行配置

需要引用的頭檔案

#include<ti/sysybios/hal/Hwi.h>

Hwi_HandleUart_Handle;

Hwi_Paramshwi0Params;

Error_Block eb;

Error_init(&eb);

Hwi_Params_init(&hwi0Params);

hwi0Params.eventId =  85;

Uart_Handle =Hwi_craete(8, "&Int_Uart1ISR", & hwi0Params, &eb) ;

SYS/BIOS任務線程有0-31個優先級(預設0-15,優先級0被空閑線程使用,任務最低優先級為1),但是在記憶體允許的情況下可以不限制的建立任務數量。SYS/BIOS有獨立的記憶體堆棧,可以為等待某一事件的發生而被挂起,任務會被其他更高優先級的線程打斷。數量和狀态可以在程式執行時動态的更改,優先級也可以動态的修改。

空閑線程是一種非實時性的線程,并且僅當沒有任何其它線程(HWI/SWI/TASK運作時才會運作),所有空閑線程運作在同一個線程,而且可以被其它線程随時搶占,預設使用任務堆棧,如果任務線程被禁用使用系統堆棧,一個接一個運作,每一個空閑線程函數都會從開始執行到結束。所有函數執行完後再從第一個函數執行,周而複始。

TI 實時作業系統SYS/BIOS使用總結

信号量通常用于協調一些處于競争關系的任務之間對共享資源的通路。可以使任務處于挂起狀态,用來等待某一個特定的事件,隻有當這個事件釋出的時候才能繼續執行任務,這是通過信号量來實作的,而信号量操作主要有兩種操作:一個是post,一個是pend,而這兩種操作就是用來改變信号量的計數值,而在SYS/BIOS中的信号量有兩種計數的模式,一種是以2進制的模式計數,一種是計數的模式進行計數。信号量的值為0的時候任務處于挂起狀态,信号量為1的時候任務恢複繼續執行。下面是兩種計數模式的差別:

<col>

操作(假定計數初值為0)

二進制

計數

Semaphore_post()sem);

1

Semaphore_pend()sem);

2

任務狀态

挂起

&gt;1

恢複

信号量的建立:同樣是兩種方式,靜态建立和動态建立,下面寫出動态建立的例程:

    Error_Block eb;

    Error_init(&amp;eb);

   Semaphore_Params_init(&amp;semParams);

    semParams.mode =Semaphore_Mode_BINARY;

    semParams.event = evt;

    semParams.eventId =Event_Id_00;

    sem = Semaphore_create(1,&amp;semParams, &amp;eb);

    if (sem == NULL)

    {

             System_abort("Semaphore create failed");

    }

    else

             System_printf("Semaphore create is OK\n");

}

郵箱SYS/BIOS系統用來在任務間進行buffer傳輸的,在郵箱建立的時候配置傳輸buffer的大小,Mailbox_post()函數執行完成代表,郵箱buffer已經傳輸到緩沖區,當執行Mailbox_pend()時,就從緩沖區中獲得資料。

郵箱的建立:Mailbox_HandleMailbox_create(SizeT   bufsize,

UInt   numBufs,

Mailbox_Params   *params,

Error_Block   *eb)

Void Mailbox_delete(Mailbox_Handle*handle);

Mailbox_pend()是用來從郵箱中讀取Bufferde,如果郵箱中沒有Buffer就等待timeout 的時間;

Bool Mailbox_pend(Mailbox_Handle handle,

Ptr buf,

UInt timeout);

Mailbox_post()是用來存入Buffer到郵箱,如果郵箱已滿,則等待timeout時間;

Bool Mailbox_post(Mailbox_Handle handle,

事件同樣提供了一種線程間通信和同步的方法,它和信号量有相同的地方,不同的地方是,事件允許你指定多個任務等待的條件。

像信号量一樣,事件的挂起和釋出也是通過Event_pend(),Event_post()來實作的,如果是一個事件的挂起和釋出,那麼它和信号量是一樣的,一個事件子產品的建立,可以管理32個事件,通過事件ID來管理,而每一個事件都相當與一個信号量。

Event_pend()函數的參數有一個"andMask"和一個"orMask"。andMask對應的是需要所有的事件都釋出才能解除任務的挂起狀态,orMask是任何一個事件的釋出都可以解除任務的挂起狀态。

同樣Event_pend()也有一個等待時間的參數,功能和信号量是一樣的。

下面是一個建立事件的例程:

Event_HandlemyEvent;

/* Defaultinstance configuration params */

myEvent =Event_create(NULL, &amp;eb);

if (myEvent ==NULL) {

System_abort("Eventcreate failed");

事件的挂起:

UIntEvent_pend(Event_Handle event,

UInt andMask,

UInt orMask,

事件的釋出:

VoidEvent_post(Event_Handle event,

UInt eventIds);

1:信号量和郵箱可以編入事件

可以将信号量和郵箱編入一個事件,在信号量和郵箱建立的時候,寫入事件的ID,當信号量或者郵箱釋出的時候,就等于對應事件ID的事件的釋出。

2:任務堆棧的配置:

每個任務可以配置獨立的堆棧的大小,在任務建立的時候配置。堆棧太小,會導緻任務建立失敗。

3:I-RTOSKernel RTSC 和  XDCtools的關系

TI-RTOS Kernel就是指TI公司開發的SYS/BIOS實時作業系統。

RTSC是實時的軟體元件平台,基于這個RTSC來建立SYS/BIOS

XDCtools是依賴于RTSC的平台配置的工具

TI-RTOS Kernel是系統,RTSC是平台,XDCtools是工具。

4:cmd更改問題:

.cmd檔案隻能通過RTSC平台的配置自動生成,不能自己手動的更改,自己通過編輯修改的.cmd在編譯又會從新變回去。

5:SYS/BIOS下自定義段的方法:

手動編輯.cfg檔案:Program.sectMap["L3_DATA"]= "DDR";

作者:柒月