6159|6

111

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

『micropython』的任务调度器 [复制链接]

 
前一阶段看到有网友希望在microPython上运行多线程。我觉得这个有些困难。首先,CPython就没有解决GIL的问题。所以多线程就是一个梦。Java是可以的。但是任务调度的确是一个需求。

从Python2.7开始,标准库里就有sched。但是micropython没有实现。不过micropython的作者推荐了一个简单的调度器类实现。

  1. #A demo scheduler.py

  2. import pyb

  3. class Scheduler:
  4.     def __init__(self):
  5.         self.events = []

  6.     def schedule(self, delay, function):
  7.         if delay <= 0:
  8.             function()
  9.         else:
  10.             self.events.append([delay, function])
  11.             self.events.sort(key=lambda event:event[0])

  12.     def run(self):
  13.         while len(self.events) > 0:
  14.             delay, function = self.events.pop(0)
  15.             for event in self. events:
  16.                 event[0] -= delay
  17.             pyb.delay(delay)
  18.             function()
  19.             
  20. class LED:
  21.     def __init__(self, led_id, time_on, time_off):
  22.         self.led_id = led_id
  23.         self.time_on = time_on
  24.         self.time_off = time_off
  25.         self.on()
  26.         
  27.     def on(self):
  28.         pyb.LED(self.led_id, True)
  29.         sched.schedule(self.time_on, self.off)
  30.         
  31.     def off(self):
  32.         pyb.LED(self.led_id, False)
  33.         sched.schedule(self.time_off, self.on)
  34.         
  35. sched = Scheduler()
  36. LED(1, 1000, 2000)
  37. LED(2, 3000, 1000)
  38. sched.run()
复制代码
但是作者提供的代码有语法错误。(提供大家纠错)我将代码稍微改成另外的形式。

  1. #A demo scheduler.py

  2. import pyb

  3. class Scheduler:
  4.     def __init__(self):
  5.         self.events = []

  6.     def schedule(self, delay, function):
  7.         if delay <= 0:
  8.             function()
  9.         else:
  10.             self.events.append([delay, function])
  11.             self.events.sort(key=lambda event:event[0])

  12.     def run(self):
  13.         while len(self.events) > 0:
  14.             delay, function = self.events.pop(0)
  15.             for event in self. events:
  16.                 event[0] -= delay
  17.             pyb.delay(delay)
  18.             function()

  19. def job1():
  20.     pyb.LED(1).toggle()
  21.     sched.schedule(1000,job2)
  22.    
  23. def job2():
  24.     pyb.LED(2).toggle()
  25.     sched.schedule(2000,job1)
  26.         
  27. sched = Scheduler()
  28. job1()
  29. job2()
  30. sched.run()
复制代码

但是Scheduler类中,时间调度采用pyb.delay()来使用,是阻塞型的调度器。不能够让人满意。不过,暂时可以提供给大家使用吧。



最新回复

LZ继续  详情 回复 发表于 2017-3-2 17:17

赞赏

1

查看全部赞赏

点赞(1) 关注(1)
 
 

回复
举报

1万

帖子

203

TA的资源

管理员

来自 6楼
 
汇总在此:
【MicroPython】——by allankliu
https://bbs.eeworld.com.cn/forum ... 2739&fromuid=536508
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

5263

帖子

236

TA的资源

管理员

沙发
 
这个网友好像就是@windworld
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

1万

帖子

24

TA的资源

版主

板凳
 
太厉害了。
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

4
 
类似一个伪调度器
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(高级)

5
 
堵塞型的东西,核心思想是利用List的queue队列特性。如果要做成时间切片或者优先级调度,需要更加复杂的设计。

前者需要利用单独定时器来做调度队列中的任务,后者则需要在任务列表容器中增加优先级,pop/push任务时可以进行排序。

基于python的数据结构,实现起来并不算难。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

7
 
LZ继续
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表