赞
踩
SDCC中51寄存器的定义与Keil的不同。为了与Keil保持兼容性,将SDCC的关键字做一些定义,可以通过EIDE创建一个blink例程,然后里面会有一个reg52.h,拷贝这个文件并添加自己选择的MCU额外定义的寄存器即可。
SDCC的sfr和sbit的定义方式与Keil的不同。这里采用宏定义的方式定义好这2个关键字。
- #ifdef __SDCC
- #define SFR(reg, addr) __sfr __at(addr) reg
- #define SBIT(reg, addr) __sbit __at(addr) reg
- #else//Keil
- #define SFR(reg, addr) sfr reg = addr
- #define SBIT(reg, addr) sbit reg = addr
- #endif //End of __SDCC
__SDCC是SDCC编译器自带的宏定义,else对应的是Keil的写法。以P0口的定义为例:
- SFR(P0, 0x80);
- SBIT(P00, 0x80 + 0);
- SBIT(P01, 0x80 + 1);
- SBIT(P02, 0x80 + 2);
- SBIT(P03, 0x80 + 3);
- SBIT(P04, 0x80 + 4);
- SBIT(P05, 0x80 + 5);
- SBIT(P06, 0x80 + 6);
- SBIT(P07, 0x80 + 7);
对于sfr16(sfr32同类)
- //SDCC
- #define SFR16(reg, addr) __sfr16 __at(addr | (((uint16_t)addr + 1) << 8)) reg
- //Keil
- #define SFR16(reg, addr) sfr16 = reg
注意,这里直接编译的话会有一个编译错误,需要包含stdint.h文件,即
#include <stdint.h>
- #define reentrant __reentrant
- #define compact
- #define small __near
- #define large __far
- #define data __data
- #define bdata
- #define idata __idata
- #define pdata __pdata
- #define xdata __xdata
- #define code __code
- #define interrupt __interrupt
- #define using __using
- #define _at_ __at
- #define _priority_
- #define _task_
对于SDCC来说,中断函数必须要在main函数所在文件内有申明。
比如我的工程中main函数在app.c中,EIDE中配置:
然后在app.c中添加
- #ifdef __SDCC
- void uartIsr(void) __interrupt 4;
- void timer0Isr(void) __interrupt 1;
- #endif
如果没有做一步,编译没有问题,运行后你会发现中断一直没有进。
EIDE无法直接修改输出路径,可以采用编译后运行脚本实现。
mkdir创建一个文件夹,可以通过${OutDir}来指定相对路径。当目录存在时不会创建。
多个命令之间通过'&'来连接。
copy命令拷贝文件到指定的文件夹(mkdir创建的目录)。
del原来位置的所有文件。
完整命令如下:
mkdir "${OutDir}\..\..\..\..\..\..\..\..\output\stc89c52" & copy /B "${OutDir}\*.*" "${OutDir}\..\..\..\..\..\..\..\..\output\stc89c52" & del /s/q "${OutDir}\*.*"
依然在“构建器选项”里面设置
--iram-size:设置内部ram(data+idata)大小。
--xram-size:设置外部ram大小。
--code-size:设置代码区大小。
SDCC支持4中编译模式:--model-small、--model-medium、--model-large、--model-huge。
--model-small:所有变量都被定义在单片机的片内RAM中,对这种变量的访问速度最快。与定义变量时指定data存储器类型具有相同效果。
--model-medium:所有变量被定义在分页寻址的片外XRAM中,每一页片外XRAM的长度为256字节:即所有变量存储在片外XRAM的某一页中,与Keil的COMPACT一样。与定义变量时指定pdata存储器类型具有相同效果。
--model-large:所有变量被定义在片外XRAM中(最大可达64KB),这种编译模式对数据访问的效率最低,而且将增加程序的代码长度。与定义变量时指定xdata存储器类型具有相同效果。
--model-huge:将所有函数编译为banked,其他和large一样。
添加位置和第6点一样,如下图改为medium模式:
编译完成查看mem文件可以看到PAGED EXT. RAM有变化。
- Other memory:
- Name Start End Size Max
- ---------------- -------- -------- -------- --------
- PAGED EXT. RAM 0x0001 0x004d 77 256
- EXTERNAL RAM 0x004e 0x005d 16 256
- ROM/EPROM/FLASH 0x0000 0x11d6 4567 8192
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。