跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Blogs
  3. 如何让YCT生成的工程 快速编译其他开源的库

如何让YCT生成的工程 快速编译其他开源的库

已定时 已固定 已锁定 已移动 Blogs
1 帖子 1 发布者 94 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • FrankieF 离线
    FrankieF 离线
    Frankie YunTu
    写于 最后由 Frankie 编辑
    #1

    由于YCT生成的VSCODE的工程都是基于CMAKE的,基于这个基础,我们可以很方便的去编译其他第三方开源的库进入到我们的项目里(要求这个库也支持CMAKE),事实上,目前越来越多的库也就开始支持cmake编译了,cmake基本已经成本c/c++的编译的标准了。

    下面我们用HA0 + mbedtls

    下载mbedtls

    mbedtls下载地址
    判断一个库支不支持cmake只需要看看他的代码下面是否有CMakeLists.txt这个文件即可

    创建一个新的YCT HA0 的 freertos的demo工程

    因为mbedtls要用到malloc 这些,所有创建一个freertos的demo

    把mbedtls复制到工程里

    ecacd840-a56b-46ae-92f1-8d68dba14ada-image.png

    对YCT的工程CMakeLists.txt进行一些修改

    增加下面的代码

    # USER CODE BEGIN target_link_libraries
    # target_link_libraries(...)
    add_subdirectory(mbedtls-3.6.0)
    
    target_link_libraries(${project_elf} mbedtls)
    configcore(mbedtls ${CMAKE_SOURCE_DIR})
    
    # USER CODE END target_link_libraries
    

    这样就会开始编译mbedtls,和把mbedtls link到工程里。
    但是这样肯定还是编译不过的😧

    对mbedtls进行一些配置

    这个时候就要看一些mbedtls的cmakelists文件了,看看里面有什么可以让我们配置的
    一般看到cmake里面有option相关的字眼代表这个字段是可以配置的,在.vscode/settings.json

    "cmake.configureArgs": [
            "-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/gcc.cmake",
            "-DARM_CPU=cortex-m7",
            "-DDEVICE_NAME=YTM32B1HA0",
            "-DTOOLCHAIN=GCC",
            "-DENABLE_PROGRAMS=OFF",
            "-DENABLE_TESTING=OFF",
            "-USE_STATIC_MBEDTLS_LIBRARY=ON",
            "-DMBEDTLS_CONFIG_FILE=../self_mbedtls_config.h"
    
        ],
    

    上面的配置分别告诉mbedtls,我们不要编译test,不要编译programs,用静态库(mcu只支持静态库),用我们自定义的一个配置文件。
    同时我们也要在根目录下创建一个空的self_mbedtls_config.h 文件。再次编译发现已经可以正常编译过了。
    但是我们发现mbedtls编译出来的target不是叫mbedtls,下面的写法是有问题的。

    target_link_libraries(${project_elf} mbedtls)
    configcore(mbedtls ${CMAKE_SOURCE_DIR})
    

    mbedtls把cypto,tls,x509 分为了3个target,我们这边就只拿crypto做测试。
    修改代为为如下:

    target_link_libraries(${project_elf} mbedcrypto)
    configcore(mbedcrypto ${CMAKE_SOURCE_DIR})
    

    mbedcrypto就是target的名字
    然后把mbedtls-3.6.0/programs/hahs/hello.c 的代码拿到我们的代码里,放到taska里面。

    void prvPrintTaskA(void *pvParameters)
    {
        (void)pvParameters;
        int i, ret;
        unsigned char digest[16];
        char str[] = "Hello, world!";
    
        mbedtls_printf("\n  MD5('%s') = ", str);
    
        if ((ret = mbedtls_md5((unsigned char *) str, 13, digest)) != 0) {
            mbedtls_exit(MBEDTLS_EXIT_FAILURE);
        }
    
        for (i = 0; i < 16; i++) {
            mbedtls_printf("%02x", digest[i]);
        }
    
        mbedtls_printf("\n\n");
    
        mbedtls_exit(MBEDTLS_EXIT_SUCCESS);
        while (1)
        {
            PRINTF("TASK A, Count %d\r\n", TaskA_Count++);
            vTaskDelay(1000UL);
        }
    }
    

    编译报如下的错误,是因为mbedtls的md5没有编译进去。同时用了newlib的malloc导致的
    83d9038c-8a70-410a-8247-4b43c52fa040-image.png
    修改mbedtls_config.h

    #ifndef SELF_MBEDTLS_CONFIG_FILE_HEADER
    #define SELF_MBEDTLS_CONFIG_FILE_HEADER
    
    
    #include "FreeRTOS.h"
    #include "printf.h"
    
    #define MBEDTLS_MD5_C
    
    #define MBEDTLS_PLATFORM_MEMORY
    #define MBEDTLS_PLATFORM_C
    #define MBEDTLS_PLATFORM_STD_CALLOC pvPortCalloc
    #define MBEDTLS_PLATFORM_STD_FREE vPortFree
    #define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
    #define MBEDTLS_PLATFORM_PRINTF_MACRO PRINTF
    #define MBEDTLS_PLATFORM_EXIT_MACRO configASSERT
    #endif
    

    分别用freertos的assert代替了exit,calloc,free 代替了malloc,unity-printf代替了stdio里的printf,这样就可以正常运行了。
    同时由于mbedtls这个target用到了freertos和unity-print,还需要给mbedtls 的target增加这几个依赖

    target_link_libraries("${MBEDTLS_TARGET_PREFIX}everest" PUBLIC FREERTOS UTILITY_PRINT)
    target_link_libraries("${MBEDTLS_TARGET_PREFIX}p256m" PUBLIC FREERTOS UTILITY_PRINT)
    

    总结

    通过cmake整体统一的架构,我们完成了不改动mbedtls一行代码的情况下,成功编译了mbedtls md5的代码进入到我们的工程。
    附件是示例工程代码,我把mbedtls-3.6.0源码删掉了,可以自己从官网上下载后,放进去编译测试。Freertos_Demo.zip

    1 条回复 最后回复
    0

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YCT离线License申请流程

    帮助没办法联网的电脑使用YCT

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • demo
    12
    can
    8
    lin stack
    6
    yt-link
    5
    vscode
    3
    adc模块
    2
    i2c
    2
    uuid
    2
    Online Users
    EkkoE
    Ekko
    mcM
    mc
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门