嵌入式技术论坛
直播中

其实znvm

8年用户 1209经验值
擅长:电源/新能源
私信 关注
[经验]

请教大神在RT-Thread中怎样去使用cpp11呢

在最近的更新中,RT-Thread 增加了对 gcc 和 armclang 的 cpp11 支持。目前支持的 cpp11 特性如下所示:

Atomic
Conditional 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

更多回帖

发帖
×
20
完善资料,
赚取积分