飞道的博客

Python轻应用:启动方式

249人阅读  评论(0)

1、前言

Python轻应用基于MicroPython进行开发,MicroPython 继承了python优美简介的语法,同时提供了便捷的嵌入式硬件操作库。

HaaS100作为阿里云智能IoT推出的一款 IoT开发板,它适配了MicroPython的运行引擎, 提供了各种丰富的硬件操作接口,同时提供阿里云物联网平台和云端AI相关的能力。

使用这块开发板,可以轻松通过Python程序实现硬件控制,云端AI以及云端互通的能力。

更多Python轻应用相关信息可以参考以下链接:

Python轻应用总览

本文要介绍的就是,如何选择最合适的启动方式,进而提高Python轻应用开发效率。

 

2、效果视频

Python轻应用启动方式

 

以上视频中展示了两种执行方式:

  • 交互式
  • 文件执行

接下来就基于这两种方式进行展开说明,让开发者在日常开发中能正确的选择最合适自己的启动方式。

 

3、环境准备

3.1、硬件

  1. HaaS100 开发板一块
  2. 电源一个
  3. micro usb 一个
  4. sdcard 一个

3.2、软件

  1. 最新的HaaS100 开源代码
  2. 串口工具

 

4、固件准备

可以按照Python轻应用快速上手中的方式,直接下载固件烧录,也可以自己下载源码,编译后烧录运行。

最终烧录到机器里面的主程序功能如下:

  • 注册一个Python 命令
  • 依据传入的参数决定进入交互式还是文件方式执行

 

4.1、代码分析

在下载了HaaS100 最新的开源代码以后 ,进去application/example 目录,可以看到Python轻应用的示例工程:

py_engine_demo这个demo 的入口程序是appdemo.c。这个代码中主要做了两件事情:

  1. 注册python命令
  2. 启动python虚拟机

 

注册python命令


  
  1. static struct cli_command command = {
  2.     .name     = "python", /*命令名称*/
  3.     .help     = "start micropython ", /*命令的帮助描述信息*/
  4.     .function = handle_identity_cmd   /* 命令的实现函数*/
  5. };
  6. int application_start(int argc, char *argv[])
  7. {
  8.     # 调用系统cli命令注册接口
  9.     int  ret = aos_cli_register_command(&command);
  10.     if (ret) {
  11.         printf( "register micropython command failed \n");
  12.     } else{
  13.         printf( "register micropython command succeed \n");
  14.     }
  15. }

 

启动python虚拟机


  
  1. int python_main_entry(void *p)
  2. {
  3.     //printf("global_argc = %d;global_argv = %p;%s;\n", global_argc, global_argv, __func__);
  4.     tick_t   sleep_time;
  5.     sleep_time = krhino_ms_to_ticks( 10); /*  10ms to ticks */
  6.     #sleep 10ms 确保新的task 在默认task之后执行
  7.     krhino_task_sleep(sleep_time); /*  sleep 10ms */
  8.     mpy_thread_args* args = (mpy_thread_args*)p;
  9.     if (args == NULL)
  10.     {
  11.         printf( "%s:args is illegal\n", __func__);
  12.         return -1;
  13.     }
  14.     # 启动python 虚拟机
  15.     mpy_init();
  16.     mpy_run(args->argc, args->argv);
  17.     # 退出虚拟机,释放内存
  18.     free_mpy_thread_args(args);
  19.     return 0;
  20. }
  21. static void handle_identity_cmd(char *pwbuf, int blen, int argc, char **argv)
  22. {
  23.     //printf("argc = %d;argv = %p; %s;\n", argc, argv, __func__);
  24.     # 申请需要传递到新的task 相关信息的内存
  25.     mpy_thread_args* args = alloc_mpy_thread_args(argc, argv);
  26.     # 启动一个新的task,去执行python命令
  27.     aos_task_new( "python_main_entry", python_main_entry, ( void*)args, 1024* 20);
  28. }

 

4.2、编译

在AliOS Things代码的根目录下,执行如下命令


  
  1. aos make py_engine_demo@haas100 -c config
  2. aos make

