使用 Simpy 模拟嵌入式固件的离散事件



假设我有 3 个任务:

def task1():
if check_if_theres_work_to_do():  #just checking takes 2us
do_work()  #takes 10us

任务 2 和任务 3 的定义类似

我有一个 CPU。一种常见的嵌入式方法是执行以下操作:

def round_robin():
while True:
task1()
task2()
task3()

现在,我想在 Simpy 中模拟它,但如果没有任何任务要做的工作,我不想不断地循环round_robin代码(因为这会增加模拟时间(,但我希望一次只能运行一个任务。 此外,我想模拟这样一个事实,即当工作可用时,例如对于 task2,在执行 task2(( 之前可能需要一些时间(处理器正忙于检查其他任务是否有工作要做/实际为其他任务做工作(。

在 Simpy 中,我定义了任务,使得每个任务都对一个事件产生(例如,队列中的工作项(:

def task1():
work_item = yield task1_work_queue.get()
do_task1_work(work_item)

但是如果我使用env.process(task1()); env.process(task2()); env.process(task3()),那么它们可以并行运行,这并不能准确地模拟 while 循环的行为。

我认为一种方法可能是定义一个名为 CPU、cpu = Resource()的资源,然后让任务在获取work_item时产生收益,然后在获取 CPU 时产生收益,然后产生 0 到 2*其他任务数量的随机时间:

def task1():
work_item = yield task1_work_queue.get()
with cpu.request() as req:
yield req
yield env.timeout(4)
do_task1_work(work_item)

但这似乎有点混乱,因为任务必须知道 CPU 正在执行多少其他任务。

有没有更好的方法来建模? 我是否应该在请求 CPU 然后等待获取工作时有一个进程产量,但让等待工作可以中断(这样没有工作的任务就不会阻止有工作的任务(?

您可以编写一个将所有任务放入队列(例如,具有无限容量的Store(的过程。

然后,您的"cpu"可以执行以下操作:

def cpu(env, work_q):
while True:
task, args = yield work_q.get()
yield env.timeout(3)  # task setup
yield env.process(task(*args))  # run actual task

最新更新