基於DSP/BIOS和NDK的嵌入式網路作業系統設計方案

zzsfqiuyigui發表於2011-10-27

2008.10.21

隨著嵌入式應用的普及,嵌入式作業系統的問題日益引人關注。由於DSP代表了一類重要的嵌入式應用,以DSP為核心的嵌入式作業系統也正在成為人們研究的熱點。為了對自己的DSP產品提供軟體支援,TI公司發行了DSP/BIOS程式包。但是關於DSP/BIOS的定位卻存在分歧。一方面,在TI的正式資料和文件中均迴避把DSP/BIOS稱為實時作業系統,另一方面,為了滿足在DSP應用中對作業系統環境的迫切需求,TI及其產品的使用者均將DSP/BIOS視為一個“簡單的”實時作業系統。

  事實上DSP/BIOS並不是真正的實時作業系統,而只是用於幫助程式設計師開發實時作業系統的軟體包。而且,它不包含網路功能。所以,在用DSP/BIOS設計網路作業系統時,需要從兩方面入手:一,利用DSP/BIOS提供的資源進行裁減和整合;二,補充DSP/BIOS中未能提供的網路功能。

  1 DSP/BIOS的構成

  一般認為DSP/BIOS由三部分內容組成,即
  1)DSP/BIOS實時庫和API
  2)DSP/BIOS配置工具
  3)DSP/BIOS外掛

  其中配置工具用於提供視覺化的程式設計環境,而外掛用於支援除錯過程。所以,實時庫和API才是DSP/BIOS的核心。DSP/BIOS實時庫可以為最終生成的嵌入式實時作業系統提供執行時的基本服務,包括執行緒排程,中斷管理等功能。DSP/BIOS API由十幾個模組組成,如DEV裝置驅動介面,MEM存貯段管理器等。程式設計師通過呼叫API來使用DSP/BIOS。

  DSP/BIOS API由十幾個模組組成,每個模組又由相關的資料結構和函式組成。在有關DSP/BIOS的資料中混雜使用了模組(module)、物件(object)等術語,不過,DSP/BIOS與物件導向技術並沒有直接的關聯。所謂模組,是指一個邏輯上的概念,表示一組資料結構和以此為基礎的一組函式。物件則是特指按模組中的資料結構所建立的變數(與C++中的類與物件不是同一個概念)。

  如果程式設計師定義了某個物件,他將可以使用模組中的相應函式,並用這些函式程式碼來組成自己的嵌入式作業系統。

  在程式設計師開發自己的嵌入式作業系統時,一般不會同時需要DSP/BIOS的全部模組。所以,DSP/BIOS中的內容是按需使用的。但是,開發平臺會自動選擇部分核心模組,併為它們建立物件。例如,開發平臺會自動選擇工作管理員( Multi-Task Manager)模組,以支援空閒處理功能:TSK_idle (),即:
  TSK_Obj TSK_idle (iFXN, iARG0, iARG1, iARG2, iARG3, iARG4, iARG5, iARG6, iARG7, iAUTOSTK, iMANSTK, iSTKSZ, iSTKSEG, iPRI, iENV, iEXITFLAG, iUSETSKNAME, iSTATREG)

  由DSP/BIOS實時庫生成的程式碼和程式設計師新編制的程式碼連結到一起就構成了DSP的嵌入式應用系統。這些程式碼之間的執行關係由boot.c檔案規定,該檔案的預設執行順序為:
  一,初始化DSP:由復位中斷向量將程式引導到c_int00,開始初始化暫存器等硬體資源;二,初始化DSP/BIOS模組:通過呼叫BIOS_init完成,BIOS_init由開發平臺中的配置工具自動生成;三,初始化使用者應用環境:通過呼叫main例程實現;四,啟動DSP/BIOS:由BIOS_start啟動由DSP/BIOS實時庫中的相關例程,BIOS_start也是由開發平臺中的配置工具自動生成的。但是,通過調整boot.c可以改變系統的執行順序。

  2 NDK開發環境

  為了加速其高檔DSP的網路化程式,TI結合其C6000系列推出了TCP/IP NDK (Network Developer’s Kit)。該開發包採用緊湊的設計方法,實現了用較少的資源耗費支援TCP/IP。從實用效果看,NDK僅用200-250K程式空間和95K資料空間即可支援常規的TCP/IP服務,包括應用層的telnet,DHCP,HTTP等。所以,NDK很適合目前嵌入式系統的硬體環境,是實現DSP上網的重要支撐工具。

  與常規的TCP/IP應用環境不同,為了最大限度地減少資源消耗,TI為其NDK採用了許多特殊技巧,例如:低層驅動程式與協議棧之間通過指標傳遞資料,不對包進行復制考貝。因為在嵌入式系統中,低層驅動程式和應用程式一樣均需要開發者自行設計。也就是說,在以NDK為基礎的開發中,開發人員需要分別設計低層驅動程式和應用程式,這兩部分程式通過NDK提供的TCP/IP包發生關聯。程式的執行過程是:應用程式呼叫TCP/IP包,TCP/IP包再呼叫低層驅動程式。

  在NDK中對低層驅動程式與TCP/IP包之間的介面作了明確規室,換言之低層驅動程式必須符合介面約定。以PPP為例,其要點是:
  1)由低層驅動程式呼叫TCP/IP包函式建立PPP連線例項,在連線例項中,以回撥函式的形式將用於處理資料傳送的函式名傳遞給TCP/IP包;
  2)當TCP/IP包有資料需要傳送時,直接呼叫PPP建立時由低層驅動程式傳遞來的函式名;
  3)當低層驅動程式接收到網路資料時,呼叫TCP/IP包函式傳送到IP層。

  低層驅動程式直接面向硬體,為了適應硬體的多樣性,在NDK中也提供了多種實現低層連線的方法,也為使用者設計符合自己硬體特點的低層連線提供了介面規範。

  3 利用NDK增加網路功能

  如何在嵌入式系統中增添DSP/BIOS實時庫中沒有的功能是設計基於DSP/BIOS的實時作業系統中最主要的問題之一。解決這個問題一般需要兩個步驟:一,程式設計師定製開發程式碼;二,與系統中的其它功能繫結在一起。現在,我們介紹如何利用NDK為其增加網路功能。

  與常規的TCP/IP開發不同,在開發嵌入式應用時,開發人員必須對網路環境和應用需求作更細緻的設定。在以NDK為基礎的開發中,程式設計師需要完成的主要工作有:
  1) 通過DSP/BIOS.cdb或DSP/BIOS API呼叫NETCTRL任務執行緒。該執行緒不是直正的網路任務執行緒,它以初始化執行緒的形式出現,起TCP/IP協議棧的事件排程執行緒的作用。
  2) 呼叫初始化函式NC_SystemOpen()。該函式完成對協議棧其及所需要的記憶體的初始化。
  3)建立系統配置。該系統配置用於對協議棧的控制和管理,可用CfgNew()和CfgLoad()等函式操作。
  4)呼叫NETCTRL函式NC_NewStart()啟動網路。NC_NewStart()函式的引數中包含三個回撥函式指標,分別處理“Start”,“Stop”和“IP Address Event”事件,其中“Start”和“Stop”只執行一次,“IP Address Event”則響應每次IP地址的變化。

  由於NDK已經提供了完整的TCP/IP庫函式,程式設計師開發的程式碼只須按需要進行配置即可。下面是將嵌入式裝置配置為車間區域網節點的核心程式碼:

