hardware simulation——编译框架优化

news2025/1/18 3:58:38

目录

介绍

修改前的最新代码和框架

学习和修改

最终版本


介绍

--------------------------------------------------------------------------------------------------------------------------

https://www.cnblogs.com/wittxie/p/9836097.html

        上次那个虽然能完成基本的编译功能了,但是还是太low啦,今天来优化一下,找到一篇感觉不错的文章,我们来学习一下,依旧是配合linux源码的makefile框架,只是这次会参考一下上面链接的思想。

        其实他用的也是linux的makefile的管理思想编译进行层层调用。

修改前的最新代码和框架

MAJOR = 0

MINOR = 0

PATCH = 0

NAME = tianyu.xin

ROOTFILE = $(shell pwd)

OUTPUTFILE = $(ROOTFILE)/OUTPUT

SRC = $(wildcard *.c)

OBJ = $(patsubst %.c,%.o,$(SRC))

OUTPUT        = hardware_simulation

APP_SRCS      = $(wildcard ../APP/src/*.c)

APP_OBJS      = $(APP_SRCS:../APP/src/%.c=%.o)

SHOW_SRCS     = $(wildcard ../show/src/*.c)

SHOW_OBJS     = $(SHOW_SRCS:../show/src/%.c=%.o)

HARDWARE_SRCS = $(wildcard ../hardware/src/*.c)

HARDWARE_OBJS = $(APP_SRCS:../hardware/src/%.c=%.o)

INCLUDE   = -I../show/include -I../APP/include -I../hardware/include

CC = gcc

CFLAGS = -Wall -Werror $(INCLUDE)

# Aesthetic treatment

# log management

ifeq ("$(origin V)", "command line")

    KBUILD_VERBOSE = $(V)

endif

ifndef KBUILD_VERBOSE

    KBUILD_VERBOSE = 0

endif

ifeq ($(KBUILD_VERBOSE),1)

    quiet =

    Q =

else

    quiet=quiet_

    Q = @

endif

all: $(OUTPUT)

#   $(Q)$(CURDIR)  

$(OUTPUT): $(APP_OBJS) $(SHOW_OBJS)

    $(Q)$(CC) $(CFLAGS) $^ -o $@

%.o: ../APP/src/%.c

    $(Q)$(CC) $(CFLAGS) -c $< -o $@

%.o: ../show/src/%.c

    $(Q)$(CC) $(CFLAGS) -c $< -o $@

clean:

    rm -f $(OUTPUT) $(APP_OBJS) $(SHOW_OBJS) $(HARDWARE_OBJS)

FORCE:

    $(Q)echo "Forcing target"

.PHONY: FORCE clean all

 

上面就是目前的makefile

学习和修改

        咱们的工程其实不需要那么复杂的编译框架,一个makefile就够了,但是我们要标准化一些,把能拿走的都放到配置文件里。

这个up用的是这种方式,直接把大家的配置文件都放到一起在主makefile那里,

我们就都放到build目录下,一个配置文件,一个共用函数文件

刚刚新加个hardware的rm上面忘记改了直接给我把主函数删了,人麻了,还好vscode有缓存

MAJOR = 0
MINOR = 0
PATCH = 0
NAME = tianyu.xin

include ./make_conf.mk 

all: $(OUTPUT)
#	$(Q)$(CURDIR)	

include ./make_fun.mk

clean:
	rm -f $(OUTPUT) $(APP_OBJS) $(SHOW_OBJS) $(HARDWARE_OBJS)

FORCE:
	$(Q)echo "Forcing target"

.PHONY: FORCE clean all

修改后makefile文件就变成这样了

这俩makefile的头文件把之前配置的东西都拿走了。

然后试一试昨天加的打印编译过程功能

 在试试我新加的功能

我把clean命令拆成了两个全部清除和只清除中间文件

然后我把所有的中间文件和目标文件都放到了OUTPUT目录下

现在代码可以进一步简化了

有的文件单纯就是描述文件没有.o文件所以会导致mv的时候报错

2>/dev/null
可以用这个把标准错误定向到空

现在代码还有个问题就是我们的执行只能在build目录下,所以们在优化一下

 

ROOT_DIR = ..
OUTPUTFILE = $(ROOT_DIR)/OUTPUT

然后我们再来加个打印头

# Silent printing is always required here
show:
	@echo "--------------------------------------------------------------"
	@echo "----------------------Build Start-----------------------------"
	@echo "--------------------------------------------------------------"
	@echo "Version: $(MAJOR).$(MINOR).$(PATCH)\n"
	@echo "Author: $(NAME)\n"

 

还有颜色输出

这个可以参考我之前的一个文章设置对应颜色

http://t.csdnimg.cn/9dUHY

ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	DEBUG = -g
else
	DEBUG = 
endif

CC = gcc
CFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)

现在有一个问题我像上面这样定义没有效果,像下面这样就可以

ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	CFLAGS = -Wall -Werror -g $(INCLUDE)
else
	CFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)
endif

CC = gcc

算了debug和waring的开关问题留到下次解决好了

最终版本

 

MAJOR = 0
MINOR = 0
PATCH = 0
NAME = tianyu.xin

ROOT_DIR = ..
OUTPUTFILE = $(ROOT_DIR)/OUTPUT

include $(ROOT_DIR)/build/make_conf.mk 

all: show $(OUTPUT)
	$(Q)mkdir -p $(OUTPUTFILE)
	$(Q)mv $(OUTPUT) ./*.o $(OUTPUTFILE)

include $(ROOT_DIR)/build/make_fun.mk

# Silent printing is always required here
show:
	@echo "--------------------------------------------------------------"
	@echo "----------------------Build Start-----------------------------"
	@echo "--------------------------------------------------------------"
	@echo "Version: $(MAJOR).$(MINOR).$(PATCH)\n"
	@echo "Author: $(NAME)\n"

clean:
	rm -f $(OUTPUTFILE)/*.o

clean_all:
	rm -f $(OUTPUTFILE)/*

FORCE:
	$(Q)echo "Forcing target"

.PHONY: FORCE clean all show

 

SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))

OUTPUT        = hardware_simulation
APP_SRCS      = $(wildcard $(ROOT_DIR)/APP/src/*.c)
APP_OBJS      = $(APP_SRCS:$(ROOT_DIR)/APP/src/%.c=%.o)
SHOW_SRCS     = $(wildcard $(ROOT_DIR)/show/src/*.c)
SHOW_OBJS     = $(SHOW_SRCS:$(ROOT_DIR)/show/src/%.c=%.o)
HARDWARE_SRCS = $(wildcard $(ROOT_DIR)/hardware/src/*.c)
HARDWARE_OBJS = $(HARDWARE_SRCS:$(ROOT_DIR)/hardware/src/%.c=%.o)

INCLUDE       = -I$(ROOT_DIR)/show/include -I$(ROOT_DIR)/APP/include -I$(ROOT_DIR)/hardware/include


ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	DEBUG = 
else
	DEBUG = -g
endif

CC = gcc
CFLAGS = -Wall -Werror $(INCLUDE)
CFLAGS += $(DEBUG)

# Aesthetic treatment
ECHO_END:=\033[0m"
ECHO_GREEN:=echo "\033[32m
ECHO_RED:=echo "\033[31m
ECHO_YELLOW:=echo "\033[33m
ECHO_BLUE:=echo "\033[34m
ECHO_GREEN_YELLOW:=echo "\033[42;30m

# log management
ifeq ("$(origin V)", "command line")
	KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
	KBUILD_VERBOSE = 0
endif

ifeq ($(KBUILD_VERBOSE),1)
	quiet =
	Q =
else
	quiet=quiet_
	Q = @
endif
$(OUTPUT): $(APP_OBJS) $(SHOW_OBJS)
	$(Q)$(CC) $(CFLAGS) $^ -o $@

%.o: $(ROOT_DIR)/APP/src/%.c 
	$(Q)$(CC) $(CFLAGS) -c $< -o $@

%.o: $(ROOT_DIR)/show/src/%.c
	$(Q)$(CC) $(CFLAGS) -c $< -o $@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算方法实验2:利用二分法及不动点迭代求解非线性方程

一、问题描述 利用二分法及不动点迭代求解非线性方程。 二、实验目的 掌握二分法及不动点迭代的算法原理&#xff1b;能分析两种方法的收敛性&#xff1b;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。 三、实验内容及要求 二分法 (1) 编写代码计算下列数字…

STM正点mini-新建工程模板,GPIO及寄存器(介绍)

一.新建工程模板(基于固件库) 1.1库函数与寄存器的区别 这里的启动文件都是根据容量来进行区分的 对MDK而言即使include了&#xff0c;也不知道在哪里找头文件 STM32F10X_HD,USE_STDPERIPH_DRIVER 二.新建工程模板(基于寄存器) 上面的大部分配置与固件库的一样 具体可以看手…

linux03 用户权限

01.三种权限 02.UGO&#xff08;root账号&#xff09; 查看权限 不在root文件中写&#xff0c;是因为其他用户不能进来 举个例子 ll是ls -l 第一部分&#xff1a;权限&#xff08;11个字节&#xff09; 第一个&#xff1a;d/- d表示文件夹 - 表示一般文件 二到四&#xff1a…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Java 的文件类的学习总结

目录 一、File 的创建 二、File 类的常用方法 一、File 的创建 二、File 类的常用方法

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测…

C++进阶(六)map和set

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、序列式容器与关联式容器二、键值对三、树形结构的关联式容器1、set1、set的介绍2、set的使…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图&#xff0c;就要从“点、线、面的位置关系”这一内核开始发散&#xff0c;第一层级为彼此的位置关系&#xff0c;平行、相交、异面&#xff08;两直线间位置&#xff09;、垂直&#xff08;相交或异面中的特殊位置&#xff09;&#xff0c;多面体、旋转体等&#xff0c;然后…

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码

2024-macOS系统或Kail系统重——破解ZIP压缩的文件密码 1. 你们有遇见这样子的情况么&#xff1a; 别人给你发的zip或者下载的zip文件&#xff0c;没有密码打不开么网上都是win系统的&#xff0c;都是没有macOS系统的&#xff0c;所以比较烦恼 2. 所以我就想到了代码&#x…

GoogLeNet模型详解

模型介绍 GoogLeNet是谷歌工程师设计的深度神经网络结构&#xff0c;于2014年在ImageNet比赛中取得了冠军。它的设计特点在于既有深度&#xff0c;又在横向上拥有“宽度”&#xff0c;并采用了一种名为Inception的核心子网络结构。这个网络名字中的“GoogLeNet”是对LeNet的致…

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成&#xff0c;这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N&#xff0c;i(1≤i≤N−1)桥双…

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用 基础规则 所谓提示词&#xff0c;也就是文生图中的文&#xff0c;由连贯的英语单词或句子组成。其最基础的规则是&#xff1a; 不同提示词之间需要用英文逗号分隔&#xff0c;空格和换行不影响读取想混合多个要素时使用|&#xff0c;相当于…

AD/DA(模数数模转换)

文章目录 前言一、介绍部分介绍AD/DA硬件电路模型硬件电路ADC模块DAC模块ADC0809DAC0832 运算放大器&#xff08;运放&#xff09;运放电路 DA原理两种不同的DA转换器 AD原理部分AD/DA性能指标XPT2046介绍主要功能XPT2046时序结构控制字节解释单端模式配置表 二、实例使用AD读取…

shell常用命令,参数传递,函数,挂载磁盘

一、shell常用命令 1、ls 功能:显示文件和目录的信息ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的大小,以容易理解的格式印出文件大小 (例如 1K 234M2…

echarts多个折线图共用X轴,实现tooltip合并和分离

echarts共享X轴案例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</…

数据结构(栈stack)

文章目录 一、栈1、栈的定义2、顺序栈2.1、初始化2.2、进栈2.3、出栈2.4、读取 3、链栈 一、栈 1、栈的定义 逻辑结构&#xff1a;与普通线性表相同数据的运算&#xff1a;插入、删除操作有区别 2、顺序栈 2.1、初始化 ”.”适用于结构体变量&#xff0c;”->”适用于…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

探索元宇宙的未来:数字人对话系统 - Linly-Talker —— “数字人交互,与虚拟的自己互动”

探索元宇宙的未来&#xff1a;数字人对话系统 - Linly-Talker —— “数字人交互&#xff0c;与虚拟的自己互动” 之前空闲的时候我似乎已经写过了有关于数字人的两篇文章&#xff0c;今天更多的写这篇文章就是想探索一下元宇宙的未来&#xff0c;这种数字人对话系统能做什么&…

算法沉淀——双指针算法(leetcode真题剖析)

算法沉淀——双指针算法 01.移动零02.复写零03.快乐数04.盛最多水的容器05.有效三角形的个数06.和为s的两个数字07.三数之和08.四数之和 双指针算法&#xff08;Two Pointer Algorithm&#xff09;是一种常用于数组&#xff08;或链表&#xff09;操作的算法技巧。它的核心思想…