27浏览
查看: 27|回复: 0

[讨论] 【行空板K10】Mind+生成的代码初探

[复制链接]
本帖最后由 zoey不种土豆 于 2025-1-7 17:09 编辑

Mind+是一个不错的低代码平台,它的工作原理是将类似Scratch的积木式编程生成C++语言的代码,编译后和库文件链接成为可执行文件。一般意义上,我们不需要知道它生成代码的情况,但是如果想深入学习它,包括进行复杂代码调试和编写第三方扩展库,了解一下它底层代码的逻辑会很有帮助。今天就进行一些它生成代码的分析。

编译命令行分析
我采用的代码示例就是前几天写的那个读取温度数据并显示的例子:【行空板K10】编写第一个程序

当时,我提到可以从Mind+的小窗看到其编译命令行如下:

  1. <p></p><p>om.newlib-time.ld -T esp32s3.peripherals.ld -mlongcalls -Wl,--cref -Wl,--gc-sections -fno-rtti -fno-lto -Wl,--wrap=esp_log_write -Wl,--wrap=esp_log_writev -Wl,--wrap=log_printf -u _Z5setupv -u _Z4loopv -u esp_app_desc -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u pthread_include_pthread_rwlock_impl -u include_esp_phy_override -u ld_include_highint_hdl -u start_app -u start_app_other_cores -u __ubsan_include -Wl,--wrap=longjmp -u __assert_func -u vfs_include_syscalls_impl -Wl,--undefined=uxTopUsedPriority -u app_main -u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u newlib_include_assert_impl -u __cxa_guard_dummy -DESP32 -DCORE_DEBUG_LEVEL=0 -DArduino_RUNNING_CORE=1 -DARDUINO_EVENT_RUNNING_CORE=1 -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -Wl,--start-group C:\Users\haili_10137664\AppData\Local\DFScratch\cache\dfrobot.ino.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\DFRobot_AHT20\esp32s3bit\DFRobot_AHT20.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\Wire\src\esp32s3bit\Wire.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\FS\src\esp32s3bit\FS.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\FS\src\esp32s3bit\vfs_api.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\SPI\src\esp32s3bit\SPI.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\TFT_eSPI\esp32s3bit\TFT_eSPI.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\SPIFFS\src\esp32s3bit\SPIFFS.cpp.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\lv_lib_qrcode\esp32s3bit\lv_qrcode.c.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\lv_lib_qrcode\esp32s3bit\qrcodegen.c.o D:\Mind+1.8.0_RC1.0_20241127\Arduino\static\core\esp32s3bit\core.a -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lasio -lbt -lcbor -lunity -lcmock -lcoap -lnghttp -lesp-tls -lesp_adc_cal -lesp_hid -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lesp_https_server -lesp_lcd -lprotobuf-c -lprotocomm -lmdns -lesp_local_ctrl -lsdmmc -lesp_serial_slave_link -lesp_websocket_client -lexpat -lwear_levelling -lfatfs -lfreemodbus -ljsmn -ljson -llibsodium -lmqtt -lopenssl -lperfmon -lspiffs -lusb -lulp -lwifi_provisioning -lrmaker_common -ljson_parser -ljson_generator -lesp_schedule -lesp_rainmaker -lgpio_button -lqrcode -lws2812_led -lesp_diagnostics -lrtc_store -lesp_insights -lespressif__esp-dsp -lespressif__esp-sr -lesp32-camera -lesp_littlefs -lfb_gfx -lbtdm_app -larduino_tinyusb -lcat_face_detect -lhuman_face_detect -lcolor_detect -lmfn -ldl -lhufzip -lesp_audio_front_end -lesp_audio_processor -lwakenet -ldl_lib -lc_speech_features -lesp_tts_chinese -lvoice_set_xiaole -lmbedtls_2 -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lphy -lbtbb -lxt_hal -lm -lstdc++ -lgcc -lgcov -lc -lmodules -lscreen -lbus -lmultinet -lfst -lesp-code-scanner -lnewlib_iconv -llvgl -lSD -lasr -lDFRobot_ESPASR -lAdafruit_NeoPixel -lunihiker_k10 -lflite_g2p -lESP32_IO_Expander -lESP32_Display_Panel -Wl,--end-group -Wl,-EL -o C:\Users\haili_10137664\AppData\Local\DFScratch\build\dfrobot.ino.elf</p>
复制代码

从这个命令行中,可以看到所生成的.cpp文件 ,以及编译时使用的库文件和预定义信息。

主程序代码
我的主程序是这样的:

【行空板K10】Mind+生成的代码初探图1

Mind+生成的主程序位于C:\Users\haili_10137664\AppData\Local\DFScratch\cache\dfrobot.ino.cpp。其文件内容如下:

  1. #include <Arduino.h>
  2. /*!
  3. * MindPlus
  4. * esp32s3bit
  5. *
  6. */
  7. #include "unihiker_k10.h"
  8. // 创建对象
  9. UNIHIKER_K10 k10;
  10. uint8_t      screen_dir=2;
  11. AHT20        aht20;
  12. // 主程序开始
  13. void setup() {
  14.         k10.begin();
  15.         k10.initScreen(screen_dir);
  16.         k10.creatCanvas();
  17.         k10.setScreenBackground(0x000000);
  18.         k10.canvas->canvasText(aht20.getData(AHT20::eAHT20TempC), 3, 0xFFFFFF);
  19.         k10.canvas->updateCanvas();
  20. }
  21. void loop() {
  22. }
复制代码

这段代码和积木式的编排有高的相似度,容易读懂。其中k10对象对应的是开发板,aht20对象对应的是板载温湿度传感器。

库文件
库文件主要都在 Mind+1.8.0_RC1.0_20241127\Arduino\static\hardware\dfrobot\esp32s3\libraries\ 目录中,对应的源代码也都有提供。如果我们想学习相关的代码,这是个很好的机会。同时,这些代码也使我们可以很好了解其内部工作机制,比如一些硬件接口的参数是怎么填写。后面会结合具体的传感器或者任务进行分析。

结语
现在基本理清了Mind+生成代码的原理。这些对于程序调试和第三方库的开发都很有帮助。未来会进一步开展研究。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail