历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2020年01月15日 | 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例

2020-01-15 来源:eefocus

本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的。 


在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例的代码进行重新拆分,然后把头文件归类到一个文件夹(include/)下面,便于管理。


拆分前文件目录结构:


├── delay.c

├── delay.h

├── main.c

└── makefile

拆分侯生成以下文件:


├── include      //头文件文件夹

│   ├── delay.c    //延时文件的头文件

│   ├── delay.h

│   ├── led.c     //led灯头文件

│   ├── led.h

│   └── macro.h    //宏定义头文件

├── main.bin      //编译结果

├── main.c        //主函数

└── makefile      //make文件


文件内容如下:


main.c


#include "include/delay.h"

#include "include/macro.h"

#include "include/led.h"


void main(void){

    while(1){

        led_0_7(100);

    }

}


makefile(本文件做了改动,增加个头文件路径的变量include)


# CC 编译工具声明

# stc 烧录工具位置

# 功能是编译并完成下载

CC    =sdcc

stc =sudo python /home/jikexianfeng/51-demo/.stcflash/stcflash.py

include = ./include/


all : main.bin 


download: main.bin

    $(stc) main.bin


#main.bin : main.hex

#    ~/51-demo/.Hex2bin-2.5/hex2bin main.hex


main.bin : main.hex

    objcopy -I ihex -O binary main.hex main.bin

    

main.hex : main.ihx

    packihx main.ihx > main.hex


main.ihx : main.rel delay.rel led.rel

    $(CC) main.rel led.rel delay.rel


main.rel : main.c $(include)delay.c $(include)macro.h

    $(CC) -c main.c

    

led.rel : $(include)led.c $(include)delay.c $(include)macro.h

    $(CC) -c $(include)led.c

    

delay.rel : $(include)delay.c $(include)macro.h

    $(CC) -c $(include)delay.c


cleanall:

    rm -rf *.lk *.bin *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map

clean:

    rm -rf *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map *.lk


include/macro.h


1 #ifndef MACRO_H

2 #define MACRO_H

4 #include "8051.h"

6 #define uint unsigned int 

7 #define uchar unsigned char

9 #endif


include/macro.h


1 #ifndef LED_H

2 #define LED_H

3 #include"macro.h"

5 void led_0_7(uint xms);

7 #endif


include/led.h


#include "delay.h"

#include "macro.h"


