在实现从PC端编写好的.py脚本,通过串口发送到MCU,MCU再将脚本写入到外部FLASH里保存起来,然后运行的时候,在将脚本文件读到RAM里。然后调用obj_run,这些步骤下来是没有问题的,就是当.py脚本编写的代码量越大时,obj_run在加载的时候会非常的久才能启动,有什么方法可以优化一下吗,目前优化了memcpy,memset,memove,memcp,这些弱函数定义,但效果并不怎么明显。
离线
是这样的,obj_run是因为要把py编译为字节码再运行所以会很慢,如果直接运行字节码是秒启动的
linklibrary之后,run_module就可以直接运行字节码,参考 pikaScript.c 里面自动生成的启动代码
离线
另外如果用pikastudio的话,就可以在PC编辑main.py,然后在PC生成.a之后发送到MCU,这样是最快的
离线
但是我的脚本文件是需要再PC端编写好代码后,再发给MCU运行,obj_runModule(newAi->pikaMain,"main");这里的main是运行pikapython根目录下那个文件吗
离线
但是我的脚本文件是需要再PC端编写好代码后,再发给MCU运行,obj_runModule(newAi->pikaMain,"main");这里的main是运行pikapython根目录下那个文件吗
这个是可以实现的,只不过两种路径。
1. 就是发python原文件给MCU,然后MCU编译出.a,然后运行
2. 在PC把python(更新后的),在 PC 编译出.a,然后发送给MCU,然后运行
路径2也是可以实现动态刷新的,而且启动快,通过串口/网口等把.a发过去,然后把.a存到文件系统/FLASH,再加载运行
推荐你看看这个视频讲解,里面有详细的启动流程的说明 https://www.bilibili.com/video/BV1zh4y1T7Vi/
可以参考下面的代码,代表了几种典型的启动方式
PikaObj *root = newRootObj("pikaMain", New_PikaMain);
FILE *fp = fopen(PIKA_SHELL_SAVE_APP_PATH, "rb");
if (fp != NULL) {
fclose(fp);
printf("[Info] load app from sd card\n");
obj_linkLibraryFile(root, PIKA_SHELL_SAVE_APP_PATH); // 从文件中加载 .a 启动
obj_runModule(root, "main");
} else {
printf("[Info] load app from firmware\n");
extern unsigned char pikaModules_py_a[];
obj_linkLibrary(root, pikaModules_py_a); // 从 flash 中加载 .a 启动
}
pikaPythonShell(root);
while (1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
这个代码的出处在 https://gitee.com/Lyon1998/pikapython_openhardware/blob/master/PIKA_PI_WIRELESS_FIRMWARE/main/main.c
你可以参考一下这个工程,里面的功能是比较多的
离线
@lyon1998
另外如果是从 XIP flash 里面启动 .a,那么缓存用的 RAM 都省掉了,这样是最快且省内存的
我自己做项目的工程一般是这样设计的:
1. 准备文件系统,同时也给 .a 划分一块 xip flash
2. 支持串口发送.a,写入到文件系统,然后重启
3. 上电启动时,文件是否有 .a 如果有,那将文件中的 .a 写入到 xip flash,然后删除文件
4. 从 xip flash 启动
这种方式可以做到的优势:
1. 能够动态更新 python 脚本
2. python 脚本编译为 .a 的过程提前放到了 PC 进行,速度很快
3. 从 xip flash 中启动 .a 完全不需要缓存字节码,秒启动且 RAM 占用最低
离线
@lyon1998
你这个确实是很好的方法,不过我实现了在PC编译,然后发送给MCU运行,这样确实启动非常快,但编译成.a或者.o文件,我是用Pika包里的rust自动打包的,但在我的项目工程中,我只想要这个编译的功能,把它嵌在我的软件里,这样我软件上点击下载的时候,就能自动的编译完发送给MCU了,有什么方法实现吗,大佬
离线
@XianGe
我在另一个帖子里面回复了:https://whycan.com/p_103273.html#p103273
离线