一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 1197|回复: 11
收起左侧

[avr] 让M8V7数字电源源码可以在Windows7/Windows10下编译(适配ICCV7.22)

[复制链接]
发表于 2021-7-18 20:14 | 显示全部楼层 |阅读模式
本帖最后由 cdhigh 于 2021-7-21 22:14 编辑


  最近空闲时间比较多,就随便找点事做,想起之前做的M8V7数字电源,每次修改源码都需要打开Windows XP虚拟机,使用ICCV6.31A编译,比较麻烦,一直都想移植到ICCV7.22ICCV7.22可以在Windows7Windows10下运行,如果可以的话,以后就比较方便了。


    M8V7的源码无法在ICCV7下编译的原因是因为M8FLASH空间太小,已经全部用完,所以GandF将很多函数都转换为内嵌汇编,并且“很抠”的连保存恢复寄存器的函数都使用ICC“未公开”的内部实现函数,而ICCV7修改了这些内部实现函数的函数名,导致ICCV7无法编译M8V7的源码,编译报错信息:undefined symbol 'push_gset1' .


  我写了简单的测试代码,分别使用两个ICC版本编译,然后整理出了这些函数的对应关系,见表格:

ICCV6
ICCV7
功能
入栈函数
push_gset1
push_xgsetF000
ICCV6仅保存R21/R20,ICCV7保存R23-R20
push_gset2
push_xgsetF000
保存R23-R20
push_gset3
push_xgsetF00C
保存R11/R10/R23-R20
push_gset4
push_xgsetF03C
保存R13-R10/R23-R20
push_gset5
push_xgsetF0FC
保存R15-R10/R23-R20
push_gset3x
push_xgset003C
ICCV6仅保存R11/R10,ICCV7保存R13-R10
push_gset4x
push_xgset003C
保存R13-R10
push_gset5x
push_xgset00FC
保存R15-R10
push_xgset300C
保存R21/R20/R11/R10
push_xgsetF0FC
保存R23-R20/R15-R10
push_xgset30FC
保存R21/R20/R15-R10
push_xgset303C
恢复R21/R20/R10-R13
push_arg2
push_arg2
保存R17/R16(函数前两个byte参数,int则为第一个参数)
push_arg4
push_arg4
保存R19-R16(函数前四个byte参数,int则为前两个参数)
push_lset
push_lset
保存R31/ 30/ R27-R24/ R19-R16/ R9-R0/
下面是对应的出栈函数
pop_gset1
pop_xgset300C
ICCV6仅恢复R20/R21,ICCV7恢复R10/R11/R20/R21
pop_gset2
pop_xgsetF000
恢复R20-R23
pop_gset3
pop_xgsetF00C
恢复R20-R23/ R10/R11
pop_gset3x
pop_xgset003C
ICCV6仅恢复R10/R11,ICCV7恢复R10-R13
pop_gset4
pop_xgsetF03C
恢复R20-R23/R10-R13
pop_gset4x
pop_xgset003C
恢复R10-R13
pop_gset5
pop_xgsetF0FC
恢复R20-R23/R10-R15
pop_gset5x
pop_xgset00FC
恢复R10-R15
pop_xgset30FC
恢复R10-R15/R20/R21
pop_xgset303C
恢复R21/R20/R10-R13
pop_lset
pop_lset
恢复R31/ 30/ R27-R24/ R19-R16/ R9-R0/




根据表格对应关系,修改GandF的源码,修改对应如下:
  1. asm("rcall push_gset1");     --   asm("rcall push_xgsetF000");

  2. asm("rcall push_gset2");     --   asm("rcall push_xgsetF000");

  3. asm("rcall push_gset3");     --   asm("rcall push_xgsetF00C");

  4. asm("rcall push_gset4");     --   asm("rcall push_xgsetF03C");

  5. asm("rcall pop_gset1");       --  asm("rcall pop_xgsetF000");

  6. asm("rcall pop_gset2");       --  asm("rcall pop_xgsetF000");

  7. asm("rcall pop_gset3");       --  asm("rcall pop_xgsetF00C");

  8. 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这些内部函数的实现源码,可以参考。
stack_func_v6_and_v7.rar (798 Bytes, 下载次数: 15)
ICCV6-ICCV7保存恢复寄存器汇编函数区别和替换.pdf (208.74 KB, 下载次数: 13)



发表于 2021-7-19 20:50 | 显示全部楼层
谢谢分享
发表于 2021-7-20 08:08 | 显示全部楼层
发表于 2021-7-20 08:34 | 显示全部楼层
谢谢分享
发表于 2021-7-20 21:33 | 显示全部楼层
辛苦了
发表于 2021-7-23 21:03 | 显示全部楼层
厉害了,M8V7我一直也是用虚机跑ICCV6编译的,不过不知道编译以后大小有差距么?还二进制内容是不是完全一样?

点评

V7编译大一些,这些保存恢复寄存器的函数实现细节有变化,功能一样,V6的内部实现更紧凑,V7的实现更模块化,代价就是多占一点空间。 从这几个函数的实现风格变化看,其他的库函数估计也改写了不少,估计其内部维护  详情 回复 发表于 2021-7-23 22:42
 楼主| 发表于 2021-7-23 22:42 来自手机 | 显示全部楼层
sln.1550 发表于 2021-7-23 21:03
厉害了,M8V7我一直也是用虚机跑ICCV6编译的,不过不知道编译以后大小有差距么?还二进制内容是不是完全一 ...

V7编译大一些,这些保存恢复寄存器的函数实现细节有变化,功能一样,V6的内部实现更紧凑,V7的实现更模块化,代价就是多占一点空间。
从这几个函数的实现风格变化看,其他的库函数估计也改写了不少,估计其内部维护很容易,不过代码会变大。
因为即使v6编译都只剩几十字节的空间了,所以在v7下需要打开“代码压缩”,否则编译不过。
如果不想代码压缩,可以去掉部分代码。

点评

V7开启压缩以后,能比V6的省多少空间?如果差不多的话,那用v7就没必要了  详情 回复 发表于 2021-7-24 11:01
发表于 2021-7-24 11:01 | 显示全部楼层
cdhigh 发表于 2021-7-23 22:42
V7编译大一些,这些保存恢复寄存器的函数实现细节有变化,功能一样,V6的内部实现更紧凑,V7的实现更模块 ...

V7开启压缩以后,能比V6的省多少空间?如果差不多的话,那用v7就没必要了

点评

研究这个的初衷是v7可以不用使用虚拟机, 压缩不是v7独有的, V6也可以使用代码压缩,  详情 回复 发表于 2021-7-24 18:32
 楼主| 发表于 2021-7-24 18:32 来自手机 | 显示全部楼层
sln.1550 发表于 2021-7-24 11:01
V7开启压缩以后,能比V6的省多少空间?如果差不多的话,那用v7就没必要了 ...

研究这个的初衷是v7可以不用使用虚拟机,
压缩不是v7独有的,
V6也可以使用代码压缩,
发表于 2021-8-13 16:58 | 显示全部楼层
牛人

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-24 01:16 , Processed in 0.077604 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表