如何让YCT生成的工程 快速编译其他开源的库
-
由于YCT生成的VSCODE的工程都是基于CMAKE的,基于这个基础,我们可以很方便的去编译其他第三方开源的库进入到我们的项目里(要求这个库也支持CMAKE),事实上,目前越来越多的库也就开始支持cmake编译了,cmake基本已经成本c/c++的编译的标准了。
下面我们用HA0 + mbedtls
下载mbedtls
mbedtls下载地址
判断一个库支不支持cmake只需要看看他的代码下面是否有CMakeLists.txt这个文件即可创建一个新的YCT HA0 的 freertos的demo工程
因为mbedtls要用到malloc 这些,所有创建一个freertos的demo
把mbedtls复制到工程里
对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导致的
修改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
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...