BeagleBone Green Wireless上Adafruit库PWM初始化耗时异常问题
BeagleBone Green Wireless 场景下Adafruit_BBIO库PWM初始化高延迟问题
- 注:当前可检索到的BeagleBone平台关联标签仅对应BeagleBone Black,本次开发使用BeagleBone Green Wireless,目前无依据表明两款设备在该场景下的表现存在差异,欢迎提供其他适用标签建议。
- 开发目标:使用BeagleBone Green Wireless搭配Adafruit Python3库生成PWM脉冲宽度调制信号,实现设备操作员蜂鸣音告警功能。
核心问题现象
开发过程中发现单次PWM初始化流程耗时约240毫秒,时长远超合理预期。
最简复现代码如下:
import time import Adafruit_BBIO.PWM as PWM pwmPin = "P8_46" PWM.start(pwmPin, duty_cycle = 50, frequency = 1000) time.sleep(0.080) PWM.stop(pwmPin)
上述代码可按预期生成时长80ms、频率1000Hz的蜂鸣信号,但PWM初始化阶段就会引入约240ms的执行延迟。
时序同步验证结果
为精准定位延迟来源,额外引出一个GPIO引脚连接示波器,通过切换该I/O引脚的电平状态,实现代码执行时序与示波器观测波形的同步。
观测结论:
- 示波器通道输出的PWM波形完全正常
- 同步GPIO通道的持续242ms高电平脉冲区间,恰好与
PWM.start()初始化语句的执行周期完全重合
带同步逻辑的实际测试代码如下:
import time import Adafruit_BBIO.GPIO as GPIO import Adafruit_BBIO.PWM as PWM bitPin = "P8_10" pwmPin = "P8_46" GPIO.setup(bitPin, GPIO.OUT) currentBit = GPIO.input(bitPin) def toggleBit(): global bitPin global currentBit currentBit = not currentBit GPIO.output(bitPin, currentBit) # 初始同步脉冲 宽度92微秒 toggleBit() toggleBit() # 生成PWM蜂鸣信号 toggleBit() # 242ms高电平脉冲上升沿 PWM.start(pwmPin, duty_cycle = 50, frequency = 1000) toggleBit() # 242ms高电平脉冲下降沿 time.sleep(0.080) # 蜂鸣持续80ms toggleBit() PWM.stop(pwmPin) toggleBit()
已完成的排查动作
- 排除Python本身位操作性能偏低的可能性:测试发现242ms长高电平脉冲之前的初始同步脉冲宽度仅为92微秒,属于正常性能范围,无法解释PWM初始化的异常慢问题
- 查阅Adafruit库的C语言实现代码:确认库设计中存在PWM初始化的一次性开销,但约240ms的耗时会在每次调用初始化时重复出现,并非仅首次加载触发
- 更换PWM引脚、使用root权限运行程序(当前非root用户已加入对应pwm、gpio用户组)均无法消除该延迟
- 测试前已执行过正确的
config-pin引脚配置命令
软硬件版本环境
本次开发使用的均为可获取的较新版本:
- 硬件:BeagleBone Green Wireless开发板
- 系统:2020-04-06版Debian Buster IoT系统镜像
- 内核:4.19.94-ti-r42
- Python版本:3.7.3
- Adafruit-BBIO版本:1.2.0
需求说明
本人具备扎实的Linux/C开发经验,对BeagleBone平台较为熟悉,但Python开发经验较少,目前无法定位该异常成因,寻求对应的问题解决思路。
内容的提问来源于stack exchange,提问作者Steve Friedl
相关产品推荐
相关产品推荐

