打印
[应用方案]

C51代码优化

[复制链接]
1048|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
macpherson|  楼主 | 2024-7-16 02:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。本文中该问题,提出了三种不同于原文的解决方法。每种方法都比较直接和简单,设计也更规范。【KEIL C51代码优化详细分析】在嵌入式软件开发中,Keil C51是一款常用的微控制器编程工具,特别适用于8051系列的单片机。然而,在实际应用中,开发者可能会遇到一些意料之外的问题,特别是在代码优化方面。本文将探讨一个关于反复连续读取同一端口的优化问题及其解决方案。问题源于Keil C51的编译器优化设置。在默认情况下,编译器启用了一定级别的优化,包括死代码删除、数据覆盖、微孔优化、寄存器变量、公共子表达式消除、循环旋转、扩展索引访问优化、公共入口代码重用和公共块子例程等。在某些情况下,这些优化可能导致编译器错误地删除看似重复但实际上必要的代码,例如对同一端口的连续读取。在特定案例中,开发者试图连续读取地址0x8000处的外设数据。初始定义如下:```cunsigned char xdata MAX197 _at_ 0x8000;```编译器可能基于优化策略,认为第二次读取是冗余的,从而省略了它。为了解决这个问题,本文提出了三种方法:1. **关闭编译优化**:最直接的方法是在项目设置中将编译优化级别设为0,即不进行优化。这可以通过选择“Project”窗口的“Target”,然后在“Options for Target”设置对话框的“C51”选项卡中,将“Code Optimization”的“Level”设为“0: Constant folding”。这样,编译器将不再删除重复的读取操作。2. **使用`volatile`关键字**:更优雅的解决方案是使用`volatile`关键字,指示编译器每次读取都是必要的,即使它们看起来是重复的。修改变量定义如下:```cunsigned char volatile xdata MAX197 _at_ 0x8000;```或者,通过包含系统头文件`<absacc.h>`,并定义为直接地址:```c#define MAX197 XBYTE[0x8000]```这样,高级优化可以保持不变,同时避免了编译器对读取操作的优化。3. **硬件层面的改进**:如果硬件允许,可以修改电路设计,增加一个地址线来区分高低字节的读取。例如,使用P2.0作为A8,连接到MAX197的5脚(HBEN),然后定义两个不同的地址:```cunsigned char volatile xdata MAX197_L _at_ 0x8000;unsigned char volatile xdata MAX197_H _at_ 0x8100;```这样,原先的读取代码:```cMAXHBEN = 0; down8 = MAX197; // 读取低8位MAXHBEN = 1; up4 = MAX197; // 读取高4位```可以改写为:```cdown8 = MAX197_L; // 读取低8位up4 = MAX197_H; // 读取高4位```总结来说,理解编译器的优化行为对解决问题至关重要。Keil C51虽然在编译效率和问题解决方面表现出色,但在某些特定情况下,开发者仍需关注优化可能导致的问题。通过阅读和理解编译后的汇编代码,不仅可以解决眼前的问题,还可以提高对汇编语言编程的理解,进一步提升软件开发能力。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

1625

帖子

1

粉丝