谷动谷力

 找回密码
 立即注册
查看: 1732|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-11-25 23:49:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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。



+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-5-19 15:31 , Processed in 0.089699 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表