此文共連載分析三個uCOS-Ⅱ的三個源碼文件夾:uC-CPU 、uC-LIB 、uCOS-Ⅱweb
uC-LIB文件夾目錄:Prots / lib_mem_a.asm lib_def.h lib_mem.c lib_mem.h lib_str.c lib_str.hide
這是一個彙編文件,文件中用匯編語言實現了一個函數 Mem_Copy() ,這個函數是用來進行內存拷貝的,之因此用匯編實現這個函數,是由於內存操做在 RTOS 操做系統中是很重要的,用匯編來實現能夠效率更高。函數
void Mem_Copy (void *pdest, ; ==> R0
void *psrc, ; ==> R1
CPU_SIZE_T size) ; ==> R2
爲何使用匯編語言來實現:使用匯編語言的狀況通常只有兩種,一種是使用匯編效率更高,一種是 C語言 沒法實現(好比單片機中的異常向量表)。ui
EXPORT Mem_Copy ;ARM彙編中的函數聲明
EXPORT 是 ARM 彙編指令的一個關鍵字,用來從ARM彙編文件中導出一個符號,這樣這個符號就能夠在其餘文件中引用了,相似 C語言 的 extern 關鍵字。能夠實現函數在彙編文件中定義,在 C語言 文件中調用。spa
總結:這個文件應該是 ARM 官方書寫的,不須要咱們作任何修改,只要理解這個函數的做用,作到會使用,出問題能夠解決便可。操作系統
這個文件中定義了許多宏,大體分爲兩類:一類是對一些常數的定義(好比 DISABLE 是 0 ,ENABLE 是 1 等等);一類是對可能用到的和環境有關的數值的定義(好比一年有多少天,一小時有多少分鐘等等)。設計
這裏面定義和實現了一些有關內存操做函數,注意的是這裏面也有一個函數 Mem_Copy()ip
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-Ⅱ 內核中的這些項目加上或去除。rem
注意:在使用宏定義配置 uCOS-Ⅱ 內核時須要在 APP 層進行配置。
這裏面實現了許多 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);