我第一次安装Reasonix,纯粹是被一个功能吸引:它不需要你把代码一段段贴到对话框里,而是能自己找到项目所在的文件夹,通读整个工程。但装完之后,我基本没用过。说实话,作为一个写了十几年单片机的老程序员,我一直觉得AI写代码不靠谱,它懂什么中断向量表?知道什么时序约束?他们突然联系我,说以前我设计的一款产品需要增加一个功能。那是一款基于dsPIC64GP206单片机的项目。我一听就犯了难:虽然当年是我一手开发的,但我现在的工作根本用不到这款芯片,相关的寄存器、外设配置早就忘得差不多了,而且手边连开发工具都没有。碍于情面,我只说"我试试看"。拿到源代码后,我下载了一套MPLAB X IDE,打开工程,盯着满屏的代码发呆,好半天才回忆起那些控制功能,但要立即开始敲代码,还真不知从哪下手。我告诉它项目在哪个文件夹,原来的功能是什么,想增加什么功能,然后按下了发送按钮。接下来的一幕让我印象深刻:Reasonix立即开始忙活,界面上状态不断切换:我将信将疑地编译生成HEX文件,发给前公司,特意补了一句:"改好了,但不保证完全正确,你们烧到芯片里试试“。说实话,真没抱多大希望。现在供职的公司交给我一个其他人开发的单片机项目,让我修改其中一个功能。这是成熟项目,只改一个功能,我很快就改完并调试通过了。但最后要与IAP程序配合时,出了岔子:先烧写Bootloader,再烧写我的程序,IAP功能死活出不来。intmain(void){#if (OS_TASK_NAME_EN > 0) INT8U err;#endif#ifdef ENABLE_IAP NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);#endif __set_PRIMASK(0); // 开启全局中断 __ASM("CPSIE I"); CPU_IntDis(); OSInit(); /* Initialize "uC/OS-II */ // ..... 其它代码}
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
这条指令就是把APP程序入口地址的偏移量设置成0x8000。问题一定不在这里,而且这是成熟产品的代码,那问题肯定出在我自己改的那部分。又一次想到了Reasonix。我告诉了它项目路径,描述了我遇到的困惑,按下发送。"NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000) 设置程序入口地址是有条件的,必须 ENABLE_IAP 为1。但我查了整个项目,ENABLE_IAP 没有地方被赋值,所以这条指令根本没执行。"看到 ENABLE_IAP 的那一刻,我脑子里嗡了一下。这个宏定义从项目一打开就在我眼前,我却在中断向量、链接脚本、烧写地址里翻了整整一下午。说白了,我盯着答案找了一下午的答案。话说回来,Reasonix确实令我佩服。这么大的项目,它居然能精准定位到这个宏定义没有被赋值。经过这两件事,我的习惯变了:现在每当我完成一个项目,都要让Reasonix帮我过一遍,查查有没有问题。然而,到目前为止,我也只让它帮我查查Bug、改改代码片段,没敢把从架构设计到代码编写都交给它。毕竟,它要是写出一堆我看不懂的东西,最后弄得失控,麻烦的还是我。就像现在的电车,虽然都号称有自动驾驶,但方向盘还是握在自己手里更放心。