编译完成以后,在 out/py_engine_demo@haas100/binary/ 目录,会生成一个 py_engine_demo@haas100.bin 同时在 platform/mcu/haas1000/release/write_flash_tool/ota_bin/目录会生成一个新的 littlefs.bin文件

 

4.3、烧录

请参考 Python轻应用快速上手 中 烧录环节。如果是windows 电脑,烧录固件包位于platform/mcu/haas1000/release/ 目录

 

 

5、交互式运行

系统开机以后,在串口命令行中输入Python 不带任何参数,默认进入交互式模式。

在这个模式下面可以实时的输入Python 代码执行,并展示执行结果。由于它非常方便,跟人机对话一样,一个输入一个输出,因此这种模式叫friendly_repo ,和friendly_repo 对应还有一个raw_repl。

  • friendly_repl

人机对话模式,方便快速调试和编程

退出: ctrl+d

切换: 两次 ctrl+a 进入raw_repl模式

 

  • raw_repl

原生模式,不方便交互,方便进行文件流的传输和执行

切换: ctrb+b 切换到friendly_repl模式

在raw_repl 模式下面,可以通过串口,将文件流直接推送到机器里面执行,这部分本文暂不做介绍。

 

6、文件执行

文件执行分为两种情况:

  • 文件在HaaS设备上
  • 文件在电脑(PC)上

 

6.1、执行HaaS设备上的文件

目前HaaS100文件系统上面,支持将文件放到内置的 /data分区  或者外置的 /sdcard。

data

/data分区上的文件是在编译阶段预制上去的,优点是它会一直存在,缺点是如果更新或者修改,都需要编译或者烧录。 /platform/mcu/haas1000/prebuild/data/  是data 分区的更目录,通常情况下,这个目录的所有文件都会被编译到littlefs.bin 中,在系统里面 通过 /data/ + 具体路径进行访问。

默认情况下,/data目录包含两个子目录

  • /data/lib

python官方库目录,请不要修改

  • /data/python

可以执行的python 案例源文件

 

sdcard

sd卡默认在设备上的路径是 /sdcard。相对于data,它的有点就是不用刷机,并且空间足够大。直接pc上面编辑后保存到sdcard,再插入设备即可(目前不支持热插拔,插入后机器需要重启)

 

6.2、执行PC上的文件

执行PC上的文件也可以分为两种方法,文件流传输执行以及文件下载执行。由于文件流执行比较复杂,需要一系列的工具支持,所以本文暂时不介绍文件流执行。

文件下载指的是将PC上的文件,下载到设备的data或者sdcard,然后通过Python 执行去执行下载的文件。目前,在HaaS100 设备上,已经支持tftp 功能,所以我们可以通过tftp将文件从PC上下载到设备上,tftp  功能方法使用如下:

  • 设备端联网(注意替换ssid 和 密码)

python   /data/python/network/ConnectWifi.py  "SSID"  "PassWord"

连接成功以后,log 中会打印设备端的ip地址

  • 设备端启动 tftp server

tftp server start

  • pc端和设备端连接同一个局域网,确保 PC可以ping 通 设备 ip

 PC端启动tftp 客户端,并通过put 命令将pc 的文件传递到设备端的指定路径(可以通过图形工具或者脚本完成)

以下是一个简单的脚本:send_file.sh


  
  1. #ip="192.168.1.173"
  2. ip=$1
  3. filename=$2
  4. #filename="test.py"
  5. tftp ${ip}  << !
  6. binary
  7. put ${filename} ${ip} :/sdcard/${filename}
  8. quit

假设设备端 ip 是: 192.168.1.173, 需要推送到机器的/sdcard的文件是 test.py,在电脑的终端中输入

bash send_file.sh 192.168.1.173 test.py

 

开发者支持

MicroPython 继承了Python易学易用的特点,同时提供了基于嵌入式硬件的基础库封装,让开发者可以很方便的通过交互式的环境,实时进行嵌入式开发,让嵌入式开发也变得简单方便。

更多MicroPython 嵌入式开发的信息可以钉钉扫码加入钉钉开发者群或者微信扫码关注HaaS技术社区公众号

 


转载:https://blog.csdn.net/HaaSTech/article/details/115216834
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场