Visual Studio Code + SDCC开发51单片机 2 - 特殊之处

SDCC中51寄存器的定义与Keil的不同。为了与Keil保持兼容性,将SDCC的关键字做一些定义,可以通过EIDE创建一个blink例程,然后里面会有一个reg52.h,拷贝这个文件并添加自己选择的MCU额外定义的寄存器即可。

1. 特殊寄存器命令

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>

2. 存储类型

#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

3. 其他关键字

#define interrupt __interrupt
#define using __using
#define _at_ __at
#define _priority_
#define _task_

4. 中断

对于SDCC来说,中断函数必须要在main函数所在文件内有申明。 

 比如我的工程中main函数在app.c中,EIDE中配置:

 然后在app.c中添加

#ifdef __SDCC 
void uartIsr(void) __interrupt 4;
void timer0Isr(void) __interrupt 1;
#endif

如果没有做一步,编译没有问题,运行后你会发现中断一直没有进。 

 5. 修改输出路径

EIDE无法直接修改输出路径,可以采用编译后运行脚本实现。

 

 mkdir创建一个文件夹,可以通过${OutDir}来指定相对路径。当目录存在时不会创建。

多个命令之间通过'&'来连接。

copy命令拷贝文件到指定的文件夹(mkdir创建的目录)。

del原来位置的所有文件。

完整命令如下:

mkdir "${OutDir}\..\..\..\..\..\..\..\..\output\stc89c52" & copy /B "${OutDir}\*.*" "${OutDir}\..\..\..\..\..\..\..\..\output\stc89c52" & del /s/q "${OutDir}\*.*" 

6. 修改MCU容量大小

依然在“构建器选项”里面设置

--iram-size:设置内部ram(data+idata)大小。

--xram-size:设置外部ram大小。

--code-size:设置代码区大小。

 7. 编译模式选择

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   

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Visual Studio Code中进行SDCC开发51单片机,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Visual Studio Code编辑器。你可以从官方网站上下载并安装它。 2. 打开Visual Studio Code,并在应用商店中搜索并安装EIDE扩展。这个扩展提供了对51单片机开发的支持和工具链。 3. 安装完EIDE扩展后,你可以打开一个新的项目或文件夹,在其中进行开发。你可以创建一个新的文件,编写SDCC的代码,并保存为.c格式。 4. 接下来,你需要配置EIDE扩展以支持SDCC工具链。你可以在Visual Studio Code的设置中找到扩展的配置选项,并添加SDCC的安装路径。这样EIDE扩展就能够调用SDCC编译器来编译你的代码。 5. 编写完成后,你可以使用EIDE扩展提供的命令进行编译和烧录。这个扩展还提供了调试功能,可以帮助你在Visual Studio Code中进行单片机代码的调试。 6. 如果你需要在Visual Studio Code中使用简体中文界面,你可以在应用商店中搜索并安装"Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code"扩展。 总结起来,通过安装Visual Studio Code编辑器,然后在应用商店中搜索并安装EIDE扩展,你就可以在Visual Studio Code中进行SDCC开发51单片机。通过配置扩展和编写代码,你可以使用SDCC工具链进行编译、烧录和调试操作。如果需要中文界面,可以安装相应的语言包扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值