MCU应用总结 Nuvoton篇之 使用SDCC编译器开发N76E003 (上)环境及文件准备
1 前言
1.1 说明
本文是应用工程师使用SDCC编译器对N76E003代码进行编译,对其经验进行总结。代码基于Nuvoton的NuTiny-SDK-N76E003 V2.1开发板(带调试器)。
由于时间仓促于及编写人员的经验限制,本文可能存在不当之处,敬请指正。
1.2 SDCC概述
SDCC(Small Device C Compiler)是一个优化的 ANSI - C交叉编译器,目标CPU为基于Intel 8051, Maxim 80DS390,Zilog Z80和Motorola 68HC08的单片机。
SDCC是免费开源的软件,依据GNU General Public License (GPL) 发布。
可通过网址 http://sdcc.sourceforge.net/获取进一步信息。
2 资源准备
2.1 环境准备
对于习惯使用IDE进行MCU开发的用户而言,使用SDCC开发时,建议的IDE为CodeBlock或TKStudio测试情况见表下表。
使用最新版本的CodeBlock+SDCC时,看门狗执行存在异常;使用较早版本的执行正常,关于CodeBlock下使用SDCC建立及编译工程可参考: https://blog.csdn.net/ouening/article/details/71547108。
若不想进行搭建CodeBlock环境、或者的担心版本问题,可使用内置SDCC的TKStudio(该软件已经停止开发维护,Full版本自带了编译器)。
2.2 源代码修改
若原来使用Keil等软件开发,在使用SDCC编译前需要对MCU的头文件及部分源代码进行修改(SDCC的sfr、sbit、bit、code及中断函数等语法存在差异)。
2.2.1 MCU头文件修改
1) 针对N76E003的头文件需要对特殊功能寄存的定义进行修改,修改语法参考如下:
原为:sfr EIPH1 = 0xFF;
改为:__sfr __at (0xFF) EIPH1;
2) 针对位寻址寄存器修改语法参考:
原为:sbit SM0_1 = SCON_1^7;
改为:__sbit __at (0xFF) SM0_1;
2.2.2 源代码中的修改
为保证代码在keil等环境及SDCC的环境下均可编译,我们使用预编译指令对源代码进行修改。
1) 针对中断函数,需要增加函数声明,参考格式如下示例:
#if C_SDCC
void Timer3_ISR (void) __interrupt 16;
#endif
2) 中断函数的定义可参考如下示例:
#if C_SDCC
void PinInterrupt_ISR (void) __interrupt 7
#else
void PinInterrupt_ISR (void) interrupt 7
#endif
3) bit变量修改可参考如下示例:
#if C_SDCC
typedef __bit BIT;
#else
typedef bit BIT;
#endif
4) CODE存储类型变量修改可参考如下示例:
#if C_SDCC
typedef __code CODE;
#else
typedef code CODE;
#endif
5)全局变量与循环语句的特殊情况:
volatile BIT Timer3_Delay_1MS_OV =0;
void delay_1ms_timer3()
{
Timer3_Delay_1ms =TIMER3_1MS_CNT;
Timer3_Delay_1MS_CTR =ENABLE;
Timer3_Delay_1MS_OV =0;
while(!Timer3_Delay_1MS_OV)
{
;
}
Timer3_Delay_1MS_OV =0;
Timer3_Delay_1MS_CTR =DISABLE;
}
另一个函数中对Timer3_Delay_1MS_OV进行修改,若Timer3_Delay_1MS_OV 未被声明为volatile,while(!Timer3_Delay_1MS_OV)语句会被优化,所以需要对该类型语句的变量修饰为volatile。
|