因为一个子函数编译之后hex文件体积剧增

yangyang06020341 2010-04-30 10:10:24
#include <reg51.h>
#include <stdlib.h>
#include <math.h>

sbit SEG_1 = P1^0;
sbit SEG_2 = P1^1;
sbit SEG_3 = P1^2;
sbit SEG_4 = P1^3;

sbit SEG_a = P0^5;
sbit SEG_b = P0^7;
sbit SEG_c = P0^3;
sbit SEG_d = P0^1;
sbit SEG_e = P0^0;
sbit SEG_f = P0^6;
sbit SEG_g = P0^4;
sbit SEG_p = P0^2;

sbit CS = P3^5;
sbit CLK = P3^4;
sbit DO_I = P3^3;



void SEG_Delay(int i){
int j=0;
for(;i>0;i--){
for(j=0;j<10;j++)
{;}
}
}

void nop(int i){
while(i>0){
i--;
}
}

void Display_PreSet(void){
SEG_1 = 0;
SEG_2 = 1;
SEG_3 = 1;
SEG_4 = 1;
SEG_a=SEG_c=SEG_d=SEG_f=SEG_g=1;
SEG_b=SEG_e=SEG_p=0;
SEG_Delay(100);
SEG_1 = 1;
SEG_2 = 0;
SEG_3 = 1;
SEG_4 = 1;
SEG_a=SEG_b=SEG_c=SEG_d=SEG_e=SEG_d=SEG_f=SEG_p=1;
SEG_g=0;
SEG_Delay(900);
}

unsigned char ADC(int m1,int m2){
int i;
unsigned char dat;

DO_I=1;
nop(1000);
CS=0;
nop(1000);

CLK=1;
nop(1000);
CLK=0;
DO_I=m1;
nop(1000);

CLK=1;
nop(1000);
CLK=0;
DO_I=m2;
nop(1000);

CLK=1;
nop(1000);
CLK=0;
nop(1000);

for(i=0;i<8;i++){
CLK=1;
nop(1000);
CLK=0;
dat=(dat<<1)|DO_I;
nop(1000);
}
return dat;
}

//int char_to_int(unsigned char *dat){
// int datt=0,temp,i,j;
// temp=atoi(dat);
// for(i=0;i<8;i++){
// j=temp%10;
// datt+=pow(2,i)*j;
// temp/=10;
// }

//}

int main(void){
unsigned char flux_temp;
int flux;
Display_PreSet();
flux_temp = ADC(1,0);
//flux=char_to_int(&flux_temp);
return 0;
}

**************************************************************
高手们请看以上为我写的单片机显示预设值并读取ADC0832的C程序代码,而注释掉的部分为八位字符串如“10000011”转换为整型的子函数,为何有它的时候编译后hex也即16进制文件为8KB,注释掉后为几百个字节1KB都不到,我的片子只有4KB,所有头都大了,又如何解决呢?
...全文
126 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyang06020341 2012-03-07
  • 打赏
  • 举报
回复
谢谢大家问题解决了
xiaopoy 2010-04-30
  • 打赏
  • 举报
回复
本来是没用到math头文件中设置的 导入函数的,但那个子函数使用到了。因此它使得需要把math.h相关的库也链接进来,当此为一个静态链接库时,体积的增加很正常
mymtom 2010-04-30
  • 打赏
  • 举报
回复
不过从楼主的程序看,ADC返回的已经是整数了,不必转换啊。
brookmill 2010-04-30
  • 打赏
  • 举报
回复
int char_to_int(unsigned char *dat){
int datt=0,i;
for(i=0;i<8;i++){
if (dat[7-i] != '0')
datt += 1<<i;
}
return datt;
}
贪食蛇男 2010-04-30
  • 打赏
  • 举报
回复
这个有理[Quote=引用 3 楼 brookmill 的回复:]
楼主可以自己试一下:
先把char_to_int写成一个空函数,然后一行一行加代码、编译,看看加上哪一行之后体积剧增。
还有,这个int型函数怎么没有return?
[/Quote]
mymtom 2010-04-30
  • 打赏
  • 举报
回复
算你走运,我是做个单片机的。下面的程序又快又小。

#include <stdio.h>

int char_to_int(const unsigned char *buf)
{
int n;

n = 0;
n += *(buf++) == '1'? 0x80 : 0;
n += *(buf++) == '1'? 0x40 : 0;
n += *(buf++) == '1'? 0x20 : 0;
n += *(buf++) == '1'? 0x10 : 0;
n += *(buf++) == '1'? 0x08 : 0;
n += *(buf++) == '1'? 0x04 : 0;
n += *(buf++) == '1'? 0x02 : 0;
n += *(buf++) == '1'? 0x01 : 0;

return n;
}

int
main(int argc, char *argv[])
{
printf("%d\n", char_to_int("11111111"));
printf("%d\n", char_to_int("00001111"));
printf("%d\n", char_to_int("00000000"));
return 0;
}
mymtom 2010-04-30
  • 打赏
  • 举报
回复
我的乖乖,你用的是MS51啊,数学库当然大,软件模拟浮点运算,速度慢啊。
brookmill 2010-04-30
  • 打赏
  • 举报
回复
八位字符串如“10000011”是十进制的还是二进制的?
这个函数char_to_int的算法,我怎么看不明白呢?
brookmill 2010-04-30
  • 打赏
  • 举报
回复
楼主可以自己试一下:
先把char_to_int写成一个空函数,然后一行一行加代码、编译,看看加上哪一行之后体积剧增。
还有,这个int型函数怎么没有return?
brookmill 2010-04-30
  • 打赏
  • 举报
回复
先把 pow(2,i) 改成 1<<i 看看效果
cy330206 2010-04-30
  • 打赏
  • 举报
回复
楼主去单片机版块去问问

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