超轻量操作系统OneOS-Lite对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值