在线时间101 小时
UID3617445
注册时间2020-2-7
NXP金币213

TA的每日心情 | 开心 2025-7-10 13:07 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
版主
  
- 积分
- 1524

- 最后登录
- 2025-7-10
|
本帖最后由 y369369 于 2024-9-30 15:06 编辑
上周结合代码给大家分析了MicroPython本身对于程序上电启动的支持,并介绍了一种结合文件系统的实现方案,只需要将想要运行的程序重命名为main.py,将其拷贝到文件系统中即可。
但是,会存在一个问题---那就是如果考虑到产品量产下如何批量的烧写程序,那拷贝SD卡一定不是一个最优方案。
小编今天就给大家带来一个独家计划!这样的做法不仅简化了量产阶段的操作流程,还提高了产品的稳定性和用户体验。将特定的功能代码与MicroPython源码一同编译成一个完整的镜像,可以确保每次设备重启或上电后都能自动执行预定的任务,这对于物联网(IoT)设备或者需要无人值守操作的嵌入式项目来说非常有用。
当然,思路来源是从上期给大家看到的:
pyexec_frozen_module("_boot.py", false);
这段函数的作用是执行一个frozen的模块,模块名字叫做_boot.py。好了,那我们是不是也可以调用一个叫做main.py的模块。这里frozen的含义,就是MicroPython源码在编译的时候,用户可以手动指定一些python脚本代码将其和代码编译在一起。这样一来,程序相当于变成了MicroPython的一个builtin模块。可以直接使用import xx来进行引用,就很方便了。
这样一来,思路就很清晰了,便是如何添加一个新的模块:
1.将想要执行的main.py放到mimxrt/modules下,以防冲突,命名为_main.py
插播一条,为啥要放到这个文件夹?我们打开boards文件夹,找到一个叫做manifest.py的文件,可以看到第一条有一个freeze(“$(PORT_DIR)/modules”),作用就是将modules下的文件进行freeze操作:
2. 在main.c添加pyexec_frozen_module(“_main.py”, false);
一定要注意添加位置,要在mp_usbd_init()后,否则无法使用print进行打印,因为这个函数负责初始化REPL的串口输出。
3. 重新编译Micropython镜像,在mimxrt文件夹下,执行:
make -j21 board=MIMXRT1060_EVK PYTHON=python
等待编译完成,并将新的hex文件烧写到我们的开发板上。
4. 重新对开发板进行上电,程序即可自动运行,而当程序运行完成后自动退出脚本的运行,恢复REPL模式。
今天的分享就到这里,相较于直接放到文件系统中的方式,我们将所要执行的代码和MicroPython的源代码编译到了一起,这样在量产阶段,我们就可以直接烧写这一镜像即可,因为镜像中包含了上电自运行代码,就可以实现我们想要的实现MicroPython上电自启动代码的目的。
这样做还有助于减少因文件系统错误而导致的问题,因为镜像是在一个较为稳定的环境中构建的,减少了由于文件系统损坏而引起的潜在错误。此外,这种方法也有利于安全性的提升,因为你可以更好地控制哪些代码会被执行,并且可以通过镜像的方式更容易地更新或修复安全漏洞。
转载自: 恩智浦MCU加油站 如有侵权请联系删除
|
|