Skip to content

[Bug] [HPM] [uart_v2] 驱动判断 TX 中断时混用了“中断 ID”和“中断使能掩码” #11687

Open

Description

@kaidegit

RT-Thread Version

master

Affected area

Board Support Package (BSP)

Hardware/BSP vendor

HPMicro

Architecture

RISC-V

Board and hardware details

hpm6364

Develop Toolchain

GCC

Describe the bug

错误代码位于 libraries/drivers/drv_uart_v2.c:763:

if ((irq_id & uart_intr_tx_slot_avail) &&
(stat & uart_stat_tx_slot_avail)) {

irq_id 应与 uart_intr_id_tx_slot_avail 比较:

if ((irq_id == uart_intr_id_tx_slot_avail) &&
(stat & uart_stat_tx_slot_avail)) {

当前 UART6 配置为 TX_BUFSIZE=0,RT-Thread 会采用轮询发送,不创建 serial_tx。当 UART 接收线出现状态中断时:

  • uart_intr_id_rx_line_stat = 0x6
  • uart_intr_tx_slot_avail 掩码值包含 0x2
  • 0x6 & 0x2 != 0

于是 RX line status 被误判为 TX 中断,随后在 libraries/drivers/drv_uart_v2.c:767 对空的 serial_tx 触发断言。

Other additional context

@helloeagleyang 是佬在负责这块吗

Activity

  1. added
    bugThis PR/issue is a bug in the current code.
    on Aug 5, 2026
  2. github-actions commented on Aug 5, 2026

    @github-actions

    如需认领并处理此 Issue,请评论 /claim。

    To claim and work on this issue, comment /claim.

  3. kaidegit commented on Aug 7, 2026

    @kaidegit
    ContributorAuthor

    串口的dma似乎也有问题

    1. rtconfig.h:RT_SERIAL_USING_DMA + RT_SERIAL_BUF_STRATEGY_OVERWRITE + BSP_UART6_RX_USING_DMA,BSP_UART6_RX_BUFSIZE=256。
    2. 驱动注册时(drv_uart_v2.c:1328-1339):config = RT_SERIAL_CONFIG_DEFAULT(rx_bufsz=64,dma_ping_bufsz = RT_SERIAL_RX_MINBUFSZ/2 = 32,见 dev_serial_v2.h:245-259),rx_bufsz 被覆盖为 256,dma_ping_bufsz 保持 32。
    3. HPM6360 的 hpm_soc_ip_feature.h 没有 HPM_IP_FEATURE_UART_RX_IDLE_DETECT(只有 5E00/5300/6200 有)。因此驱动 uart_rx_done/hpm_uart_dma_config/hpm_uart_receive_dma_next 全部走 else 分支(老式 DMA):
      • DMA 目标 = rx_fifo->rb.buffer_ptr,长度 = config.rx_bufsz(256);
      • 触发源只有 DMA TC 中断(每收满 256B 一次);
      • 事件上报 RT_SERIAL_EVENT_RX_DMADONE | (rx_bufsz << 8),即内核收到的 rx_length = 256。
    4. 新版内核 rt_hw_serial_isr 的 RX_DMADONE 处理(dev_serial_v2.c:2055-2100)假定:DMA 写的是 rx_fifo->dma_ping_rb(32B),事件携带的是实际接收字节数(≤ dma_ping_bufsz)。于是:
      • rt_serial_update_write_index(&dma_ping_rb, 256) → 256 > 32 → 打印 The serial buffer (len 32) is overflow.(打印的就是 rb->buffer_size=32,与日志 len 32 完全吻合);
      • 随后从空的/未初始化的 dma_ping_rb 取出 32B 垃圾 rt_ringbuffer_put_force 进 rx_fifo->rb → 应用读到垃圾 → lwgps 校验失败。
  4. helloeagleyang commented on Aug 9, 2026

    @helloeagleyang
    Contributor

    这个问题会在后续修复

  5. dongly commented on Oct 23, 2026

    @dongly
    Contributor
  6. kaidegit commented on Oct 26, 2026

    @kaidegit
    ContributorAuthor

    似乎tx中断误判修了,串口idle没修。

  7. helloeagleyang commented on Oct 26, 2026

    @helloeagleyang
    Contributor

    7. 似乎tx中断误判修了,串口idle没修。

    后续会专门针对的修一版

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Arch: RISC-VBSP related with risc-vBSPBSP: HPMicroBSP related with HPMicrobugThis PR/issue is a bug in the current code.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions