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 ++ 构造函数初始化。
其中被初始化的构造函数存在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);
......
}