char *LocalIPAddr ="128.247.117.12";
char *LocalIPMask ="255.255.254.0";
char *GatewayIP ="128.247.116.1";
char *DomainName ="demo.net";
int NetworkConfig()
{
  int rc;
  CI_IPNET NA;
  CI_ROUTE RT;
  HANDLE hCfg;
  NC_SystemOpen();
// Create a new configuration TCP/IP Stack Initialization and Configuration
  hCfg = CfgNew();
  if( !hCfg )
  { goto main_exit; }
// Manually configure our local IP address
  bzero( &NA, sizeof(NA) );
  NA.IPAddr = inet_addr(LocalIPAddr);
  NA.IPMask = inet_addr(LocalIPMask);
  strcpy( NA.Domain, DomainName );
  NA.NetType = 0;
// Add the address to interface 1
  
CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
  sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
// Add the default gateway.
  bzero( &RT, sizeof(RT) );
  RT.IPDestAddr = 0;
  RT.IPDestMask = 0;
  RT.IPGateAddr = inet_addr(GatewayIP);
// Add the route
  CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
  sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
  do
  {
  rc = NC_NetStart( hCfg, NetworkStart, NetworkStop, NetworkIPAddr );
  } while( rc > 0 );
// Delete Configuration
  CfgFree( hCfg );
// Close the OS
  main_exit:
  NC_SystemClose();
  return(0);
}

  為了讓NetworkConfig與系統中的其它功能繫結在一起,可以通過開發平臺建立一個TSK工作管理員物件,並將其定義為一個獨立的執行緒任務。這樣,TCPStackStart就加入到嵌入式系統中了。

