本帖最后由 cdhigh 于 2021-7-21 22:14 编辑
最近空闲时间比较多,就随便找点事做,想起之前做的M8V7 数字电源,每次修改源码都需要打开Windows XP 虚拟机,使用ICCV6.31A 编译,比较麻烦,一直都想移植到ICCV7.22 ,ICCV7.22 可以在Windows7 和Windows10 下运行,如果可以的话,以后就比较方便了。
M8V7 的源码无法在ICCV7 下编译的原因是因为M8 的FLASH 空间太小,已经全部用完,所以GandF将很多函数都转换为内嵌汇编,并且“很抠”的连保存恢复寄存器的函数都使用ICC “未公开”的内部实现函数,而ICCV7 修改了这些内部实现函数的函数名,导致ICCV7 无法编译M8V7 的源码,编译报错信息:undefined symbol 'push_gset1' .
我写了简单的测试代码,分别使用两个ICC版本编译,然后整理出了这些函数的对应关系,见表格:
ICCV6 | | | | | | ICCV6仅保存R21/R20,ICCV7保存R23-R20 | | | | | | | | | | | | | | | ICCV6仅保存R11/R10,ICCV7保存R13-R10 | | | | | | | | | | | | | | | | | | | | | 保存R17/R16(函数前两个byte参数,int则为第一个参数) | | | 保存R19-R16(函数前四个byte参数,int则为前两个参数) | | | 保存R31/ 30/ R27-R24/ R19-R16/ R9-R0/ | | | | ICCV6仅恢复R20/R21,ICCV7恢复R10/R11/R20/R21 | | | | | | | | | ICCV6仅恢复R10/R11,ICCV7恢复R10-R13 | | | | | | | | | | | | | | | | | | | | | 恢复R31/ 30/ R27-R24/ R19-R16/ R9-R0/
|
根据表格对应关系,修改GandF的源码,修改对应如下: - asm("rcall push_gset1"); -- asm("rcall push_xgsetF000");
- asm("rcall push_gset2"); -- asm("rcall push_xgsetF000");
- asm("rcall push_gset3"); -- asm("rcall push_xgsetF00C");
- asm("rcall push_gset4"); -- asm("rcall push_xgsetF03C");
- asm("rcall pop_gset1"); -- asm("rcall pop_xgsetF000");
- asm("rcall pop_gset2"); -- asm("rcall pop_xgsetF000");
- asm("rcall pop_gset3"); -- asm("rcall pop_xgsetF00C");
- asm("rcall pop_gset4"); -- asm("rcall pop_xgsetF03C");
复制代码
然后打开ICCV722项目配置对话框 1. 设置好include/lib路径。 2. 点选:"Treat 'const' as '__flash'", "Code Compression"和 "MIO Global Optimizations" 为什么要选代码压缩,是因为ICCV7生成的代码比ICCV6的大,导致空间不够报错。 3. 编译过程还有一个错误,提示uart.c有未终结的注释段,删除其文件末尾的注释段即可。
Rebuild All成功。 刚完成,偷懒不想拆开电源重新下载程序,所以现在只是编译通过,实际运行是否一致还未可知。
对的,这个修改方法也适用于M8V6电子负载。
最后附上ICC这些内部函数的实现源码,可以参考。
|