芯来科技
直播中

张览秀

8年用户 1188经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

GD32VF103CBT6使用C++编译无法设置中断是为什么?如何解决?

问题硬件: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)

何珊

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

更多回帖

发帖
×
20
完善资料,
赚取积分