RISC-V MCU中文社区

【求助】 使用C++编译无法设置中断

发表于 GD32VF103 MCU 2021-04-02 10:39:17
4
2038
1
gcc

问题硬件:GD32VF103CBT6

IDE :NucleiStudio IDE

Version:2021-02

Build id:20210202

问题代码:

为例避免干扰,已经最大限度减少无关代码;已省略中断处理函数内容。

void USART2_IRQHandler() {}

int main(void)
{
    printf("func=%x\r\n",USART2_IRQHandler);  // 打印中断函数的时间地址
//    ECLIC_Register_IRQ(USART2_IRQn, ECLIC_NON_VECTOR_INTERRUPT,ECLIC_LEVEL_TRIGGER, 1, 0, (void *)USART2_IRQHandler);
    ECLIC_SetVector(USART2_IRQn, (rv_csr_t)USART2_IRQHandler);
    int vector_usart2 = ECLIC_GetVector(USART2_IRQn); // 获取中断向量表中中断函数的地址
    printf("vector=%x\r\n",vector_usart2);
    return 0;
}


问题现象1:

操作步骤:

新建工程:File -> New -> C/C++ Project -> C++ Managed Build -> Nuclei SDK Project For GD32VF103 SoC ->  gd32vf103c_longan_nano -> baremetal_helloworld

替换源码文件内容为以上内容。

当源码名为main.c时,可以正常输出:

func=800168a
vector=800168a

当源码名为main.cpp时,输出:

func=800168a
vector=0

通过GDB单步调试,以及肉眼disaeembly比对,均未发现任何有意义的线索


问题现象2:

使用rv_start新建工程在QEMU中正常


喜欢1
用户评论 (4)
  • Flagplus

    2021-04-02 12:16:38 Flagplus 1#

    胡灿

    不是说C代码写的可以放进flash里面,C代码写的也没有放进去,只有因为原本中断向量表里面定义的服务程序名跟你这边申明的是一样的,所以看起来是有效的。C++之所以不行,是因为按照你原先的写法,C++里面会把那个函数名给改掉,你可以看下编译后的map文件,这样就跟原本中断向量表中的对应不上了,如果中断向量表没有放在flash里面,是程序可写的话,你这么操作是没啥问题的,不管是C还是C++

    谢谢胡老师,明白了

  • 胡灿

    2021-04-02 12:00:44 胡灿 2#

    Flagplus

    确实有效,谢谢胡老师。但是仍然不太理解这个行为差异的具体原因,同样的代码为什么C写的程序中断可以正常放进flash里,而C++的不行。

    不是说C代码写的可以放进flash里面,C代码写的也没有放进去,只有因为原本中断向量表里面定义的服务程序名跟你这边申明的是一样的,所以看起来是有效的。C++之所以不行,是因为按照你原先的写法,C++里面会把那个函数名给改掉,你可以看下编译后的map文件,这样就跟原本中断向量表中的对应不上了,如果中断向量表没有放在flash里面,是程序可写的话,你这么操作是没啥问题的,不管是C还是C++

  • Flagplus

    2021-04-02 11:56:00 Flagplus 3#

    胡灿

    C++里面,extern "C" void USART2_IRQHandler() {},这么试试看。

    主要原因是,在GD32VF103里面,中断向量表是放在flash里面的,无法通过程序进行更改,所以setvector并没有起作用

    确实有效,谢谢胡老师。但是仍然不太理解这个行为差异的具体原因,同样的代码为什么C写的程序中断可以正常放进flash里,而C++的不行。

  • 胡灿

    2021-04-02 11:43:08 胡灿 4#

    C++里面,extern "C" void USART2_IRQHandler() {},这么试试看。

    主要原因是,在GD32VF103里面,中断向量表是放在flash里面的,无法通过程序进行更改,所以setvector并没有起作用

Flagplus

Flagplus 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板