APP下载

编译器优化造成上注代码部分功能失效分析

2018-11-14山东航天电子技术研究所都晓辉曹振兴

电子世界 2018年20期
关键词:编译器赋值级别

山东航天电子技术研究所 都晓辉 曹振兴

本文介绍了一种以80C32E为核心,具备上注功能的单片机系统,软件在编译生成上注代码后,上注代码在EEPROM运行异常情况,通过对上注代码运行异常进行分析研究,最终找出由于编译器优化造成部分功能失效的原因,并进行了总结。

1.概况

某单片机程序采用固化程序加上注代码的执行模式,若软件发现问题可通过上注代码对部分代码功能进行更改,本案例说明由于在对上注代码的制作过程中编译器优化造成上注代码执行部分功能失效的问题。硬件框图见图1;

图1 硬件框图

80C32系统的硬件结构如图1所示,包括单片机80C32、ROM、RAM、EEPROM1、EEPROM2和总线接口。ROM、RAM、EEPROM1、EEPROM2和总线接口均与单片机80C32互连。80C32系统上电后运行ROM中的固化程序,根据需要,可通过总线接口向80C32系统发送上注程序,并将上注程序写入EEPROM1、EEPROM2和RAM中,当系统接收到执行上注程序的指令后,执行EEPROM中的上注程序。

2.故障现象

某软件在按照部门的统一要求将上注代码做成完全上注模式后确认测试时发现在运行上注程序时,发现部门程序功能失效,运行结果和预期不一致。

注:完全上注模式,将在固化程序中出现的软件功能在上注代码中全部实现。在上注代码制作过程中将主程序中MAIN函数中出现的函数、变量、标志等定位到与固化程序相同的地址上,所出现的函数只保留函数皮(函数中无内容),程序切换到上注执行模式后将跳至上注代码模块。

3.故障原因

上注代码中选用主程序中的相应功能代码,注入到上注程序区。为了进一步分析问题将上注代码上注后将EEPROM中的数据读出,与上注的代码进行比对,通过比对发现两者一致,排除代码上注的过程中某环节出现问题将上注代码改写的情况。进而对固化程序和上注代码的C和编译生成的汇编代码进行检查比对如下。

表1 上注代码C程序及对应汇编

表2 固化程序中C代码及对应汇编

通过比对发现固化程序比上注程序在退出函数后将DPTR的值进行了重新赋值(恢复到标志位的地址)而上注代码部分则无。(粗斜体部分)

在固化程序中对JMJDataPack()、XJDataPack()、GPSDataPack()三模块进行查看发现在函数内多次对DPTR的值进行改写,退出后对DPTR的值进重新赋值,而在上注程序运行的过程中调用固化程序相应的模块,结果跳出相应的模块后,DPTR的值未重新赋值,将对应的错误的地址值进行改写,未能实现正确的标志位改变功能,致使出现相对应的功能实现不了,在此过程中编译器编译出了问题。

分析和试验发现编译器在编译固化程序时由于JMJDataPack()、XJDataPack()、GPSDataPack()函数中多次将DPTR的值进行改写,因此在退出上述函数后编译器将标志位的地址重新赋值给DPTR,再对该地址的值进行修改,而编译器在编译上注程序时由于上述函数使用的是空函数(上注程序中函数对应的地址与固化程序一一对应,无函数内容),没有对DPTR进行更改,配置环境在8级优化的情况下编译器在编译的过程中将优化处理(“窥孔”优化,不必要的从存储器装入对象及装入常数的操作)不对DPTR 的值进行重新赋值,造成上述现象的发生。在“Options选项/C51标签页/Code Optimization栏/Leve框”内选取优化级别。OPTIMIZE命令设置优化级别和优化重点,共有9个优化级别,高优化级别中包含了前面所有的底优化级别。

现在的程序编译过程中均采用8级优化,由于高优化级别中包含了前面所有的底优化级别,因此编译器在对上注代码模块编译时将重复的DPTR赋值操作去掉,造成上述现象的发生。

4.解决措施

针对该问题有目前三种解决方法:

当前固化程序和上注代码KEILC在环境配置时选用的8级优化,将上注代码环境配置优化级别选为2级,即不对代码进行“窥孔”优化。

更改上注代码如下:

将fgYKManage = FALSE; fgGBManage = FALSE;分别放到XJDataPack()和GPSDataPack()函数内。

5.总结

在使用相应的工具进行编程时,尤其是对具有代码优化功能的编译软件的环境配置应特别注意,其某些优化功能可能会造成对某些代码的功能出错,在用之前一定要对相应的优化内容和规则有深刻了解。在代码完成后还要加强代码的各项确认测试工作,认真核对每一项功能是否有偏差,仔细认真的比对每一项指标。

猜你喜欢

编译器赋值级别
L-代数上的赋值
痘痘分级别,轻重不一样
基于相异编译器的安全计算机平台交叉编译环境设计
强赋值幺半群上的加权Mealy机与加权Moore机的关系*
迈向UHD HDR的“水晶” 十万元级别的SIM2 CRYSTAL4 UHD
新年导购手册之两万元以下级别好物推荐
你是什么级别的
利用赋值法解决抽象函数相关问题オ
通用NC代码编译器的设计与实现
P2×Cn的友好标号集