为什么选择SDCC+vscdoe+make

相较于传统的keil5开发有以下优点:
1、SDCC完全开源,做产品时没有被keil5警告的商业风险
2、vscode体验远远好于keil
3、可以学习一下交叉编译的流程。主流芯片开发如,esp32,树莓派pico等,甚至stm32都有使用make/cmake的
4、有linux方案,可以在linux下运行。


缺点:
1、编译后文件会大一些
2、sdcc语法有一些小小的出入这点网上也开始有更多人使用这个方案了,相关问题搜索一下就应该有答案。stc官方甚至还有推出sdcc标准的头文件
3、上手难度比keil5大,毕竟keil5是老牌
4、不支持调试或者麻烦不是因为我不会,这个可以通过别的调试方法解决。不过stc8g居然支持keil5下单芯片调试,还是有点厉害的。
本教程非新手入门,windows环境

准备

请参考网上另外的教程安装vscode和make环境,如果有问题,请问AI。做不到就说明你更适合keil开发。

SDCC

SDCC官网下载
选择对应平台安装包
接下来基本就是一路next
在这里插入图片描述
在这里插入图片描述

这里选择安装的组件,可以只选择和51相关的组件,体积会大大减小。
注意最后的添加环境变量不要取消,要不然无法编译

开始编译

在这里插入图片描述
STC-ISP这里头文件选择SDCC格式复制保存为一个头文件,后续有用上。

最后的文件结构是

.vscode
Build
Library
System
	STC8G.H
User
	main.c

其中.vscode的主要配置文件c_cpp_properties.ison

/* .vscode里面添加c_cpp_properties.json文件,并录入如下内容,
主要是给VScode宏定义NotKeil,包含头文件的路径,指定编译器的路径*/
{
    "configurations": [
        {
            "name": "C51",
            "includePath": [ // 你的工程中存放 include的文件夹路径
                "${workspaceFolder}/**",
                "${workspaceFolder}/Library",
                "${workspaceFolder}/System",
                "${workspaceFolder}/User"
            ],
            "defines": [
                // "NotKeil",
                "__sfr=unsigned char",
                "__sbit=int",
                "__at(a)= ",
                "__data= ",
                "__xdata= ",
                "__using= ",
                "__interrupt(n)= ",
                "SDCC"
            ],
            "compilerPath": "D:\\Toolchain\\sdcc\\bin\\sdcpp.exe", // sdcc bin路径
            "cStandard": "c11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

注意defines,这里面定义了一些变量,可以让vscode的IntelliSense忽略一些特有的标识符,例如"__interrupt(n)= ",就是将__interrupt(n),既sdcc的中断标号替换为空,这样就不会有误报的波浪线了。

main.c的内容为:

#include "STC8G.H"

// 定义串口1中断服务程序
void Uart1_Isr(void) __interrupt(4)
{
	if (RI) // 检查接收中断标志
	{
		RI = 0;			 // 清除接收中断标志
		SBUF = SBUF; // 将接收到的数据回显发送
	}
	if (TI) // 检查发送中断标志
	{
		TI = 0; // 清除发送中断标志
	}
}

// 初始化串口1
void Uart1_Init(void)
{
	SCON = 0x50;	// 8位数据,可变波特率
	AUXR |= 0x40; // 定时器时钟1T模式
	AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器
	TMOD &= 0x0F; // 设置定时器模式
	TL1 = 0xE0;		// 设置定时初始值
	TH1 = 0xFE;		// 设置定时初始值
	ET1 = 0;			// 禁止定时器中断
	TR1 = 1;			// 定时器1开始计时
	ES = 1;				// 使能串口1中断
	EA = 1;
}

void main(void)
{
	Uart1_Init(); // 初始化串口1
	while (1)
	{
		// 主循环可以执行其他任务
	}
}

这是一个简单的回显程序,可以测试你的串口好坏。

Makefile文件内容为

CC = sdcc

ihx2hex = packihx

# 定义输出目录变量
BUILD_DIR = Build

# 编译选项
# 输出详细编译过程
# 内部存储空间大小 12k
# 内部RAM大小 256字节
# 内部拓展RAM大小 1024字节 相当于内部集成51的外部RAM拓展
CFLAGS = -V \
--code-size 0x2FFF \
--iram-size 0xFF \
--xram-size 0x400 \
-mmcs51 \
--model-medium

all:
	${CC} -I System ${CFLAGS} User/main.c -o ${BUILD_DIR}/project.ihx
	${ihx2hex} ${BUILD_DIR}/project.ihx > ${BUILD_DIR}/project.hex
	make show

.PHONY: clean show
clean:
	del /q ${BUILD_DIR}
show:
	powershell -Command "$$file_data = Get-Content Build/project.mem; \
	$$file_data | Select-Object -Last 10"

由于sdcc没有代码占用信息输出,取而代之的是将信息输出到.mem文件,这里的伪目标show,将.mem文件内容直接显示了内容到终端中。芯片内存定义也根据手册了修改。

最后再vscode终端里输入,make就可以开始编译啦

结束

欢迎在评论区指出错误,提出疑问( ̄︶ ̄*))

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