如何在pyRTOS中实现按键触发的非周期性任务?
pyRTOS任务设计:非周期性触发任务的实现方案
关于while循环的适用范围
示例代码里的while循环并非只适用于非周期性任务——周期性任务同样可以用循环+定时延迟的方式实现,比如你的任务3(更新方块数字与颜色),就可以在循环内通过pyRTOS.task_delay()来控制执行周期,每次延迟后自动重新执行显示更新逻辑。
任务2(方块移动合并)的正确实现方式
不要移除循环,而是在循环内添加阻塞等待按键事件的逻辑,原因如下:
- 若移除循环,任务2执行一次后就会终止,pyRTOS会将其从任务队列中移除,后续再触发按键时任务已不存在,无法响应操作
- 保留循环+阻塞等待的模式,任务会一直处于存活状态,但在等待期间会主动让出CPU控制权,不会影响其他任务运行
具体实现步骤:
- 用pyRTOS的信号量/事件标志组/消息队列,作为任务1和任务2的通信桥梁
- 任务1(触摸按键检测)在捕获到按键动作时,向任务2发送事件信号
- 任务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
相关产品推荐
相关产品推荐

