RISC-V汇编中.weak汇编指令的具体作用是什么?
RISC-V汇编中
.weak指令的作用解析(针对CH32003V启动代码) 我正在学习RISC-V汇编语言,习惯通过阅读他人代码积累实践经验。在CH32003V(一款新型RISC-V微处理器)的启动代码中,我发现了.weak汇编指令,查阅相关资料后仍未找到其相关说明,以下是包含该指令的代码片段:
.section .init, "ax", @progbits .globl _start .align 2 _start: .option norvc; j handle_reset .word 0 .word NMI_Handler /* NMI Handler */ .word HardFault_Handler /* Hard Fault Handler */ .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word SysTick_Handler /* SysTick Handler */ .word 0 .word SW_Handler /* SW Handler */ .word 0 /* External Interrupts */ .word WWDG_IRQHandler /* Window Watchdog */ .word PVD_IRQHandler /* PVD through EXTI Line detect */ .word FLASH_IRQHandler /* Flash */ .word RCC_IRQHandler /* RCC */ .word EXTI7_0_IRQHandler /* EXTI Line 7..0 */ .word AWU_IRQHandler /* AWU */ .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ .word ADC1_IRQHandler /* ADC1 */ .word I2C1_EV_IRQHandler /* I2C1 Event */ .word I2C1_ER_IRQHandler /* I2C1 Error */ .word USART1_IRQHandler /* USART1 */ .word SPI1_IRQHandler /* SPI1 */ .word TIM1_BRK_IRQHandler /* TIM1 Break */ .word TIM1_UP_IRQHandler /* TIM1 Update */ .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ .word TIM2_IRQHandler /* TIM2 */ .option rvc; .section .text.vector_handler, "ax", @progbits .weak NMI_Handler .weak HardFault_Handler .weak SysTick_Handler .weak SW_Handler .weak WWDG_IRQHandler .weak PVD_IRQHandler .weak FLASH_IRQHandler .weak RCC_IRQHandler
.weak指令的核心作用
.weak是GNU汇编器(GAS)提供的伪指令,不属于RISC-V架构专属,在多架构汇编代码中都有应用,它的核心功能是定义弱符号:
- 若程序中未实现该符号的强版本(即未通过
.globl声明或直接编写同名函数),链接器会使用这个弱符号的默认实现(通常这类默认中断处理函数是空逻辑,比如仅包含返回指令或无限循环)。 - 若用户自行实现了同名的强符号(比如自己编写了
NMI_Handler函数),链接器会优先选用用户的实现,忽略启动代码中的弱定义。
在CH32003V的启动代码里,.weak用来标记所有默认中断处理函数,这样用户只需实现自己需要用到的中断逻辑,无需关注未使用的中断——当未实现的中断触发时,系统会执行默认的弱处理函数,避免因无对应处理逻辑导致崩溃。
内容的提问来源于stack exchange,提问作者user273824
相关产品推荐
相关产品推荐

