You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pyRTOS中实现按键触发的非周期性任务?

pyRTOS任务设计:非周期性触发任务的实现方案

关于while循环的适用范围

示例代码里的while循环并非只适用于非周期性任务——周期性任务同样可以用循环+定时延迟的方式实现,比如你的任务3(更新方块数字与颜色),就可以在循环内通过pyRTOS.task_delay()来控制执行周期,每次延迟后自动重新执行显示更新逻辑。

任务2(方块移动合并)的正确实现方式

不要移除循环,而是在循环内添加阻塞等待按键事件的逻辑,原因如下:

  • 若移除循环,任务2执行一次后就会终止,pyRTOS会将其从任务队列中移除,后续再触发按键时任务已不存在,无法响应操作
  • 保留循环+阻塞等待的模式,任务会一直处于存活状态,但在等待期间会主动让出CPU控制权,不会影响其他任务运行

具体实现步骤:

  1. 用pyRTOS的信号量/事件标志组/消息队列,作为任务1和任务2的通信桥梁
  2. 任务1(触摸按键检测)在捕获到按键动作时,向任务2发送事件信号
  3. 任务2的循环内调用阻塞式等待API,收到信号后执行移动合并逻辑,完成后回到等待状态

简化代码示例:

# 创建信号量用于按键事件通知
key_trigger = pyRTOS.Semaphore(0)

# 任务1:触摸按键检测
def touch_key_task(self):
    while True:
        if 硬件检测到箭头按键按下:
            key_trigger.signal()  # 发送触发信号
        pyRTOS.task_delay(10)  # 短延时降低CPU占用

# 任务2:方块移动与合并逻辑
def move_merge_task(self):
    while True:
        key_trigger.wait()  # 阻塞等待按键信号,此时让出CPU
        # 执行核心逻辑
        根据按键方向移动方块
        合并相邻相同数字的方块
        生成新的随机方块
        # 逻辑完成后回到循环,等待下一次触发

# 任务3:周期性更新显示
def update_display_task(self):
    while True:
        更新触摸板上的方块数字与颜色
        pyRTOS.task_delay(100)  # 每隔100ms执行一次

内容的提问来源于stack exchange,提问作者marqueslua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:52:13