
嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载导读zephyr模块是 MicroPython 针对 Zephyr RTOS 移植版ports/zephyr提供的专属功能模块封装了 Zephyr 特有的线程调度信息查询、调试线程分析器、UART 后端 Shell 命令执行以及磁盘DiskAccess、片上 Flash 分区FlashArea、显示设备Display和传感器zsensor等硬件访问能力。本文以官方文档 docs/library/zephyr.rst 为骨架结合 ports/zephyr 移植版的源码与配置完整讲解该模块的函数、类与常量定义帮助你在 FRDM-K64F、qemu_x86 等 Zephyr 支持的板卡上快速开展线程调试、块设备文件系统挂载、显示屏驱动与传感器数据采集。阅读完本文你将掌握zephyr.is_preempt_thread()/current_tid()/thread_analyze()/shell_exec()的用途与配置前提如何用DiskAccess与FlashArea实现符合 MicroPython 块设备协议vfs.AbstractBlockDev的存储访问并挂载 FAT/littlefs 文件系统如何用zephyr.Display驱动 Zephyr 显示设备以及用zsensor.Sensor读取传感器通道与设置通道属性。背景说明MicroPython 的 Zephyr 移植版是一个进行中的移植见 ports/zephyr/README.md当前支持 Zephyr v3.7LTS、v4.4 与开发分支CI 使用 v4.4。该移植版支持 REPLUART 控制台、machine系列外设类、socket网络、zsensor、frozen 模块、以及由 DiskAccess/FlashArea 支撑的 FAT 与 littlefs 虚拟文件系统。zephyr模块与上述特性密切相关且其中部分函数如thread_analyze、shell_exec依赖 ports/zephyr/prj.conf 中的 Kconfig 开关才能启用。1.zephyr模块概览可用成员与编译期开关从移植版源码 ports/zephyr/modzephyr.c 的模块全局表mp_module_time_globals_table可以看到zephyr模块的成员并非全部默认存在而是受 Kconfig 编译期开关控制成员启用条件Kconfig说明is_preempt_thread()始终可用判断当前线程是否可抢占current_tid()始终可用返回当前线程 IDthread_analyze(cpu)CONFIG_THREAD_ANALYZERZephyr 调试线程分析器shell_exec(cmd_in)CONFIG_SHELL_BACKEND_SERIAL在 UART 后端执行 Shell 命令DiskAccessCONFIG_DISK_ACCESS磁盘存储访问类FlashAreaCONFIG_FLASH_MAP片上 Flash 分区访问类DisplayCONFIG_DISPLAY显示设备访问类FileSystemCONFIG_FILE_SYSTEMZephyr 文件系统封装类RegulatorCONFIG_REGULATOR稳压器访问类文档 docs/library/zephyr.rst 收录了前四类函数并将DiskAccess、Display、FlashArea三个类分别收录在 zephyr.DiskAccess.rst、zephyr.Display.rst、zephyr.FlashArea.rst 中另将传感器绑定 zephyr.zsensor.rst 列为附加模块。FileSystem与Regulator类同样定义于移植版源码见 ports/zephyr/zephyr_filesystem.c 与 ports/zephyr/zephyr_regulator.c但不在本文档主题范围内本文不展开。需要特别指出移植版默认配置 ports/zephyr/prj.conf 中CONFIG_THREAD_ANALYZERy用于thread_analyze()而CONFIG_SHELLy与CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVENn被注释掉用于shell_exec()。因此默认固件里thread_analyze可用而shell_exec需要你自行在prj.conf中取消注释相关行并重新编译。2. 线程相关函数抢占判断、线程 ID 与栈/CPU 分析2.1zephyr.is_preempt_thread()—— 判断当前线程是否可抢占返回True表示当前线程是可抢占线程preemptible thread。Zephyr 中可抢占线程指优先级为非负值即较低优先级的线程当更高或相等优先级的线程变为就绪状态时这类线程可以被立即取代supplant。底层实现直接封装 Zephyr 内核 APIk_is_preempt_thread()见 ports/zephyr/modzephyr.c。典型场景在线程回调或 IRQ 上下文中判断当前执行环境避免在不可抢占上下文中执行耗时操作。2.2zephyr.current_tid()—— 获取当前线程 ID返回当前线程的线程 IDthread id该 ID 用于在后续调用中引用该线程。底层实现是k_current_get()的封装ports/zephyr/modzephyr.c。示例import zephyr tid zephyr.current_tid() print(current thread id:, tid) print(is preemptible thread:, zephyr.is_preempt_thread())2.3zephyr.thread_analyze(cpu)—— 线程栈与 CPU 利用率分析运行 Zephyr 的调试线程分析器对给定 CPU 上的当前线程打印栈大小统计输出格式为thread_name-20s: STACK: unused available_stack_space usage stack_space_used / stack_size (percent_stack_space_used %); CPU: cpu_utilization %要点CPU 利用率仅在配置了CONFIG_THREAD_RUNTIME_STATSKconfig 时才打印。该函数只有在移植版zephyr/prj.conf中配置了CONFIG_THREAD_ANALYZER时才能访问默认prj.conf已开启CONFIG_THREAD_ANALYZERy、CONFIG_THREAD_ANALYZER_USE_PRINTKy、CONFIG_THREAD_NAMEy。cpu参数仅在 Zephyr v4.0.0 及更新版本中使用旧版本会被忽略。源码中通过KERNEL_VERSION_NUMBER ZEPHYR_VERSION(4, 0, 0)区分新版本调用thread_analyzer_print(cpu)旧版本调用无参的thread_analyzer_print()ports/zephyr/modzephyr.c。示例import zephyr # 单核板卡如 FRDM-K64F传入 0多核板卡传入目标 CPU 编号 zephyr.thread_analyze(0)该功能对排查栈溢出、线程栈分配过小等问题非常实用线程分析器的完整能力说明可查阅 Zephyr 官方 thread analyzer 文档。3.zephyr.shell_exec(cmd_in)—— 在 UART 后端执行 Zephyr Shell 命令在 Zephyr 的 UART Shell 后端上执行给定命令字符串。底层调用shell_execute_cmd(shell_backend_uart_get_ptr(), cmd)ports/zephyr/modzephyr.c。前提条件必须在移植版zephyr/prj.conf中配置CONFIG_SHELL_BACKEND_SERIAL。默认prj.conf中以注释形式给出了开启方法# Required for zephyr.shell_exec() #CONFIG_SHELLy #CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVENn # Required for zephyr.shell_exec(net iface) #CONFIG_NET_SHELLy可用的命令列表见 Zephyr 官方 shell commands 文档例如网络调试时常用的net iface、kernel threads等。示例网络接口信息查询需同时开启CONFIG_NET_SHELLimport zephyr zephyr.shell_exec(net iface)在开发阶段这个函数让你无需另开终端连接 Zephyr 控制台直接在 MicroPython REPL 中触发 Shell 命令方便调试网络栈、线程与设备状态。4. 存储访问zephyr.DiskAccess与zephyr.FlashArea这两个类都实现了 MicroPython 的简单与扩展块设备协议block protocol即 docs/library/vfs.rst 中vfs.AbstractBlockDev所定义的方法因此可直接作为os.VfsFat/os.VfsLfs2的底层设备使用。4.1zephyr.DiskAccess—— 磁盘存储访问DiskAccess基于 Zephyr Disk Access API允许访问板上的存储设备如 SD 卡控制器、通过 SPI 接口连接的 SD 卡。设备在启动时通过 Zephyr devicetree 数据自动检测并初始化。构造器DiskAccess(disk_name)disk_name指定磁盘名。例如在 mimxrt1050_evk 上访问 SD 卡disk_name为SDHC。请查阅板卡文档与 devicetree 获取可用磁盘名如 RT 系列板卡通常使用USDHC#风格命名。方法DiskAccess.readblocks(block_num, buf)/DiskAccess.readblocks(block_num, buf, offset)DiskAccess.writeblocks(block_num, buf)/DiskAccess.writeblocks(block_num, buf, offset)DiskAccess.ioctl(cmd, arg)工作原理该类实现磁盘设备与内存缓冲区之间的数据搬移——给定磁盘名、缓冲区、起始磁盘块号与扇区数。MicroPython 会读取尽可能多的块来填满缓冲区因此读取的扇区数 缓冲区长度 ÷ 磁盘块大小见 docs/library/zephyr.DiskAccess.rst。使用示例import zephyr import os # 根据板卡 devicetree 选择磁盘名 disk zephyr.DiskAccess(SDHC) # 作为块设备挂载 FAT 文件系统需要 CONFIG_DISK_ACCESS 与 CONFIG_MICROPY_VFS_FAT os.VfsFat(disk)4.2zephyr.FlashArea—— 片上 Flash 分区访问FlashArea基于 Zephyr Flash Map API允许访问设备 Flash 分区数据。分区结构由全局唯一 ID 号、分区所在 Flash 设备名、相对 Flash 起始地址的偏移量、分区大小组成。构造器FlashArea(id, block_size)id为整数对应 devicetree 中定义的固定 Flash 分区。block_size为分区的块大小擦除块大小。常用分区若启动时FLASH_AREA_LABEL_EXISTS(storage)返回真则可使用预定义常量FlashArea.STORAGE访问指定的 flash 存储区。分区 ID 与 devicetree 的对应关系Zephyr devicetree 固定 Flash 分区为boot_partition、slot0_partition、slot1_partition、scratch_partition。由于 MicroPython 默认未启用 MCUBoot不强制固定分区布局这些固定分区可直接通过整数 ID 1、2、3、4 访问分别对应上述四个分区。注意FlashArea.STORAGE是否为可用分区取决于板卡 devicetree 是否声明了storage_partition。在 ports/zephyr/README.md 中还额外介绍了FlashArea.areas字典——它将分区标签映射到(partition_id, erase_block_size)元组擦除块大小取自 Flash 控制器的erase-block-size属性未指定时如 QSPI NOR Flash默认 4096 字节from zephyr import FlashArea # FlashArea.areas 是分区标签到元组的映射{storage: (3, 4096)} print(FlashArea.areas) # 用 (partition_id, erase_block_size) 构造对象 partition_id, erase_size FlashArea.areas[storage] flash FlashArea(partition_id, erase_size) # 与虚拟文件系统配合可参考 _boot.py 中的自动挂载逻辑 import os os.VfsFat(flash) # 或 os.VfsLfs2(flash)方法FlashArea.readblocks(block_num, buf)/FlashArea.readblocks(block_num, buf, offset)FlashArea.writeblocks(block_num, buf)/FlashArea.writeblocks(block_num, buf, offset)FlashArea.ioctl(cmd, arg)这些方法同样实现vfs.AbstractBlockDev定义的简单与扩展块设备协议。文件系统挂载的两种方案移植版提供两种文件系统方案见 ports/zephyr/README.md 的 “File Systems” 一节MicroPython 文件系统管理使用 MicroPython 自身文件系统代码基于 Zephyr 的 FlashArea API默认启用CONFIG_FLASH与CONFIG_FLASH_MAP时开启即上面os.VfsFat(flash)/os.VfsLfs2(flash)的用法。Zephyr 文件系统管理共享 Zephyr 与 MicroPython 的代码需要开启CONFIG_FLASH_MAP、CONFIG_FILE_SYSTEM、CONFIG_FILE_SYSTEM_LITTLEFS、CONFIG_FILE_SYSTEM_MKFS并在 dts overlay 中添加fstab节点然后通过zephyr.FileSystem挂载import vfs, zephyr zfs zephyr.FileSystem(zephyr.FileSystem.fstab()[0]) vfs.mount(zfs, /zephyr)若只需 MicroPython 方案可在prj.conf中关闭 MicroPython 的 VFS 代码以节省空间CONFIG_MICROPY_VFS_FATn、CONFIG_MICROPY_VFS_LFS1n、CONFIG_MICROPY_VFS_LFS2n。5.zephyr.Display—— 访问 Zephyr 显示设备Display类基于 Zephyr Display API通过复刻 Zephyr 接口的方式访问 Zephyr 提供的显示设备devicetree 中的zephyr,displaychosen 节点与zephyr,displays节点。源码位于 ports/zephyr/zephyr_display.c其设备句柄通过DEVICE_DT_GET(DT_CHOSEN(zephyr_display))获取即默认操作 devicetree 的 chosen 节点zephyr,display指定的显示器。构造器Display(id)id可以是整数0、1...或字符串如ssd13063c用于按位置或节点标识符定位显示设备节点。方法方法说明Display.write(buf[, x[, y[, size_x[, size_y]]]])将像素格式Pixel Format的 buffer 协议对象写入显示可选 x/y 位置与宽高Display.rgb(r, g, b)将 RGB 颜色转换为显示器的像素格式Display.capabilities()返回描述显示器的元组(X Size, Y Size, Supported PFs, Current PF, Current Orientation, Misc Characteristics, Current PF as framebuf format)Display.format([format])获取/设置显示器的像素格式Display.blanking(value)启用/禁用消隐blankingDisplay.clear()清屏Display.set_brightness(value)设置亮度0到255Display.set_contrast(value)设置对比度0到255Display.orientation([orientation])获取/设置显示方向Display.as_framebuf()若启用了framebuf模块生成一个framebuf.FrameBuffer实例并附加show()函数直接按当前配置映射到显示器capabilities()与像素格式转换在源码中直接对应display_get_capabilities()返回的struct display_capabilities字段如x_resolution、current_pixel_format、screen_info等见 ports/zephyr/zephyr_display.c。使用示例import zephyr # 通过 devicetree 节点标识符创建显示对象 disp zephyr.Display(ssd13063c) print(disp.capabilities()) disp.clear() disp.write(b\xff\xff\xff\xff) # 按当前像素格式写入缓冲区数据配合framebuf的典型用法import zephyr, framebuf disp zephyr.Display(0) fb disp.as_framebuf() fb.text(Hello Zephyr, 0, 0) fb.show()6.zsensor.Sensor—— Zephyr 传感器绑定zsensor模块源码 ports/zephyr/modzsensor.c文档 docs/library/zephyr.zsensor.rst提供Sensor类用于通过 Zephyr 传感器子系统访问板载传感器。6.1 核心概念通道Channel与通道属性Attribute传感器通道某个传感器可以测量的量。一个传感器可拥有多个通道表示同一属性的不同轴如加速度 X/Y/Z或不同属性如温度、气压。通道属性每个通道可有多个可查询/修改的属性如采样频率、阈值、增益等。设备名在板卡 devicetree 中定义。例如 FRDM-K64F 板上加速度计的设备名为FXOS8700。6.2 构造器Sensor(device_name)from zsensor import Sensor accel Sensor(FXOS8700) # FRDM-K64F 板载加速度计6.3 方法详解方法说明Sensor.measure()通过 Zephyrsensor_sample_fetch获取一次测量样本存入驱动内部缓冲区值为(整数部分, 百万分之一的小数部分)对。成功返回None失败返回/抛出OSError值Sensor.get_float(sensor_channel)以 float 返回测量值Sensor.get_micros(sensor_channel)以百万分之一返回测量值如(1, 500000)返回1500000Sensor.get_millis(sensor_channel)以千分之一返回测量值如(1, 500000)返回1500Sensor.get_int(sensor_channel)仅返回测量值的整数部分如(1, 500000)返回1Sensor.attr_set(sensor_channel, channel_attribute, val1, [val2])设置指定通道属性。val1可以是 float此时不传val2或以val1为整数部分、val2百万分之一为小数部分。成功返回None失败抛出OSErrorSensor.attr_get_float(sensor_channel, channel_attribute)以 float 返回通道属性值Sensor.attr_get_micros(sensor_channel, channel_attribute)以百万分之一返回属性值Sensor.attr_get_millis(sensor_channel, channel_attribute)以千分之一返回属性值Sensor.attr_get_int(sensor_channel, channel_attribute)仅返回属性值的整数部分注意许多传感器不支持attr_get_xxx系列方法文档明确提示“Many sensors do not support this or any other of the attr_get methods”调用前应查阅具体传感器的 Zephyr 驱动支持情况。从源码看通道与属性常量分别通过SENSOR_CHAN_*与SENSOR_ATTR_*宏映射ports/zephyr/modzsensor.c与 Zephyr 内核头文件中的枚举一一对应attr_set支持 4 或 5 个参数MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(sensor_attr_set_obj, 4, 5, ...)对应val1/val2两种取值方式。6.4 传感器通道常量zsensor模块级常量含义ACCEL_X/ACCEL_Y/ACCEL_ZX/Y/Z 轴加速度单位 m/s²ACCEL_XYZ伪通道代表三个加速度轴用于attr_set与attr_get_xxxGYRO_X/GYRO_Y/GYRO_Z绕 X/Y/Z 轴的角速度单位 rad/sGYRO_XYZ伪通道代表三个陀螺仪轴用于attr_set与attr_get_xxxMAGN_X/MAGN_Y/MAGN_ZX/Y/Z 轴磁场强度单位 GaussDIE_TEMP器件结温die temperature单位摄氏度PRESS气压单位 kPaPROX接近度无量纲1 表示物体接近HUMIDITY湿度单位 %LIGHT可见光谱照度单位 luxALTITUDE海拔单位米6.5 通道属性常量zsensor模块级常量含义ATTR_SAMPLING_FREQUENCY采样频率即传感器每秒采样的次数ATTR_LOWER_THRESH触发trigger下限阈值ATTR_UPPER_THRESH触发上限阈值ATTR_SLOPE_TH任意运动斜率触发阈值ATTR_SLOPE_DUR斜率值需持续超出阈值的时间触发条件之一ATTR_HYSTERESIS迟滞hysteresisATTR_OVERSAMPLING过采样因子ATTR_FULL_SCALE传感器量程SI 单位ATTR_OFFSET偏移量最终值 传感器值 偏移ATTR_CALIB_TARGET校准目标供芯片内部算法在特定轴或全部轴上自校准ATTR_CONFIGURATION配置传感器工作模式ATTR_CALIBRATION设置传感器所需的校准值ATTR_FEATURE_MASK启用/禁用传感器特性ATTR_ALERT告警阈值或告警启用/禁用ATTR_FF_DUR自由落体持续时间毫秒若运行中修改采样频率应同步调整该值以适配新采样频率ATTR_BATCH_DURATION硬件批处理持续时间ticksATTR_GAIN增益ATTR_RESOLUTION分辨率6.6 综合示例读取三轴加速度from zsensor import Sensor accel Sensor(FXOS8700) accel.measure() x accel.get_float(accel.ACCEL_X) y accel.get_float(accel.ACCEL_Y) z accel.get_float(accel.ACCEL_Z) print(accel:, x, y, z) # 设置采样频率部分传感器支持 try: accel.attr_set(accel.ACCEL_XYZ, accel.ATTR_SAMPLING_FREQUENCY, 100) except OSError as e: print(attr_set failed:, e)注measure()使用 Zephyr 的sensor_sample_fetch获取样本并存入驱动内部缓冲区因此读取通道值前必须先调用measure()。传感器与CONFIG_SENSORy默认prj.conf已开启具体传感器需按板卡启用相关。7. 构建与启用相关功能zephyr模块随 MicroPython Zephyr 移植版固件一起编译。构建方式详见 ports/zephyr/README.md# 安装好 Zephyr 环境后在任何位置构建无需进入 ports/zephyr 目录 west build -b frdm_k64f ~/micropython/ports/zephyr west build -b qemu_x86 ~/micropython/ports/zephyr # 烧录与调试 west flash west debug # QEMU 运行 west build -t run按需启用功能的配置入口thread_analyze默认已通过CONFIG_THREAD_ANALYZERy启用ports/zephyr/prj.conf。shell_exec取消注释CONFIG_SHELLy与CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVENn如需net iface等网络命令再开启CONFIG_NET_SHELLy。DiskAccess启用CONFIG_DISK_ACCESS配合CONFIG_MICROPY_VFS_FAT/CONFIG_MICROPY_VFS_LFS2使用文件系统。FlashArea启用CONFIG_FLASH_MAP默认CONFIG_FLASHCONFIG_FLASH_MAP即开启。Display启用CONFIG_DISPLAY并确保 devicetree 中声明zephyr,displaychosen 节点或zephyr,displays节点。传感器CONFIG_SENSORy默认开启具体传感器驱动需按板卡在 devicetree 中启用。8. 小结zephyr模块是 MicroPython Zephyr 移植版连接 Zephyr RTOS 能力的桥梁线程与调试is_preempt_thread()、current_tid()、thread_analyze(cpu)让你在 Python 层洞察线程调度与栈使用情况Shell 集成shell_exec()打通 MicroPython REPL 与 Zephyr Shell 命令需CONFIG_SHELL_BACKEND_SERIAL存储DiskAccess与FlashArea实现块设备协议可直接挂载 FAT/littlefs 文件系统是移植版持久化存储的两大入口显示Display复刻 Zephyr Display API并可通过as_framebuf()与framebuf无缝衔接传感器zsensor.Sensor将 Zephyr 传感器通道与属性映射为 Python 常量与方法覆盖加速度、陀螺仪、磁力计、温湿度、气压、光照、接近度等常见传感器类型。文中所有函数、类与常量均以 docs/library/zephyr.rst 及同目录下四个子文档为基准并结合 ports/zephyr/modzephyr.c、ports/zephyr/modzsensor.c、ports/zephyr/zephyr_display.c、ports/zephyr/prj.conf 与 ports/zephyr/README.md 进行了源码级印证。实际使用时请以你所用板卡的 devicetree 与 Zephyr 版本为准核对设备名、分区 ID 与 Kconfig 开关。赞分享嵌入式语言运行时编程语言解释器编译器物联网系统编程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址https://gitcode.com/gh_mirrors/mi/micropython点击查看免费下载相关推荐MicroPython Zephyr 移植版 FlashArea 类基于 Zephyr Flash Map 的分区存储访问指南MicroPython Zephyr 移植版 FlashArea 类基于 Zephyr Flash Map 的分区存储访问指南 zephyr.FlashAre嵌入式语言运行时编程语言解释器编译器物联网系统编程MicroPython Zephyr 移植版快速参考GPIO、PWM、I2C/SPI、存储与传感器外设速查指南MicroPython Zephyr 移植版快速参考GPIO、PWM、I2C/SPI、存储与传感器外设速查指南 本文是 MicroPython Zephyr嵌入式语言运行时编程语言解释器编译器物联网系统编程MicroPython Zephyr 端口 zephyr.Display 类完全指南复用 Zephyr Display API 驱动 LCD/OLED 显示屏MicroPython Zephyr 端口 zephyr.Display 类完全指南复用 Zephyr Display API 驱动 LCD/OLED 显示屏嵌入式语言运行时编程语言解释器编译器物联网系统编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考