Description
ATM it seems like you can only bind a task to at most one interrupt; is there any deeply rooted reason you couldn't bind it to more than one interrupt? I have a task managing a hardware UART, but I'm having trouble sending data without just blocking until it's done. I can't find a way to disable the "tx buffer empty" interrupts when I don't have anything to send (without also dropping the rx fifo), so if I have that interrupt enabled, once I run out of data the task is perpetually called, starving other tasks. I thought, maybe I can just add a timer that triggers every 100us and runs the UART update task, too. Unfortunately, it seems like you can only bind a task to a single interrupt. How hard would it be to permit e.g. binds = [LPUART5, GPT2]
, and would it incur overhead like locks?
I looked at cargo expand
, and copied one of the interrupt handlers into a function I can call from a second handler, like
unsafe fn LPUART5_dupe() {
const PRIORITY: u8 = 1u8;
rtic::export::run(
PRIORITY,
|| { lpuart5_interrupt(lpuart5_interrupt::Context::new()) },
);
}
though I also wondered if the nested run
s were necessary/good, so I also considered directly running
unsafe {
lpuart5_interrupt(lpuart5_interrupt::Context::new());
}
in my timer task. Are either of these safe? I suspect there'd be trouble if the two tasks had different priorities, but what if they were the same? (I've tested both, btw, and they SEEM to work, but of course that's no guarantee it's SAFE.)