从Keil迁移到SDCC

2023-12-29 13:28
文章标签 keil 迁移 sdcc

本文主要是介绍从Keil迁移到SDCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

当前,在单片机开发领域,Keil是广泛被采用的开发工具。然而,其编辑器功能相较于现代的VScode显得相当陈旧和不足。过去,我也曾试验过使用platformIO,其核心理念是对SDCC和stcgal进行封装,从而提供一个更加集成的开发环境。

现在,我们将基于SDCC和stcgal来搭建一个全新的单片机开发环境。我们将现有代码从Keil迁移到SDCC,确保原有的Keil代码能够在新环境中顺畅运行。

本文使用的示例项目地址:uart_temp

正文

一、安装SDCC和stcgal

下载链接

  • SDCC - Small Device C Compiler (sourceforge.net)
  • grigorig/stcgal: Open Source STC MCU ISP flash tool (github.com)

SDCC的特点:

  • 开源免费、支持常见MCU

  • 一次只能编译一个文件,多个文件需要编写Makefile

  • 对c99标准支持的比Keil C51更好,更像一个标准的C语言编译器

  • SDCC代码生成的体积会比较大,原因如下:

    在GCC编译器中,-ffunction-sections-fdata-sections参数是用来将每个函数和数据段分别放在单独的section中。这样做的好处是在链接阶段,未被引用的函数和数据可以被识别并删除,从而减小最终的执行文件大小。而-Wl,--gc-sections参数则是告诉链接器去删除未使用的函数和数据段。

    然而,SDCC(Small Device C Compiler)并不支持这些GCC的特性。这可能导致SDCC编译的单片机程序的最终执行文件比使用GCC编译的更大,因为即使某些代码没有被调用,它也会被包含在执行文件中。为了解决这个问题,有些SDCC库的开发者选择在每个源文件中只放置一个函数,尽管这样做会让代码看起来更加分散和不易读。

stcgal的特点:

  • 开源免费,支持 STC MCU Ltd. 8051 系列单片机
  • 支持命令行操作,stc-isp可以用于烧录单片机,但是软件是闭源的。不支持命令行操作

二、从Keil迁移到SDCC

Keil C51SDCC
头文件reg51.h/reg52.h8051.h/8052.h
端口P2^0P2_0
端口定义sbit LED1=P2^0;#define LED1 P2_0替换的时候注意删除后面的分号
中断声明void uart() interrupt 4 using 0void uart(void) __interrupt (4) __using (0)
特殊类型sbit,sfr,bit,code__sbit,__sfr,__bit,__codeKeil中的很多特殊类型前面加上__就是sdcc中对应的类型。
_nop()_Keil C51专有#define _nop_() __asm NOP __endasm
intrins.hKeil C51专有, SDCC需自己创建自行创建

intrins.h文件内容图下,请自行创建

#ifndef _INTRINS_H_
#define _INTRINS_H_/* warning: __push __pop 使用堆栈临时保存 sfr 数据,必需成对使用!  __push(x);...  // 保护代码块__pop(x);  //缺少无该语句编译不会出错,但运行错误!
*/#define __push(x)      __asm push _##x  __endasm  /* void _push_ (unsigned char _sfr); */#define __pop(x)       __asm pop  _##x  __endasm  /* void _pop_  (unsigned char _sfr); */#define _push_        __push        /*兼容 keil c51*/#define _pop_        __pop         /*兼容 keil c51*//*   安全使用保护宏: pushSfr(x);...                 // 受保护代码块popSfr(x);         // 缺少无该语句编译出错,确保生成正确代码。
*/#define pushSfr(x)  do{\__push(x)#define  popSfr(x)     __pop(x);\}while(0)#endif //_INTRINS_H_
常见编译问题:
  • 待补充

三、编写Makefile

示例项目地址:uart_temp

项目结构如下:

D:\PROJECT\UART_TEMP
├─include
├─obj
└─src

对应的Makefile如下:

