乐趣区

关于操作系统:超轻量操作系统OneOSLite对C的支持

简介

c++组件是为了反对编译 c++ 源文件。该组件把全局对象的构造函数放到了指定的段地址中,以撑持 c++ 的失常应用与运行。

因为 OneOS-Lite 是很精简的 RTOS 零碎,因而提供的 C++ 撑持比较简单。

cpp_init.c 源文件中,实现了 C++ 零碎的初始化工作:

OS_WEAK int cpp_init(void)
{typedef void(*pfunc)();
    extern pfunc __ctors_start__[];
    extern pfunc __ctors_end__[];
    pfunc *p;

    for (p = __ctors_start__; p < __ctors_end__; p++)
        (*p)();

    return 0;
}
OS_CMPOENT_INIT(cpp_init,OS_INIT_SUBLEVEL_LOW);

其中的 __ctors_start____ctors_end__在链接脚本中被指定地位:

PROVIDE(__ctors_start__ = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE(__ctors_end__ = .);

可见,在 cpp_init 函数中,全局对象的构造函数就被一一的链接到了链接文件所调配到的段中。而后,OS_CMPOENT_INITOneOS-Lite 组件初始化的宏,它会把 cpp_init 函数放到组件初始化的地位进行初始化工作。

  1. __ctors_start__:C++ 全局构造函数段的起始地址
  2. __ctors_end__:C++ 全局构造函数段的完结地址

图形化配置

(Top) → Components→ Cplusplus
[*] cplusplus

简略体验

#include <iostream>  // 蕴含头文件 iostream
using namespace std;  // 应用命名空间 std

extern "C" 
{int test(void);
}
int test( )
{
    cout<<"This is a C++ program!";
    
    return 0;
}

编辑一个 c++ 文件,并在 main.c 文件中,调用 test 函数,编译运行,既能够应用串口打印该信息。

留神

MicroLIB不反对 c++,须要将optionsUse MicroLIB去掉勾选。

反对 c++ 会增大程序的 ramflash

最初,如果你须要应用到 c++ 代码。那么,请在 SConscript 中,把 cpp 文件增加到编译系统中去。

src = Glob('*.c') + Glob('*.cpp')

关注 && 分割

gitee:https://gitee.com/cmcc-oneos/OneOS-Lite

docs:https://oneos-lite.com/

援用自:https://gitee.com/cmcc-oneos/OneOS-Lite/blob/dev/components/cplusplus/README.md

退出移动版