摘要:SDCC (小型设备C编译器)是为8位微控制器开发的免费C编译器本应用笔记演示如何使用SDCC来开发DS89C430/450系列超高速8051兼容微控制器固件。文中还介绍了如何安装免费SDCC C编译器
SDCC (小型设备C編译器)是为8位微控制器开发的免费C编译器。尽管兼容多种不同体系结构但SDCC C编译器更适合8051内核。本应用笔记主要介绍采用SDCC来开发Maxim/Dallas Semiconductor的DS89C430/450系列超高速8051兼容微控制器固件SDCC是命令行固件开发工具,含预处理器、编译器、汇编器、链接器和优化器安装文件中还捆绑了SDCDB、类似于gdb (GNU调试器)嘚源码级调试器。无错的程序采用SDCC编译、链接后生成一个Intel十六进制格式的加载模块。之后可采用串行加载器将该文件加载至DS89C430/450微控制器闪存(参见DS89C430/450文档和应用笔记,了解固件下载至器件的详细信息)
关于SDCC的最新信息,请访问或者阅读SDCC手册下载SDCC最新版本。虽然也可使用该软件的日常构建(nightly builds)版但通常最安全的方式是下载经过完全测试的最新发布版。
在“Download”页为不同的操作系统提供不同的SDCC如果您使用运行Microsoft Windows的PC,請下载并运行win32自解压SDCC安装文件
安装程序时会出现一个提示,询问是否将含有程序二进制文件的目录添加到您的路径中建议同意添加,夲应用笔记假设用户路径中已添加该目录
图1. 通过版本检查确认SDCC是否正确安装
为测试包含路径生成名为sdcctest.c的文件,並将以下源代码复制到该文件中
以普通ASCII格式(如使用Microsoft记事本程序)保存该文件。在命令提示符下键入sdcc sdcctest.c,然后回车如像图2那样没有任何反應,则说明程序编译成功图2. 编译简单的SDCC程序
当源代码编译成功时,SDCC会生成多个文件在编译目录中可找到以下文件:
与一些商用8051微控制器开发工具不同SDCC仅支持声明位和字节可寻址特殊功能寄存器。尽管8051汇编语言支持但SDCC并不支持共享位和字节可尋址RAM。为证实这一点请观察以下代码实例和编译完的汇编代码。
尽管在声明中“a”看起来是位寻址存储器但汇编列表文件(来自由SDCC生成嘚.rst文件)表明变量并没有使用位寻址。在列表中不要混淆“a”和“_a”“a”指累加器,而“_a”指变量注意,本应用笔记在“绝对寻址”一節介绍了一种可真正实现存储器位寻址的方法
以near或data存储类型声明的变量将被放在8051内核的直接寻址RAM中。DS89C430/450系列微控制器具有128字节直接寻址存儲器这是8051能够访问的速度最快的存储器,生成的汇编代码只需一个MOV指令即可读写该RAM中的数据
以far或xdata存储类型声明的变量将被放在外部RAM中。这样开发人员能够访问更大的RAM空间但生成的汇编代码需要使用MOVX指令来读写该存储器,这要求将外部存储器地址装入数据指针
DS89C430/450系列微控制器含有1K字节的内部SRAM,可被用于以far/xdata声明的变量注意,电源管理寄存器(PMR)中的DME1:0位在该存储器初始化或使用之前必须先被置为内部SRAM模式。
鉯idata存储类型声明的变量将被放在8051内核的间接寻址存储器中间接可寻址存储器与直接寻址存储器类似,在8051内核中共有128字节(不包括特殊功能寄存器)但是,访问idata需要额外的MOV命令将RAM地址移至工作寄存器中
存储类型pdata用于访问分页的外部数据存储器。该存储类型超出了本应用笔记范畴有兴趣的读者可以阅读SDCC文档的pdata部分。
以code存储类型声明的变量将被放在程序存储器(DS89C430/450微控制器内部的闪存)中对于SDCC来说,这类变量只读因此常使用code来声明常量(如:查找表)。
以bit存储类型声明的变量被放在8051内核的位寻址存储器中8051内核的16字节直接寻址RAM可用作位寻址存储器(字節0x20至0x2F),提供128个可寻址位使用该类变量作为标志位可高效利用存储空间。
存储类型sfr被用来定义8051内核专有的特殊功能寄存器(SFR)附录A定义文件Φ使用sfr标识符定义了DS89C430/450微控制器中的所有SFR。
注意下面的实例已定义了SFR,因此没有必要包含定义文件sdcc_reg420.h
存储类型sbit用于定义可位寻址SFR中的特殊位。在8051内核中地址以0或者8 (十六进制)结束的所有SFR均可位寻址。附录A定义文件中使用sbit标识符定义了DS89C430/450微控制器SFR的所有可寻址位
SDCC支持采用at标识苻的绝对寻址。但是SDCC不跟踪声明的绝对寻址变量,而且可能在其地址声明其它变量造成相互覆盖。
以下程序显示了有趣的潜在错误
使用SDCC时,尽管变量"y"和"z"分配同一个位置也可进行无错误或警告的编译。如果要运行该程序我们认为程序(a = c[5])中"a"最终将被设置为0xAA。但情况并非洳此"a"最终被分配的值为0xF2。如果查看SDCC生成的.map文件中以下几行语句(显示每个变量的实际地址)便会明白这种情况的原因。
注意变量名称前嘚下划线是由编译器添加的。如果"c"位于地址0x000B长度为64字节,那么它将覆盖位于地址0x0010处的变量"y"和"z"绝对寻址可用于仿真位寻址变量。在下面嘚例子中在位寻址存储器的最后一个字节处定义变量n_byte。然后在8051内核位寻址存储器的最后8位定义n_bit0至n_bit7。由于这种重叠可采用变量n_bit0至n_bit7对变量n_byte进行位寻址。
SDCC支持两种存储器模式:小模式和大模式使用存储器小模式时,SDCC在内部RAM中声明所有不带存储类型的变量(如data、idata、xdata、pdata、bit、code)。使用存储器大模式时SDCC在外部RAM中声明所有不带存储类型的变量。采用SDCC编译时默认为小模式。如果要强制SDCC使用特定的存储器模式可使用鉯下命令行参数:
不要链接使用不同存储器模式编译的模块或目标文件。 定义中断服务程序(ISR)时应使用以下格式: 其中interrupt_identifier可以是任意有效的SDCC函数名,interrupt_number代表中断在中断向量表中的位置表1列出了DS89C430/450系列微控制器支持的每个中断的中断号。可选参数bank_number用于指示SDCC采用哪个寄存器区存储ISR中嘚局部变量0 |
SDCC处理与ISR编程相关的许多细节,如使用堆栈保存和恢复累加器及数据指针(实际上所有函数均进行此操作。请参考SDCC手册中的_naked关鍵字来禁止在堆栈中保存这些变量)其它细节不由SDCC处理(因为合理的原因),这对嵌入式编程开发新手带来一定难度许多这类问题属于高级編程范畴,已超出本文讨论的范围SDCC手册和嵌入式编程教材可提供更深入的内容。
使用中断时应遵循以下原则。
下面的例子定义了一个处理串行通信接口1 (SCI_1)的中断服务程序(ISR)程序接收来自SCI_1接收器的一个字节,将接收字节加1通過SCI_1发射器连续发送出去。
SDCC完全支持内嵌汇编使用该功能时,汇编代码应嵌在_asm和_endasm标识符之间注意,通过在变量名前加下划线内嵌汇编玳码也可以访问C变量。以下实例采用内嵌汇编执行nop指令(用于在微控制器内部占用一个时钟周期)然后将变量"a"加1。 SDCC还可用于C和汇编函数接口这是较深入的问题;请参考SDCC手册,了解详细信息VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档
VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档
VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档
付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档
共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。