1. 程式人生 > >uCOS-Ⅱ源碼分析之uC-LIB文件夾

uCOS-Ⅱ源碼分析之uC-LIB文件夾

uCOS-Ⅱ

此文共連載分析三個uCOS-Ⅱ的三個源碼文件夾:uC-CPU 、uC-LIB 、uCOS-Ⅱ

uC-LIB文件夾目錄:Prots / lib_mem_a.asm lib_def.h lib_mem.c lib_mem.h lib_str.c lib_str.h

lib_mem_a.asm

這是一個匯編文件,文件中用匯編語言實現了一個函數 Mem_Copy() ,這個函數是用來進行內存拷貝的,之所以用匯編實現這個函數,是因為內存操作在 RTOS 操作系統中是很重要的,用匯編來實現可以效率更高。


void Mem_Copy (void *pdest, ; ==> R0
void *psrc, ; ==> R1
CPU_SIZE_T size) ; ==> R2

為什麽使用匯編語言來實現:使用匯編語言的情況一般只有兩種,一種是使用匯編效率更高,一種是 C語言 無法實現(比如單片機中的異常向量表)。

EXPORT  Mem_Copy  ;ARM匯編中的函數聲明

EXPORT 是 ARM 匯編指令的一個關鍵字,用來從ARM匯編文件中導出一個符號,這樣這個符號就可以在其他文件中引用了,類似 C語言 的 extern 關鍵字。

總結:這個文件應該是 ARM 官方書寫的,不需要我們做任何修改,只要理解這個函數的作用,做到會使用,出問題可以解決即可。

lib_def.h

這個文件中定義了許多宏,大致分為兩類:一類是對一些常數的定義(比如 DISABLE 是 0 ,ENABLE 是 1 等等);一類是對可能用到的和環境有關的數值的定義(比如一年有多少天,一小時有多少分鐘等等)。

lib_mem.c 、lib_mem.h

這裏面定義和實現了一些有關內存操作函數,註意的是這裏面也有一個函數 Mem_Copy()

void  Mem_Copy (void        *pdest,
void *psrc,
CPU_SIZE_T size) // 在 lib_mem.c 文件中用 C語言 實現了一個內存copy函數

可以看出函數原型和 lib_mem_a.asm 文件中匯編語言的 Mem_Copy() 函數一模一樣,實際上實現的效果也一模一樣,只不過是一個用 C語言,一個用匯編語言。不過 C語言 實現的這個函數用 if define 的形式做了限制,所以不會和匯編語言的同一個函數發生重名沖突。

還有一種配置一些模塊開關的宏(配置宏),類似 LIB_MEM_CFG_ARG_CHK_EXT_EN 這樣的宏;這種宏的作用是用來配置 uCOS-Ⅱ 系統中的可選項目,uCOS-Ⅱ本身設計時設計了許多屬性,可以在這些宏中進行使能或禁止,這樣在編譯(預處理)的時候編譯器(預處理器)就可以幫我們把 uCOS-Ⅱ 內核中的這些項目加上或去除。

註意:在使用宏定義配置 uCOS-Ⅱ 內核時需要在 APP 層進行配置。

lib_str.c 、lib_str.h

這裏面實現了許多 C標準庫 中對字符串操作的函數,為了可以在多個平臺上進行使用,不依賴於 C標準庫,所以自己實現了有關字符串操作的函數:

CPU_SIZE_T   Str_Len      (CPU_CHAR     *pstr);  //測量字符串長度

CPU_CHAR *Str_Copy (CPU_CHAR *pdest, //復制字符串
CPU_CHAR *psrc);

CPU_CHAR *Str_Copy_N (CPU_CHAR *pdest, //復制 len_max 數量的字符
CPU_CHAR *psrc,
CPU_SIZE_T len_max);

CPU_CHAR *Str_Cat (CPU_CHAR *pdest, //接續字符串
CPU_CHAR *pstr_cat);

CPU_CHAR *Str_Cat_N (CPU_CHAR *pdest, //接續 len_max 數量的字符串
CPU_CHAR *pstr_cat,
CPU_SIZE_T len_max);

CPU_INT16S Str_Cmp (CPU_CHAR *p1_str, //比較字符串大小,返回相應值
CPU_CHAR *p2_str);

CPU_INT16S Str_Cmp_N (CPU_CHAR *p1_str, //比較 len_max 數量的字符串大小,返回相應值
CPU_CHAR *p2_str,
CPU_SIZE_T len_max);

CPU_CHAR *Str_Char (CPU_CHAR *pstr,
CPU_CHAR srch_char);

CPU_CHAR *Str_Char_N (CPU_CHAR *pstr,
CPU_SIZE_T len_max,
CPU_CHAR srch_char);

CPU_CHAR *Str_Char_Last(CPU_CHAR *pstr,
CPU_CHAR srch_char);

CPU_CHAR *Str_Str (CPU_CHAR *pstr,
CPU_CHAR *srch_str);

//這個函數是把一個 uint32 類型的變量轉換成一個對應的字符串
//例: uint32 num = 123456; --------> return "123456"
CPU_CHAR *Str_FmtNbr_32(CPU_FP32 nbr,
CPU_INT08U nbr_dig,
CPU_INT08U nbr_dp,
CPU_BOOLEAN lead_zeros,
CPU_BOOLEAN nul,
CPU_CHAR *pstr_fmt);



uCOS-Ⅱ源碼分析之uC-LIB文件夾