在最近的更新中,RT-Thread 增加了对 gcc 和 armclang 的 cpp11 支持。目前支持的 cpp11 特性如下所示:
Atomic
Condi
tional variables
Clocks
Future
Mutexes
Threads
TLS
如何使用
在 RT-Thread 中使用 cpp11 需要对工具链进行修改。在使用前,请对工具链进行备份。
下载 gcc 工具链:
gcc version 10.2.1 20201103 (release) (GNU Arm Embedded Toolchain 10-2020-q4-major)
在 rt-thread/bsp/qemu-vexpress-a9 工程下使用 menuconfig 打开 cpp11 支持:
删除工具链目录中的下面这些文件:
rm -f toolchain/arm-none-eabi/include/c++/10.2.1/thread
rm -f toolchain/arm-none-eabi/include/c++/10.2.1/mutex
rm -f toolchain/arm-none-eabi/include/c++/10.2.1/condition_variable
rm -f toolchain/arm-none-eabi/include/c++/10.2.1/future
rm -f toolchain/arm-none-eabi/include/pthread.h
清空下面文件中的内容(注意不是删除):
toolchain/arm-none-eabi/include/sys/_pthreadtypes.h
设置工具链路径:
set RTT_EXEC_PATH=D:software oolsgcc-arm-none-eabi-10.3-2021.07-win32gcc-arm-none-eabi-10.3-2021.07in
修改 rtconfig.py 文件,添加 c++ 编译参数:
CXXFLAGS = CFLAGS + ' -std=c++11 -fabi-version=0 -MMD -MP -MF'
输入 scons 编译工程
测试
通过 utest 框架来测试一下 RT-Thread 对 cpp11 的支持情况。这里只测试了 Thread 和 Mutex 两个特性。
Thread
在 applications 目录下,创建文件 thread_tc.cpp 并输入以下内容:
#include
#include "utest.h"
#include
static void test_thread(void)
{
int count = 0;
auto func = [&]() mutable
{
for (int i = 0; i < 100; ++i)
{
++count;
}
};
std::thread t1(func);
t1.join();
if (count != 100)
{
uassert_false(1);
}
std::thread t2(func);
t2.join();
if (count != 200)
{
uassert_false(1);
}
uassert_true(1);
}
static rt_err_t utest_tc_init(void)
{
return RT_EOK;
}
static rt_err_t utest_tc_cleanup(void)
{
return RT_EOK;
}
static void testcase(void)
{
UTEST_UNIT_RUN(test_thread);
}
UTEST_TC_EXPORT(testcase, "components.cplusplus.thread_tc", utest_tc_init, utest_tc_cleanup, 10);
输入 scons 编译工程,输入 qemu.bat 启动 qemu:
输入 utest_run 运行测试用例:
Mutex
在 applications 目录下,创建文件 mutex_tc.cpp 并输入以下内容:
#include
#include "utest.h"
#include
#include
static void test_mutex(void)
{
std::mutex m;
int count = 0;
auto func = [&]() mutable
{
std::lock_guard lock(m);
for (int i = 0; i < 1000; ++i)
{
++count;
}
};
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
if (count != 2000)
{
uassert_false(1);
}
uassert_true(1);
}
static rt_err_t utest_tc_init(void)
{
return RT_EOK;
}
static rt_err_t utest_tc_cleanup(void)
{
return RT_EOK;
}
static void testcase(void)
{
UTEST_UNIT_RUN(test_mutex);
}
UTEST_TC_EXPORT(testcase, "components.cplusplus.mutex_tc", utest_tc_init, utest_tc_cleanup, 10);
输入 scons 编译工程,输入 qemu.bat 启动 qemu:
输入 utest_run 运行测试用例:
原作者:Papalymo