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

Discrete Event Simulating Embedded Firmware using Simpy

假设我有 3 个任务:

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

task2 和 task3 定义相似

我有一个 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 时产生,然后在获得 [=] 时产生38=],然后产生 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 然后等待开始工作时有一个进程 yield,但是等待工作可以中断(这样没有工作的任务不会阻止有工作的任务)?

您可以编写一个将所有任务放入队列的进程(例如,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