乐于分享
好东西不私藏

两次救场之后,我终于承认:这个AI编程助手有两下子

两次救场之后,我终于承认:这个AI编程助手有两下子
我第一次安装Reasonix,纯粹是被一个功能吸引:它不需要你把代码一段段贴到对话框里,而是能自己找到项目所在的文件夹,通读整个工程。但装完之后,我基本没用过。说实话,作为一个写了十几年单片机的老程序员,我一直觉得AI写代码不靠谱,它懂什么中断向量表?知道什么时序约束?
直到发生了两件事,我才觉得这家伙是真有两下子。
第一件,来自一家我已经离职很多年的公司。
他们突然联系我,说以前我设计的一款产品需要增加一个功能。那是一款基于dsPIC64GP206单片机的项目。我一听就犯了难:虽然当年是我一手开发的,但我现在的工作根本用不到这款芯片,相关的寄存器、外设配置早就忘得差不多了,而且手边连开发工具都没有。
碍于情面,我只说"我试试看"。拿到源代码后,我下载了一套MPLAB X IDE,打开工程,盯着满屏的代码发呆,好半天才回忆起那些控制功能,但要立即开始敲代码,还真不知从哪下手。
突然想到了Reasonix。死马当活马医吧。
我告诉它项目在哪个文件夹,原来的功能是什么,想增加什么功能,然后按下了发送按钮。
接下来的一幕让我印象深刻: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、改改代码片段,没敢把从架构设计到代码编写都交给它。毕竟,它要是写出一堆我看不懂的东西,最后弄得失控,麻烦的还是我。就像现在的电车,虽然都号称有自动驾驶,但方向盘还是握在自己手里更放心。