鸣涧 发表于 2022-11-25 23:49:24

MCU应用总结 Nuvoton篇之 使用SDCC编译器开发N76E003 (上)g环境.....

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 __codeCODE;
#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。



页: [1]
查看完整版本: MCU应用总结 Nuvoton篇之 使用SDCC编译器开发N76E003 (上)g环境.....