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

此文共連載分析三個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

lib_mem_a.asm

這是一個彙編文件,文件中用匯編語言實現了一個函數 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 官方書寫的,不須要咱們作任何修改,只要理解這個函數的做用,作到會使用,出問題能夠解決便可。操作系統

lib_def.h

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

lib_mem.c  、lib_mem.h

這裏面定義和實現了一些有關內存操做函數,注意的是這裏面也有一個函數 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 層進行配置。

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);
相關文章
相關標籤/搜索