一、将自己的代码打包进固件中的优势和好处:
1、一体化解决方案:
打包自己的代码进固件后,所有功能和模块都直接集成在固件内,不需要额外的脚本或依赖项,减少了部署的复杂性。
2、提高启动速度:
固件打包后,设备启动时不需要加载外部代码,减少了文件系统访问的时间,从而加速了设备启动和运行速度。
3、增强稳定性和性能:
通过将代码编译到固件中,可以消除运行时脚本解析的开销,直接在底层硬件上运行,提升了执行效率和系统稳定性。
4、减小内存占用:
MicroPython 固件可以进行优化,去除未使用的模块和功能,最大化地节省存储空间。这样可以腾出更多内存供应用程序使用,尤其是对于资源受限的嵌入式设备。
5、提高安全性:
通过将代码嵌入固件中,可以避免代码泄露或篡改的风险。尤其是在工业级应用中,固件打包能够有效防止外部访问修改。
6、便于管理和升级:
固件更新可以作为整体部署来管理,升级时只需更新固件即可,不必单独更新脚本或其他依赖。更方便进行 OTA(Over-The-Air)更新。
7、兼容性和可移植性:
固件中的代码是与硬件紧密结合的,减少了平台和环境依赖,提高了在不同设备间的兼容性和移植性。
8、简化开发流程:
固件的方式简化了应用的开发和调试过程,开发人员可以直接在固件环境下进行测试,而不必担心不同版本之间的兼容问题。
总的来说,将代码打包进固件中可以有效提升系统性能、稳定性、安全性和可维护性,特别适合对资源、启动时间、或安全性有严格要求的嵌入式应用。
二、如何将自己的代码打包进固件中?
1、准备本地固件编译环境
参考 1:Micropython v1.27.0 编译 (保姆级)
参考 2:Micropython v1.26.1 编译 (保姆级)
2、构建自己的固件,以ESP32-S3芯片为例
a. 在Micropython 源码的 ports/esp32/boards 下创建自己的固件目录,例如: MyBoards
b. ports/esp32/boards/MyBoards 下创建目录 modules, 用于存放自己的程序
c. 拷贝 ports/esp32/boards/ESP32_GENERIC_S3 下的全部文件到 ports/esp32/boards/MyBoards 下
d. 参考下面的代码修改ports/esp32/boards/MyBoards 下的文件
修改 board.json
{
"deploy": [
"../deploy.md"
],
"deploy_options": {
"flash_offset": "0"
},
"docs": "",
"features": [
"BLE",
"External Flash",
"External RAM",
"WiFi"
],
"images": [
"generic_s3.jpg"
],
"mcu": "esp32s3",
"product": "MyBoard",
"thumbnail": "",
"url": "https://www.espressif.com/en/products/modules",
"vendor": "MyBoard",
"variants": {
"SPIRAM_OCT": "Support for Octal-SPIRAM"
}
}
重点:修改 product 和 vendor 为你自己的信息
增加 manifest.py
include("$(PORT_DIR)/boards/manifest.py")
freeze("modules")修改 mpconfigboard.cmake
set(IDF_TARGET esp32s3)
set(SDKCONFIG_DEFAULTS
boards/sdkconfig.base
boards/sdkconfig.usb
boards/sdkconfig.ble
boards/sdkconfig.240mhz
boards/sdkconfig.spiram_sx
boards/ArtOS_Board/sdkconfig.board
)
set(MICROPY_FROZEN_MANIFEST ${MICROPY_BOARD_DIR}/manifest.py)重点:
1、修改boards/MyBoards/sdkconfig.board中蓝色部分为你的目录名
2、增加set(MICROPY_FROZEN_MANIFEST ${MICROPY_BOARD_DIR}/manifest.py)
修改 mpconfigboard.h
#ifndef MICROPY_HW_BOARD_NAME
// Can be set by mpconfigboard.cmake.
#define MICROPY_HW_BOARD_NAME "My Board"
#endif
#define MICROPY_HW_MCU_NAME "ESP32S3"
#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "My-Board"
// Enable UART REPL for modules that have an external USB-UART and don't use native USB.
#define MICROPY_HW_ENABLE_UART_REPL (1)
#define MICROPY_HW_I2C0_SCL (9)
#define MICROPY_HW_I2C0_SDA (8)
重点:
1、修改MICROPY_HW_BOARD_NAME 的值为你自己板卡的名称
2、修改MICROPY_PY_NETWORK_HOSTNAME_DEFAULT 的值为你自己的主机名称
修改 sdkconfig.board
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_LWIP_LOCAL_HOSTNAME="My-Board"重点:增加CONFIG_LWIP_LOCAL_HOSTNAME="My-Board" 为 LWIP 的主机名称
三、代码编写规范和如何将自己代码加入固件
1、代码规范
a. 在根目录 lib 下创建自己的库目录,将自己的功能代码放到此目录下。例如:lib/artos
b. 自己的代码中要采用相对路径导入类. 例如 from .utils import Utils
. 代表当前目录下
.. 代表上级目录下
依次类推
2、示例
在 lib/artos 下创建 utils.py
import binascii
import machine
class Utils:
@staticmethod
def unique_id() -> str:
"""
获取设备唯一 ID(MicroPython 机器 ID)
返回:
str: 大写十六进制唯一标识符
"""
return binascii.hexlify(machine.unique_id()).decode().upper()将 artos 整个目录放到 ports/esp32/boards/MyBoards/modules 中,固件编译时会自动打包进固件
假如在固件编译好并烧录进芯片后,在 main.py 中调用示例:
from artos.utils import Utils
print(Utils.unique_id())四、编译方法
编译方法参考
参考 1:Micropython v1.27.0 编译 (保姆级)
参考 2:Micropython v1.26.1 编译 (保姆级)
编译方法
make BOARD=MyBoards submodules
make BOARD=MyBoards编译无误后你将会在 ports/esp32 目录中看到名为:ports/esp32/build-MyBoards 的目录,在该目录下可以找到 firmware.bin, 将 firmware.bin 文件通过工具烧录进芯片即可。