# set CC TOOL
CC := sdcc
PACKIHX := packihx
CFLAGS := -DUSE_FLOATS=1# set DIR
INCDIR = include
SRCDIR = src
OBJDIR = obj
TARGET = obj/main.ihxINC := ./include
SRC := $(wildcard $(SRCDIR)/*.c)
# OBJ := $(SRC:%.c=%.rel)
OBJ := $(patsubst src/%.c, obj/%.rel, $(SRC))  .PHONY: all cleanall: uart_temp.hexclean:-del /q obj\*$(OBJ):obj/%.rel:src/%.c-$(CC) $(CFLAGS) -I $(INC) -c $^ -o $@$(TARGET): $(OBJ)-$(CC) $^ -o $@uart_temp.hex: $(TARGET)-$(PACKIHX) $(TARGET) > uart_temp.hexflash: -stcgal -P stc89 -p COM3 .\uart_temp.hex#led.bin:led.hex
#       objcopy -I ihex -O binary led.hex led.bin#led.hex:main.ihx
#       packihx main.ihx > led.hex# led.bin:main.ihx
#         makebin main.ihx led.bin

需要注意的是:

  • sdcc编译生成.rel不生成.o
  • sdcc链接得到.ihx,需要使用packihx转换成.hex
  • sdcc一次只能编译一个文件

四、编译、烧录

编译命令,编译得到.\uart_temp.hex

make clean all

烧录前,确认单片机连接的串口号,并将Makefile中的COM3为单片机使用的串口号

烧录命令

make flash

参考文献

  • 如何评价 SDCC (Small Device C Compiler) 编译器套件? - 知乎 (zhihu.com)

  • 8951单片机Keil C 迁移 SDCC - 简书 (jianshu.com)

  • MAC 开发C51 - 简书 (jianshu.com)

  • 还在用Keil做51单片机开发吗?快来试试开源的SDCC吧 - 知乎 (zhihu.com)

  • SDCC - Small Device C Compiler (sourceforge.net)

  • grigorig/stcgal: Open Source STC MCU ISP flash tool (github.com)

这篇关于从Keil迁移到SDCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549570

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

Linux Centos 迁移Mysql 数据位置

转自:http://www.tuicool.com/articles/zmqIn2 由于业务量增加导致安装在系统盘(20G)磁盘空间被占满了, 现在进行数据库的迁移. Mysql 是通过 yum 安装的. Centos6.5Mysql5.1 yum 安装的 mysql 服务 查看 mysql 的安装路径 执行查询 SQL show variables like

风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架

论文链接:https://arxiv.org/pdf/2408.16766 项目链接:https://csgo-gen.github.io/ 亮点直击 构建了一个专门用于风格迁移的数据集设计了一个简单但有效的端到端训练的风格迁移框架CSGO框架,以验证这个大规模数据集在风格迁移中的有益效果。引入了内容对齐评分(Content Alignment Score,简称CAS)来评估风格迁移

DataGrip数据迁移

第一步 第二步  第三步  第四步 选择你刚刚到处的文件即可

从VC6迁移至VS2005 ,VS2008

最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下: 1消息映射 VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过 a. ON_MESSAGE(message,OnMyMessage);   OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(

基于人工智能的图像风格迁移系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像风格迁移是一种计算机视觉技术,它可以将一种图像的风格(如梵高的绘画风格)迁移到另一幅图像上,从而生成一幅具有特定艺术风格的图像。基于深度学习的图像风格迁移技术已经广泛应用于艺术创作、图像处理等领域。本文将介绍如何构建一个基于人工智能的图像风格迁移

gs_dump和gs_dumpall 迁移数据库

目录 0、源端实例收集AWR1、创建目录2、gs_dump - 业务停机3、gs_dumpall - 业务停机4、拷贝文件5、目标实例导入数据 0、源端实例收集AWR https://blog.csdn.net/hezuijiudexiaobai/article/details/134220949 1、创建目录 mkdir -p /pgdata/data/opengauss-

ASM 10G 基于RMAN 迁移

ASM 10G 基于RMAN 迁移 场景 单节点基于10G R2 的数据库,其数据文件及日志文件均存放在ASM 里,现在为业务需求,将此数据库做迁 移,迁移到另个机房,但是两个机房的网络是通畅的,为尽量减少数据的丢失及平稳迁移和经济实惠,迁 移时,数据库需停应用 工具 本次采用RMAN 的duplicate 命令来进行迁移,运用此命令简化复杂度; 一、源库和目标库的