当前位置:   article > 正文

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

sdcc sbit

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

1. 特殊寄存器命令

SDCC的sfr和sbit的定义方式与Keil的不同。这里采用宏定义的方式定义好这2个关键字。

  1. #ifdef __SDCC
  2. #define SFR(reg, addr) __sfr __at(addr) reg
  3. #define SBIT(reg, addr) __sbit __at(addr) reg
  4. #else//Keil
  5. #define SFR(reg, addr) sfr reg = addr
  6. #define SBIT(reg, addr) sbit reg = addr
  7. #endif //End of __SDCC

__SDCC是SDCC编译器自带的宏定义,else对应的是Keil的写法。以P0口的定义为例:

  1. SFR(P0, 0x80);
  2. SBIT(P00, 0x80 + 0);
  3. SBIT(P01, 0x80 + 1);
  4. SBIT(P02, 0x80 + 2);
  5. SBIT(P03, 0x80 + 3);
  6. SBIT(P04, 0x80 + 4);
  7. SBIT(P05, 0x80 + 5);
  8. SBIT(P06, 0x80 + 6);
  9. SBIT(P07, 0x80 + 7);

对于sfr16(sfr32同类)

  1. //SDCC
  2. #define SFR16(reg, addr) __sfr16 __at(addr | (((uint16_t)addr + 1) << 8)) reg
  3. //Keil
  4. #define SFR16(reg, addr) sfr16 = reg

 注意,这里直接编译的话会有一个编译错误,需要包含stdint.h文件,即

#include <stdint.h>

2. 存储类型

  1. #define reentrant __reentrant
  2. #define compact
  3. #define small __near
  4. #define large __far
  5. #define data __data
  6. #define bdata
  7. #define idata __idata
  8. #define pdata __pdata
  9. #define xdata __xdata
  10. #define code __code

3. 其他关键字

  1. #define interrupt __interrupt
  2. #define using __using
  3. #define _at_ __at
  4. #define _priority_
  5. #define _task_

4. 中断

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

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

 然后在app.c中添加

  1. #ifdef __SDCC
  2. void uartIsr(void) __interrupt 4;
  3. void timer0Isr(void) __interrupt 1;
  4. #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有变化。

  1. Other memory:
  2. Name Start End Size Max
  3. ---------------- -------- -------- -------- --------
  4. PAGED EXT. RAM 0x0001 0x004d 77 256
  5. EXTERNAL RAM 0x004e 0x005d 16 256
  6. ROM/EPROM/FLASH 0x0000 0x11d6 4567 8192

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号