if you're running a task on embassy-executor, it goes roughly like this: - executor creates the waker - executor calls Future::poll() on the task with the waker - task polling gets to the leaf future (let's imagine it's an uart rx) - leaf future checks hardware, sees no data has rx'd yet - leaf future stores waker in a global, returns Pending - data arrives, interrupt fires and calls .wake() on the waker - the waker's vtable points to embassy-executor's implementation of wake(), which re-enqueues the task to be polled again