liteos C++支持(十七)

1 概述

1.1 基本概念

C++做爲目前使用最普遍的編程語言之一,支持類、封裝、重載等特性,是在C語言基礎上開發的一種面向對象的編程語言。算法

1.2 運做機制

STL(Standard Template Library)標準模板庫,是一些「容器」的集合,也是算法和其餘一些組件的集合。其目的是標準化組件,使用標準化組件後就能夠不用從新開發,直接使用現成的組件。編程

2 開發指導

2.1 功能

功能分類 接口名 描述
使用C++特性的前置條件 LOS_CppSystemInit C++構造函數初始化

2.2 開發流程

使用C++特性以前,須要調用函數LOS_CppSystemInit,實現C ++ 構造函數初始化。app

其中被初始化的構造函數存在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:code

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_CppSystemInitflash

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