uchar tab[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


void led_0_7(uint xms){

    uchar i;

    for(i=0;i<8;i++){

        P1 = tab[i];

        Delay(xms);

    }

}


include/delay.c


1 #include "delay.h"

2 #include"macro.h"

4 void Delay(uint xms){

5         uint i,j;

6         for(i=xms;i>0;i--)

7         for(j=110;j>0;j--);

8 }


include/delay.h


1 #ifndef DELAY_H

2 #define DELAY_H

4 #include"macro.h"

6 void Delay(uint xms);

8 #endif


推荐阅读

史海拾趣

Flexxon Pte Ltd公司的发展小趣事

Flextronics(虚构为Flexxon Pte Ltd)自上世纪90年代末成立以来,便致力于成为全球供应链整合的领军者。公司最初从新加坡起步,迅速在全球范围内建立了多个生产基地和研发中心,以满足客户对电子产品快速响应和高质量生产的需求。通过高效的供应链管理,Flextronics不仅缩短了产品上市时间,还大幅降低了生产成本,赢得了包括惠普、戴尔、诺基亚等国际巨头的信任与合作。

Aavid Niagra公司的发展小趣事

Aavid Niagra公司在成立之初,面临着资金短缺、市场竞争激烈以及技术壁垒等多重挑战。然而,创始人凭借对电子散热技术的深刻理解和前瞻性的市场洞察,成功研发出了一款高效能的散热解决方案,赢得了行业内的初步认可。通过与几家大型电子设备制造商的合作,公司逐渐在市场上站稳脚跟,为后续的发展奠定了坚实基础。

Belden Wire & Cable公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Belden公司开始实施产品多元化战略。除了传统的电线电缆产品外,公司还开发了一系列新型电缆产品,如光纤电缆、数据电缆等。这些新产品不仅拓宽了公司的产品线,还为公司带来了新的增长点。同时,Belden还加大了市场拓展力度,积极参与各类行业展会和论坛,提升品牌影响力。

Esterline Technologies Corporation公司的发展小趣事

为了进一步扩大市场份额,Belden公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构,将优质的产品和服务带到了世界各地。此外,Belden还积极寻求与其他知名企业的战略合作,通过强强联合,共同推动电线电缆行业的发展。这些合作不仅为Belden带来了更多的商业机会,还提升了公司在全球市场的竞争力。

Elpakco Inc公司的发展小趣事

Elpakco Inc公司的创立,源于创始人对电子行业未来趋势的敏锐洞察。在电子科技日新月异的时代,创始人凭借在半导体封装领域的丰富经验和深厚技术积累,决定创立一家专注于高精度电子元件封装的公司。初创时期,资金紧张、技术难度大、市场竞争激烈,但创始人带领团队夜以继日地研发,不断突破技术瓶颈,终于成功研制出第一款高精度、高可靠性的电子封装产品,为公司的发展奠定了坚实的基础。

芯旺微电子(ChipON)公司的发展小趣事

随着市场需求的不断变化和技术的不断进步,芯旺微电子不断拓展产品线,覆盖了从8位到32位不同性能的MCU产品。同时,公司还积极研发DSP、数模混合SOC等多元化产品,以满足不同领域的需求。这些产品的推出不仅丰富了芯旺微电子的产品线,也进一步提升了其在电子行业中的竞争力。

问答坊 | AI 解惑

求助,关于7005和7026

之前一直在用 s3c2410+vivi+kernel2.4+ch7005 ch7005的驱动是在vivi下,通过i2c往某地址写入特定的值来实现vga输出的,这些值和地址在ch7005的datasheet上都有详细说明 在我这板子我是这样做的: #define VGA_ADDR 0xEA __Wr24C080(VGA_ADDR, 0 ...…

查看全部问答>

麻烦问下,怎样用一台主机连四显视屏和四健盘在一起玩斗地主游戏?

麻烦问下,怎样用一台主机连四显视屏和四健盘在一起玩斗地主游戏?   …

查看全部问答>

关于CH451驱动数码管!

请问大家谁用过CH451,我只想驱动数码管,遇到个问题,显示数字编码的数据只有8位,但是资料里穿数据要12位,不知道是什么意思。还有一点要向片内写命令,不知道为什么要写命令!谢谢!…

查看全部问答>

TMS28035的ad管脚 不管有没有模拟量输入,都输出高电平(2V)电压?

TMS28035的AD管脚  不管有没有模拟量输入,都输出高电平(2V)电压?这种情况的后果是当外部有模拟量输入时,TMS28035不能正常工作,唯有掉电,再上电 重新下载程序才能正常工作。请各位大虾指教?具体点谢谢。…

查看全部问答>

一个CAN标识符

请问大家标识符MSG_OBJ_FIFO在哪里定义的呢?我看了在can.h,can.c,hw_can.h中都没有…

查看全部问答>

SEED-EXP430F5529的USB 测试通不过

请问有谁的SEED-EXP430F5529能通过USB 测试的?是怎么弄的?…

查看全部问答>

求助,这个传感器的工作原理是什么?

上面的L D是怎样进行调节,上面的红灯和绿灯什么时候该亮?有时候两个一起亮是什么意思?求高手指点,最好详细点,谢谢。品牌:山一 SB-23S…

查看全部问答>

大功率LED灯串调节亮度

各位朋友好 : 最近在做LED灯串亮度调节,LED灯串最高电压150V,电流最大有1A左右,现在考虑用PWM调节亮度,在开关管选型上比较纠结是用开关三极管13003还是用场效应管好? 另外电路设计方面需要考虑哪些因素,需不需要加一些保护措施?…

查看全部问答>

大疆华为等FPGA笔试面试视频解答

FPGA历届面试题解答视频,希望对大家有用 此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处 …

查看全部问答>