From 593d794aebb56e5434030ad2ff1f34c3013f4cf5 Mon Sep 17 00:00:00 2001 From: yangjie11 Date: Mon, 12 Jun 2023 14:32:48 +0800 Subject: [PATCH 1/2] [cpp] support rt-thread CPP wrapper sub-switch macros --- components/libc/cplusplus/Kconfig | 6 ++++- components/libc/cplusplus/SConscript | 22 ++++++++----------- components/libc/cplusplus/cpp11/SConscript | 18 +++++++++++++++ components/libc/cplusplus/os/SConscript | 8 +++++++ .../libc/cplusplus/{ => os}/cxx_Mutex.cpp | 0 .../libc/cplusplus/{ => os}/cxx_Semaphore.cpp | 0 .../libc/cplusplus/{ => os}/cxx_Thread.cpp | 0 components/libc/cplusplus/{ => os}/cxx_lock.h | 0 components/libc/cplusplus/{ => os}/cxx_mail.h | 0 .../libc/cplusplus/{ => os}/cxx_mutex.h | 0 .../libc/cplusplus/{ => os}/cxx_queue.h | 0 .../libc/cplusplus/{ => os}/cxx_semaphore.h | 0 .../libc/cplusplus/{ => os}/cxx_thread.h | 0 13 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 components/libc/cplusplus/cpp11/SConscript create mode 100644 components/libc/cplusplus/os/SConscript rename components/libc/cplusplus/{ => os}/cxx_Mutex.cpp (100%) rename components/libc/cplusplus/{ => os}/cxx_Semaphore.cpp (100%) rename components/libc/cplusplus/{ => os}/cxx_Thread.cpp (100%) rename components/libc/cplusplus/{ => os}/cxx_lock.h (100%) rename components/libc/cplusplus/{ => os}/cxx_mail.h (100%) rename components/libc/cplusplus/{ => os}/cxx_mutex.h (100%) rename components/libc/cplusplus/{ => os}/cxx_queue.h (100%) rename components/libc/cplusplus/{ => os}/cxx_semaphore.h (100%) rename components/libc/cplusplus/{ => os}/cxx_thread.h (100%) diff --git a/components/libc/cplusplus/Kconfig b/components/libc/cplusplus/Kconfig index c7268e7b9af..e049f65629e 100644 --- a/components/libc/cplusplus/Kconfig +++ b/components/libc/cplusplus/Kconfig @@ -5,11 +5,15 @@ menuconfig RT_USING_CPLUSPLUS if RT_USING_CPLUSPLUS config RT_USING_CPLUSPLUS11 - bool "Enable c++11 threading feature support" + bool "Enable C++11 standard multi-threading feature support" default n select RT_USING_POSIX_FS select RT_USING_POSIX_STDIO select RT_USING_PTHREADS select RT_USING_RTC + config RT_USING_CPP_WRAPPER + bool "Enable RT-Thread APIs C++ wrapper" + default n + endif diff --git a/components/libc/cplusplus/SConscript b/components/libc/cplusplus/SConscript index 760049c139c..a7829cea6d1 100644 --- a/components/libc/cplusplus/SConscript +++ b/components/libc/cplusplus/SConscript @@ -1,21 +1,17 @@ -# RT-Thread building script for component - from building import * +import os Import('rtconfig') -cwd = GetCurrentDir() -src = Glob('*.cpp') + Glob('*.c') +cwd = GetCurrentDir() +src = ['cxx_crt_init.c', 'cxx_crt.cpp'] CPPPATH = [cwd] -if GetDepend('RT_USING_CPLUSPLUS11'): - src += Glob('cpp11/*.cpp') + Glob('cpp11/*.c') - if rtconfig.PLATFORM in ['armclang']: - src += Glob('cpp11/armclang/*.cpp') + Glob('cpp11/armclang/*.c') - CPPPATH += [cwd + '/cpp11/armclang'] - elif rtconfig.PLATFORM in ['gcc']: - src += Glob('cpp11/gcc/*.cpp') + Glob('cpp11/gcc/*.c') - CPPPATH += [cwd + '/cpp11/gcc'] +group = DefineGroup('CPP', src, depend=['RT_USING_CPLUSPLUS'], CPPPATH=CPPPATH) -group = DefineGroup('CPlusPlus', src, depend = ['RT_USING_CPLUSPLUS'], CPPPATH = CPPPATH) +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + group = group + SConscript(os.path.join(d, 'SConscript')) Return('group') diff --git a/components/libc/cplusplus/cpp11/SConscript b/components/libc/cplusplus/cpp11/SConscript new file mode 100644 index 00000000000..0d96a062694 --- /dev/null +++ b/components/libc/cplusplus/cpp11/SConscript @@ -0,0 +1,18 @@ +from building import * +Import('rtconfig') + +cwd = GetCurrentDir() +src = [] +CPPPATH = [] + +src += Glob('*.cpp') + Glob('*.c') +if rtconfig.PLATFORM in ['armclang']: + src += Glob('armclang/*.cpp') + Glob('armclang/*.c') + CPPPATH += [cwd + '/armclang'] +elif rtconfig.PLATFORM in ['gcc']: + src += Glob('gcc/*.cpp') + Glob('gcc/*.c') + CPPPATH += [cwd + '/gcc'] + +group = DefineGroup('CPP', src, depend=['RT_USING_CPLUSPLUS11'], CPPPATH=CPPPATH) + +Return('group') diff --git a/components/libc/cplusplus/os/SConscript b/components/libc/cplusplus/os/SConscript new file mode 100644 index 00000000000..5bda46087a2 --- /dev/null +++ b/components/libc/cplusplus/os/SConscript @@ -0,0 +1,8 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.cpp') +CPPPATH = [cwd] +group = DefineGroup('CPP', src, depend=['RT_USING_CPP_WRAPPER'], CPPPATH=CPPPATH) + +Return('group') diff --git a/components/libc/cplusplus/cxx_Mutex.cpp b/components/libc/cplusplus/os/cxx_Mutex.cpp similarity index 100% rename from components/libc/cplusplus/cxx_Mutex.cpp rename to components/libc/cplusplus/os/cxx_Mutex.cpp diff --git a/components/libc/cplusplus/cxx_Semaphore.cpp b/components/libc/cplusplus/os/cxx_Semaphore.cpp similarity index 100% rename from components/libc/cplusplus/cxx_Semaphore.cpp rename to components/libc/cplusplus/os/cxx_Semaphore.cpp diff --git a/components/libc/cplusplus/cxx_Thread.cpp b/components/libc/cplusplus/os/cxx_Thread.cpp similarity index 100% rename from components/libc/cplusplus/cxx_Thread.cpp rename to components/libc/cplusplus/os/cxx_Thread.cpp diff --git a/components/libc/cplusplus/cxx_lock.h b/components/libc/cplusplus/os/cxx_lock.h similarity index 100% rename from components/libc/cplusplus/cxx_lock.h rename to components/libc/cplusplus/os/cxx_lock.h diff --git a/components/libc/cplusplus/cxx_mail.h b/components/libc/cplusplus/os/cxx_mail.h similarity index 100% rename from components/libc/cplusplus/cxx_mail.h rename to components/libc/cplusplus/os/cxx_mail.h diff --git a/components/libc/cplusplus/cxx_mutex.h b/components/libc/cplusplus/os/cxx_mutex.h similarity index 100% rename from components/libc/cplusplus/cxx_mutex.h rename to components/libc/cplusplus/os/cxx_mutex.h diff --git a/components/libc/cplusplus/cxx_queue.h b/components/libc/cplusplus/os/cxx_queue.h similarity index 100% rename from components/libc/cplusplus/cxx_queue.h rename to components/libc/cplusplus/os/cxx_queue.h diff --git a/components/libc/cplusplus/cxx_semaphore.h b/components/libc/cplusplus/os/cxx_semaphore.h similarity index 100% rename from components/libc/cplusplus/cxx_semaphore.h rename to components/libc/cplusplus/os/cxx_semaphore.h diff --git a/components/libc/cplusplus/cxx_thread.h b/components/libc/cplusplus/os/cxx_thread.h similarity index 100% rename from components/libc/cplusplus/cxx_thread.h rename to components/libc/cplusplus/os/cxx_thread.h From d4984e58e6d9e60075913002ad65e957c1dcab71 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 14 Jun 2023 00:03:38 -0400 Subject: [PATCH 2/2] [cpp] attach CXXFLAGS to reduce the resource consumptions --- bsp/k210/drivers/SConscript | 2 +- components/libc/cplusplus/Kconfig | 4 ++++ components/libc/cplusplus/SConscript | 7 ++++++- components/libc/cplusplus/cpp11/gcc/__utils.h | 4 +--- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/bsp/k210/drivers/SConscript b/bsp/k210/drivers/SConscript index 9d107026551..a118be7270d 100644 --- a/bsp/k210/drivers/SConscript +++ b/bsp/k210/drivers/SConscript @@ -38,7 +38,7 @@ if GetDepend('RT_USING_PWM'): if GetDepend('RT_USING_WDT'): src += ['drv_wdt.c'] -group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=['NNCASE_NO_EXCEPTIONS']) objs = [group] diff --git a/components/libc/cplusplus/Kconfig b/components/libc/cplusplus/Kconfig index e049f65629e..1dcc6f389ce 100644 --- a/components/libc/cplusplus/Kconfig +++ b/components/libc/cplusplus/Kconfig @@ -16,4 +16,8 @@ if RT_USING_CPLUSPLUS bool "Enable RT-Thread APIs C++ wrapper" default n + config RT_USING_CPP_EXCEPTIONS + bool "Enable C++ exceptions (will increase overhead)" + default n + endif diff --git a/components/libc/cplusplus/SConscript b/components/libc/cplusplus/SConscript index a7829cea6d1..2f280892f4f 100644 --- a/components/libc/cplusplus/SConscript +++ b/components/libc/cplusplus/SConscript @@ -5,8 +5,13 @@ Import('rtconfig') cwd = GetCurrentDir() src = ['cxx_crt_init.c', 'cxx_crt.cpp'] CPPPATH = [cwd] +CXXFLAGS = '' -group = DefineGroup('CPP', src, depend=['RT_USING_CPLUSPLUS'], CPPPATH=CPPPATH) + +if rtconfig.PLATFORM in ['gcc', 'armclang', 'llvm-arm'] and not GetDepend('RT_USING_CPP_EXCEPTIONS'): + CXXFLAGS += ' -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -Wl,--gc-sections' # reduce resource consumptions + +group = DefineGroup('CPP', src, depend=['RT_USING_CPLUSPLUS'], CPPPATH=CPPPATH, CXXFLAGS=CXXFLAGS) list = os.listdir(cwd) for d in list: diff --git a/components/libc/cplusplus/cpp11/gcc/__utils.h b/components/libc/cplusplus/cpp11/gcc/__utils.h index f9a3c93796d..304d789ab55 100644 --- a/components/libc/cplusplus/cpp11/gcc/__utils.h +++ b/components/libc/cplusplus/cpp11/gcc/__utils.h @@ -17,11 +17,9 @@ #include -#define RT_USING_CPP_EXCEPTION - inline void throw_system_error(int err, const char *what_msg) { -#ifdef RT_USING_CPP_EXCEPTION +#ifdef RT_USING_CPP_EXCEPTIONS throw std::system_error(std::error_code(err, std::system_category()), what_msg); #else (void)err;