MDK關於microlib庫問題筆記


關於MicroLIB的介紹

microlib 是缺省 C 庫的備選庫。它旨在與需要裝入到極少量內存中的深層嵌入式應用程序配合使用,這些應用程序不在操作系統中運行。

microlib 進行了高度優化以使代碼變得很小。它的功能比缺省 C 庫少,並且根本不具備某些 ISO C 特性。某些庫函數的運行速度也比較慢,例如,memcpy()。

 

與缺省 C 庫之間的差異

microlib 與缺省 C 庫之間的主要差異是:

microlib 不符合 ISO C 庫標准。 不支持某些 ISO 特性,並且其他特性具有的功能也較少。

microlib 不符合 IEEE 754 二進制浮點算法標准。

microlib 進行了高度優化以使代碼變得很小。

無法對區域設置進行配置。 缺省 C 區域設置是唯一可用的區域設置。

不能將 main() 聲明為使用參數,並且不能返回內容。

不支持 stdio,但未緩沖的 stdin、stdout 和 stderr 除外。

microlib 對 C99 函數提供有限的支持。

microlib 不支持操作系統函數。

microlib 不支持與位置無關的代碼。

microlib 不提供互斥鎖來防止非線程安全的代碼。

microlib 不支持寬字符或多字節字符串。

與 stdlib 不同,microlib 不支持可選擇的單或雙區內存模型。 microlib 只提供雙區內存模型,即單獨的堆棧和堆區。

可以合理地將 microlib 與 --fpmode=std 或 --fpmode=fast 配合使用。

microlib 中的函數負責:

創建一個可在其中執行 C 程序的環境。 這包括:

創建一個堆棧

創建一個堆(如果需要)

初始化程序所用的庫的部分組成內容。

調用 main() 以開始執行程序。

要使用 microlib 構建程序,必須使用命令行選項 ??library_type=microlib。根據需要,編譯器、匯編程序或鏈接器可使用此選項處理不同的文件。 將此選項與鏈接器配合使用時,將覆蓋所有其他選項。

 

官網解釋

microlib中是用C寫的時候相比,包括ARM編譯器工具鏈的標准C庫的基於ARM的嵌入式應用提供了高度優化的庫,microlib中提供所需的許多嵌入式系統顯著代碼大小的優點。

 

 

microlib中和標准C庫之間的主要區別是: 

 

microlib中是專為深度嵌入式應用。 

microlib中被優化使用比使用ARM標准庫更少的代碼和數據存儲器。 

microlib中已經設計沒有操作系統的工作,但是這並不妨礙它被與任何操作系統或RTOS如Keil RTX一起使用。 

microlib中不包含任何文件I/O或寬字符支持。 

由於microlib中進行了優化,以盡量減少代碼大小,一些功能將會比ARM編譯工具提供了標准C庫函數更慢執行。 

microlib中雙方和ARM標准庫都包含在Keil MDK-ARM。

 

以上就是對microlib的一些介紹,microlib庫突出特點就是小,用時間換空間,從圖中可以看到microlib庫比標准庫減少了一半的代碼占用。

 

 

是否選用microlib庫對項目有什么影響呢?

之前在用原子的例程時,可以不選用microlib,通過添加以下代碼:

//加入以下代碼,支持printf函數,而不需要選擇use MicroLIB  

#if 1

#pragma import(__use_no_semihosting)            

//標准庫需要的支持函數                

struct __FILE

{

    int handle;

};

FILE __stdout;      

//定義_sys_exit()以避免使用半主機模式   

void _sys_exit(int x)

{

    x = x;

}

//重定義fputc函數

int fputc(int ch, FILE *f)

{  

    while((USART1->SR&0X40)==0);//循環發送,直到發送完畢  

    USART1->DR = (u8) ch;     

    return ch;

}

#endif

但是在最新的項目中,同樣采樣這種方法卻提示錯誤,錯誤內容如下:

Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and bsp_debug_usart.o).

提示在串口文件中存在重定義的情況,重定義的內容就是我之前添加的那段代碼?如果我不勾選microlib,調試的過程中會出現莫名的死機,並無法直接跳轉到主程序,嘗試尋找從那里引入的這個問題,具體過程如下:

  1. 移植UCOSIII之后的程序,添加以上修改后不選中microlib庫沒有出現編譯錯誤提示;
  2. 移植UCOSIII+LWIP之后的程序,添加以上修改后不選中microlib庫出現編譯錯誤提示;通過查找是LWIP調用printf函數引起。經過仔細查找發現屏蔽這里的時候不再報錯;

#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \

  printf("Assertion \"%s\" failed at line %d in %s\n", message, \

__LINE__, __FILE__); fflush(NULL);handler;} } while(0)

這里可能的原因是由於調用了fflush(NULL);但是雖然暫時把這個函數去掉,但是如果不勾選microlib庫,系統仿真就無法運行,一直出現硬件錯誤。

        3. 可以看出雖然暫時解決了不勾選microlib庫所引起的編譯錯誤,但是無法解決調試出現的硬件錯誤問題,應該還是關於microlib庫那里有調用引起的,可能是mallco函數,暫時猜測是這樣的。

這里並沒有解決microlib庫未勾選時引起的硬件錯誤問題,在后面調試過程中可以對這個問題進行分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM