OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 117|回复: 5

STC51之const的使用

[复制链接]

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
发表于 2017-10-31 17:23:50 | 显示全部楼层 |阅读模式
正点原子公众号
const是用来定义常量的,在编译后应该是一个确定值的常量,并且在定义时应加上数据类型。而#defin则是用来做符号替换。
如:const int a=3;表示a的值为整型常量3.
#defin a 3表示你写的c或是h文件中的a会被3取代。
那么const怎样使用能更好的优化代码呢?
下面是STC的定时器例程:
/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC89-90xx Series 16-bit Timer Demo -------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

/* define constants */
#define FOSC 11059200L

#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

/* define SFR */
sbit TEST_LED = P1^0;               //work LED, flash once per second

/* define variables */
WORD count;                         //1000 times counter

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
    if (count-- == 0)               //1ms * 1000 -> 1s
    {
        count = 1000;               //reset counter
        TEST_LED = ! TEST_LED;      //work LED flash
    }
}

//-----------------------------------------------

/* main program */
void main()
{
    TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
    count = 0;                      //initial counter

    while (1);                      //loop
}


编译后生成代码量:Program Size: data=19.0 xdata=0 code=79
但是这里面 T1MS 会被(65536-11059200L/12/1000)取代,这样虽然生成的代码量小,但程序运行过程中占用CPU时间很多,
我们更改一下代码,把代码改成如下:
/* define constants */
#define FOSC 11059200L
const int T1MS=(65536-FOSC/12/1000);
//#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

再生成的代码量:Program Size: data=21.0 xdata=0 code=216
我们再更改一下代码,把代码改成如下:
/* define constants */
#define FOSC 11059200L
const int T1MS=921;//(65536-FOSC/12/1000);
//#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

再生成的代码量:Program Size: data=21.0 xdata=0 code=216
证明T1MS在编译过程中已经把921给计算出来并将其代入程序内了。
这样的话T1MS就不会在程序里面再进行计算,从而减少了运行时间。
回复

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-10-31 20:28:01 | 显示全部楼层

#define T1MS (65536-FOSC/12/1000) 也不是在运行时计算的,而是在编译的时候转换为立即数,
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-11-1 01:34:29 | 显示全部楼层
zhxzhx 发表于 2017-10-31 20:28

#define T1MS (65536-FOSC/12/1000) 也不是在运行时计算的,而是在编译的时候转换为立即数,

你的意思在这里用CONST没有意义?
回复 支持 反对

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-11-1 04:42:56 | 显示全部楼层
l6931639 发表于 2017-11-1 01:34
你的意思在这里用CONST没有意义?

首先,const定义的是变量,虽然不能改变,但他还是变量,宏定义的是立即数,这个在预处理的时候就被编译器替换了,你看一下对应的汇编就知道了,是两个不同概念的东西。另外,在51里定义在ROM里的不变的数据一般用CODE关键字。
回复 支持 反对

使用道具 举报

  离线 

8

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-21
在线时间
193 小时
 楼主| 发表于 2017-11-1 12:01:22 来自手机 | 显示全部楼层
code的数据是存在程序空间,不占用内存,const的数据是初始化存在内存中,从汇编哪里到const和#defin都成了立即数,但优化等级高的情况下#defin容易出现程序乱跳,请问这是什么原因
回复 支持 反对

使用道具 举报

  离线 

2

主题

149

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2013-6-5
在线时间
65 小时
发表于 2017-11-1 19:10:33 | 显示全部楼层
l6931639 发表于 2017-11-1 12:01
code的数据是存在程序空间,不占用内存,const的数据是初始化存在内存中,从汇编哪里到const和#defin都成了 ...

#difine 和优化没有一点关系,严格讲,宏定义甚至都不是C语言的一部分,但是用define要主要不要和其他的部分相互作用产生异议,好的习惯是加一个括号。
另外,你CONST定义也是要占用ROM的,既然不改了,就只占用ROM好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-20 21:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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