diff --git a/components/cplusplus/README.md b/components/cplusplus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cd133effaa0b0b6361309dc9e39c4622862b1678 --- /dev/null +++ b/components/cplusplus/README.md @@ -0,0 +1,13 @@ +# C++ support for RT-Thread # + +This is the C++ component in RT-Thread RTOS. In order to support C++ language, this component +implement a basic environment, such as new/delete operators. + +Because RT-Thread RTOS is used in embedded system mostly, there are some rules for C++ applications: +1. DOES NOT use exception. +2. DOES NOT use Run-Time Type Information (RTTI). +3. Template is discouraged and it easily causes code text large. +4. Static class variables are discouraged. The time and place to call their constructor function could not be precisely controlled and make multi-threaded programming a nightmare. +5. Multiple inheritance is strongly discouraged, as it can cause intolerable confusion. + +*NOTE*: For armcc compiler, the libc must be enable. diff --git a/components/cplusplus/SConscript b/components/cplusplus/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..eb95aaa3c23c2d7215fe6f91f8572b82d837acce --- /dev/null +++ b/components/cplusplus/SConscript @@ -0,0 +1,11 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = Glob('*.cpp') +CPPPATH = [cwd] + +group = DefineGroup('CPlusPlus', src, depend = ['RT_USING_CPLUSPLUS'], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/cplusplus/crt.cpp b/components/cplusplus/crt.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6fa540b9e79cdd9befa0d57081c2952aef59b967 --- /dev/null +++ b/components/cplusplus/crt.cpp @@ -0,0 +1,27 @@ +#include +#include "crt.h" + +void *operator new(size_t size) +{ + return rt_malloc(size); +} + +void *operator new[](size_t size) +{ + return rt_malloc(size); +} + +void operator delete(void *ptr) +{ + rt_free(ptr); +} + +void operator delete[] (void *ptr) +{ + return rt_free(ptr); +} + +void __cxa_pure_virtual(void) +{ + rt_kprintf("Illegal to call a pure virtual function.\n"); +} diff --git a/components/cplusplus/crt.h b/components/cplusplus/crt.h new file mode 100644 index 0000000000000000000000000000000000000000..04fba47a602e87ecaef4004f81831f4645b87b0e --- /dev/null +++ b/components/cplusplus/crt.h @@ -0,0 +1,15 @@ +#ifndef CRT_H_ +#define CRT_H_ + +#include +#include + +void *operator new(size_t size); +void *operator new[](size_t size); + +void operator delete(void * ptr); +void operator delete[] (void *ptr); + +extern "C" void __cxa_pure_virtual(void); + +#endif