【问题标题】:what is a (interrupt) handle?什么是(中断)句柄?
【发布时间】:2019-04-21 08:59:46
【问题描述】:

我正在尝试为 esp32 上的 UART 中断定义 ISR,通常,我的程序应该只从传输缓冲区(tx-FIFO)发送字节数组,一旦传输缓冲区执行中断为空并从传输缓冲区开始同一数组的另一个输出。

目前我找不到如何将特定的 ISR(然后我可以自己定义)分配给 UART_TX_DONE_INT 中断,这表明发送缓冲区为空。

我卡住的一个主要原因是因为我不明白中断句柄/处理程序是什么,就像http://zerothelement21.blogspot.com/2018/05/esp32-uart-interrupt-handling.html 这个家伙描述的那样。

期望: 我可以定义一个中断,当tx_FIFO为空时触发,我可以自己定义这个中断的ISR。

【问题讨论】:

    标签: interrupt uart interrupt-handling esp32


    【解决方案1】:

    中断处理程序中断服务例程 (ISR) 只是一个函数/例程,在发生中断时由硬件调用,在您的情况下,当UART TX FIFO 低于某个点,UART 将断言适当的中断标志,然后告诉中断控制器“停止”CPU,然后调用适当的 ISR。所以一般流程是将中断处理程序创建为一个函数,您将再次填充 FIFO,将该函数注册为中断服务程序,然后启用中断并启动 TX。

    幸运的是,对于 ESP32,Espressif 在其 SDK 中设置了一些便利函数来帮助处理中断,请参阅this section in the programming guide。 TL;DR 是您需要通过调用uart_intr_config() 来配置中断,使用uart_isr_register 注册您自己的处理程序(任何C 函数都可以),然后使用uart_enable_tx_intr() 启用中断。

    编辑添加:您是否考虑过您可能不需要编写自定义 ISR 来完成您想要的?查看uart_write_bytes(),它将数据复制到中间环形缓冲区然后退出,而 SDK 提供的 ISR 为您将数据传输到 FIFO。

    【讨论】:

    • 首先,感谢您快速详细的回放。留给我的问题是,如何将我在 uart_isr_register 中注册的 ISR 连接到特定中断。因为 uart_isr_register() 的任何参数都没有给出指向特定中断的链接。另外:为什么我要在我的 uart_intr_config_t 结构(txfifo_empty_intr_thresh 参数)以及 uart_enable_tx_intr() 函数中配置 txFIFO 空阈值?
    猜你喜欢
    • 2011-04-06
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多