1 概述 1.1 基本概念 C++作為目前使用最廣泛的編程語言之一,支持類、封裝、重載等特性,是在C語言基礎上開發的一種面向對象的編程語言。 1.2 運作機制 STL(Standard Template Library)標準模板庫,是一些“容器”的集合,也是演算法和其他一些組件的集合。其目的是標準化組 ...
1 概述
1.1 基本概念
C++作為目前使用最廣泛的編程語言之一,支持類、封裝、重載等特性,是在C語言基礎上開發的一種面向對象的編程語言。
1.2 運作機制
STL(Standard Template Library)標準模板庫,是一些“容器”的集合,也是演算法和其他一些組件的集合。其目的是標準化組件,使用標準化組件後就可以不用重新開發,直接使用現成的組件。
2 開髮指導
2.1 功能
功能分類 | 介面名 | 描述 |
---|---|---|
使用C++特性的前置條件 | LOS_CppSystemInit | C++構造函數初始化 |
2.2 開發流程
使用C++特性之前,需要調用函數LOS_CppSystemInit,實現C ++ 構造函數初始化。
其中被初始化的構造函數存在init_array這個段中,段區間通過變數__init_array_start__、 __init_array_end__傳遞。
由於在分散載入應用場景下, C++ 初始化中涉及到的相關代碼、數據段載入的時機會有所不同,所以在用戶開啟和不開啟分散載入特性這兩種情況下, C++ 初始化函數LOS_CppSystemInit的調用有所不同。
不開啟分散載入特性
- 如果用戶在分散載入的快速啟動階段需要調用相關C++ 代碼,則用戶需要在該階段調用C++ 代碼之前以BEFORE_SCATTER參數如下調用LOS_CppSystemInit:
LOS_CppSystemInit((unsigned long)&__init_array_start__, (unsigned long)&__init_array_end__,BEFORE_SCATTER);
參數 | 參數說明 |
---|---|
init_array_start | 起始段 |
init_array_end | 結束段 |
BEFORE_SCATTER | 表示用戶是在分散載入快速啟動階段調用的LOS_CppSystemInit |
在分散載入的非快速啟動階段再以AFTER_SCATTER參數如下調用LOS_CppSystemInit:
LOS_CppSystemInit((unsigned long)&__init_array_start__, (unsigned long)&__init_array_end__, AFTER_SCATTER);
參數 | 參數說明 |
---|---|
init_array_start | 起始段 |
init_array_end | 結束段 |
AFTER_SCATTER | 表示用戶是在分散載入非快速啟動階段調用的LOS_CppSystemInit |
- 如果用戶在分散載入的快速啟動階段無須調用相關C++代碼,除了使用以上的方式在快速啟動階段前和非快速啟動階段前分別調用LOS_CppSystemInit外,用戶還可以在分散載入的非快速啟動階段,分別以BEFORE_SCATTER和AFTER_SCATTER參數連續兩次調用LOS_CppSystemInit。
LOS_CppSystemInit((unsigned long)&__init_array_start__, (unsigned long)&__init_array_end__,BEFORE_SCATTER);
LOS_CppSystemInit((unsigned long)&__init_array_start__, (unsigned long)&__init_array_end__,AFTER_SCATTER);
或者以NO_SCATTER為參數調用一次LOS_CppSystemInit:
LOS_CppSystemInit((unsigned long)&__init_array_start__, (unsigned long)&__init_array_end__,NO_SCATTER);
調用C庫函數
在C++中調用C程式的函數,註意在聲明該函數的時候增加如下語句:
extern "C"
3 註意事項
- Huawei LiteOS暫不支持C++異常機制、 RTTI。
- Huawei LiteOS中, C++暫不支持I/O字元流、 I/O文件流等相關操作。
4 編程實例
4.1 實例描述
在代碼初始化中,進行C++ 構造函數初始化,進而讓程式可以使用C++特性。由於此處使用分散載入特性,所以需兩次調用LOS_CppSystemInit
4.2 編程實例
void app_init(void)
{
......
/* 分散載入快速啟動階段C++初始化 */
LOS_CppSystemInit((UINT32)&__init_array_start__, (UINT32)&__init_array_end__,
BEFORE_SCATTER);
/* 分散載入 */
LOS_ScatterLoad(0x100000, flash_read, NAND_READ_ALIGN_SIZE);
/* 分散載入非快速啟動階段C++初始化 */
LOS_CppSystemInit((UINT32)&__init_array_start__, (UINT32)&__init_array_end__,
AFTER_SCATTER);
......
}