在RISC-V汇编中,有更好的方法来编写几个MMIO寄存器位吗?

3

为了配置UART tx,需要在内存映射的tx控制寄存器位[18:16]上写入水印(0到7)。

我的RISC-V汇编函数首先读取当前的控制寄存器值,与掩码进行按位AND以清除位[18:16],然后与移位后的输入值进行按位OR并写回。

以下是代码:

uart_set_txwmark:

    slli a0, 15;  /* shift input value by 15 */
    li t0, UART1_BASE;
    lw t1, UART_TXCTRL_OFFSET(t0); /* Read present value */

.equiv UART_MASK_WMARK, 0x0xFFF8FFFF /* [18:16] zero mask */

    li t2, UART_MASK_WMARK;   
    and t1, t1, t2;      /* clear/zero bits 18:16 */ 
    or t1, t1, a0;       /* OR with input value */
    sw t1, UART_TXCTRL_OFFSET(t0); /* Write back */

我很好奇是否有其他更好的方法在RISC-V中设置内存映射寄存器中的几位。

1个回答

4
我很想知道是否有更好的方式在RISC-V的映射内存寄存器中设定几个位。
其实没有,我认为你已经掌握了要点。
如果可以使用半字读/写操作,那么它会使感兴趣的位位于低位位置,所以你可以尝试:
la t0, UART1_BASE
lhu t1, UART_TXCTRL_OFFSET+2(t0)  // fetch high order at offset +2
andi t1, t1, -8
or t1, t1, a0
sh t1, UART_TXCTRL_OFFSET+2(t0)

非常感谢你,Erik。很抱歉,Stack Overflow 只允许一次点赞。我已经挖掘了好几天,试图找到更好的方法,因为我觉得我的方法太过于学校化了。 - RRON
andi t1, t1, -4 应该改为 andi t1, t1, -8。它的3个位[18:16]。 - RRON
糟糕,谢谢,结果是-8! - Erik Eidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接