2008.10.27

The basic process of stack initialization is as follows:

l         用初始化函式對作業系統環境進行初始化。NC_SystemOpen()

l         建立一個新配置:CfgNew()

l         通過配置函式API呼叫來構建新配置或載入一個原來存在的配置CfgLoad()

l         啟動帶配置的堆疊NC_NetStart( hCfg, pfnStart, pfnStop, pfnNetIP )

l         一些主要的初始化後NC_NetStart()產生一個新的執行緒(呼叫使用者的回撥函式),產生網路要求的任務執行緒。

l         正常工作下,網路不會關閉(直到呼叫NC_NetStop(),當在某點呼叫NC_NetStop() 時,原先NC_NetStart() thread 呼叫使用者回撥函式來停止,

l         運用程式可以在再次呼叫NC_NetStart()立即重新啟動,而不需要過載一個新的配置。

l         當NC_NetStart()返回 and the session is over 時,呼叫CfgFree() 釋放配置控制程式碼。

l         所有資源被釋放後,呼叫NC_SystemClose()來完成系統關閉。

2009.3.9

1

int CfgAddEntry(HANDLE hCfg, uint Tag, uint Item, uint Mode, uint Size, UINT8 *pData,

HANDLE *phCfgEntry);

 

功能:為配置建立一個新的配置入口。

引數:

hCfg- Handle to configuration配置控制程式碼

Tag -Tag value of new entry 新入口的標籤值

Item -Item value of new entry 新入口的專案值

Mode- Mode flags for how to add entry 如何增加入口的模式標誌

Size- Size of entry data pointed to by pData 入口資料大小

pData -Pointer to entry data  入口資料指標

phCfgEntry- Pointer to where to write handle of new configuration entry

返回值:(四種情況)

1-Returns 1 on success with successful processing by a service callback function。

0-Returns 0 on success with no processing performed by a service callback function

CFGERROR_SERVICE<返回值<0 的情況有三種如下:

       CFGERROR_BADHANDLE   Invalid hCfg handle

CFGERROR_BADPARAM    Invalid function parameter

CFGERROR_RESOURCES   Memory allocation error while adding entry

小於CFGERROR_SERVICE

備註:To modify the default behavior, one or more of the following flags can be set:

CFG_ADDMODE_UNIQUE :Replace all previous entry instances with this single entry.

CFG_ADDMODE_DUPLICATE :Allow full duplicate entry (duplicate Tag, Item, and entry data). Requests to add duplicates are normally ignored.

CFG_ADDMODE_NOSAVE :Do not include this entry in the linear buffer in CfgSave().

2、

void CfgFree(HANDLE hCfg);

引數:hCfg Handle to configuration

描述Destroys a configuration. Unloads and frees all configuration entries and frees theconfiguration handle. After this call, the configuration handlehCfg is invalid.

3、

int CfgLoad(HANDLE hCfg, int Size, UINT8 *pData);

功能:把一線性儲存塊轉化為一個配置。(通過配置入口來實現)

引數:

  hCfg -Handle to configuration

Size -Size of memory block to load

pData -Pointer to memory block to load

返回值:Returns the number of bytes loaded, or less than 0 on an error. CFGERROR_BADHANDLE :InvalidhCfg handle

CFGERROR_BADPARAM :Invalid function parameter

4、

HANDLE CfgNew();

功能:建立一個新配置。這個配置可以被配置函式作為引數,

返回值:Returns handle to a new configuration or NULL on memory allocation error.

5、

相關文章