stdio_usb improvements (#871)
Use shared IRQ if available to avoid 1ms timer. Allow use of stdio_usb with user's tinyusb setup if it has CDC
This commit is contained in:
@ -252,6 +252,14 @@ void irq_add_shared_handler(uint num, irq_handler_t handler, uint8_t order_prior
|
||||
*/
|
||||
void irq_remove_handler(uint num, irq_handler_t handler);
|
||||
|
||||
/*! \brief Determine if the current handler for the given number is shared
|
||||
* \ingroup hardware_irq
|
||||
*
|
||||
* \param num Interrupt number \ref interrupt_nums
|
||||
* \param return true if the specified IRQ has a shared handler
|
||||
*/
|
||||
bool irq_has_shared_handler(uint num);
|
||||
|
||||
/*! \brief Get the current IRQ handler for the specified IRQ from the currently installed hardware vector table (VTOR)
|
||||
* of the execution core
|
||||
* \ingroup hardware_irq
|
||||
|
@ -95,10 +95,21 @@ static int8_t irq_hander_chain_free_slot_head;
|
||||
static inline bool is_shared_irq_raw_handler(irq_handler_t raw_handler) {
|
||||
return (uintptr_t)raw_handler - (uintptr_t)irq_handler_chain_slots < sizeof(irq_handler_chain_slots);
|
||||
}
|
||||
|
||||
bool irq_has_shared_handler(uint irq_num) {
|
||||
check_irq_param(irq_num);
|
||||
irq_handler_t handler = irq_get_vtable_handler(irq_num);
|
||||
return handler && is_shared_irq_raw_handler(handler);
|
||||
}
|
||||
|
||||
#else
|
||||
#define is_shared_irq_raw_handler(h) false
|
||||
bool irq_has_shared_handler(uint irq_num) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
irq_handler_t irq_get_vtable_handler(uint num) {
|
||||
check_irq_param(num);
|
||||
return get_vtable()[16 + num];
|
||||
|
Reference in New Issue
Block a user