hardware simulation——编译框架优化
目录
介绍
修改前的最新代码和框架
学习和修改
最终版本
介绍
--------------------------------------------------------------------------------------------------------------------------
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.xininclude ./make_conf.mk all: $(OUTPUT)
# $(Q)$(CURDIR) include ./make_fun.mkclean: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
elseDEBUG =
endifCC = gcc
CFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)
现在有一个问题我像上面这样定义没有效果,像下面这样就可以
ifeq ($(filter debug,$(MAKECMDGOALS)),1)CFLAGS = -Wall -Werror -g $(INCLUDE)
elseCFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)
endifCC = gcc
算了debug和waring的开关问题留到下次解决好了
最终版本

MAJOR = 0
MINOR = 0
PATCH = 0
NAME = tianyu.xinROOT_DIR = ..
OUTPUTFILE = $(ROOT_DIR)/OUTPUTinclude $(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)/*.oclean_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/includeifeq ($(filter debug,$(MAKECMDGOALS)),1)DEBUG =
elseDEBUG = -g
endifCC = 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_VERBOSEKBUILD_VERBOSE = 0
endififeq ($(KBUILD_VERBOSE),1)quiet =Q =
elsequiet=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 $@
相关文章:
hardware simulation——编译框架优化
目录 介绍 修改前的最新代码和框架 学习和修改 最终版本 介绍 -------------------------------------------------------------------------------------------------------------------------- https://www.cnblogs.com/wittxie/p/9836097.html 上次那个虽然能完成基本…...
Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径
思路: 1.建立图集,二维数组,path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过,深度优先会使用到 3.遍历从起点开始能直接到达的点(即与起点相邻的点),判断那…...
ARM常用汇编指令
文章目录 前言一、处理器内部数据传输指令MOV: 将数据从一个寄存器复制到另一个寄存器。MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…...
kali系统入侵电脑windows(win11系统)渗透测试,骇入电脑教学
本次渗透测试将使用kali虚拟机(攻击机)对本机(靶机)进行入侵并监控屏幕 声明:本篇仅仅是将本机作为靶机的一次简易渗透测试,实际情况中基本不可能出现如此简单的木马骇入(往往在上传木马时就被防…...
力扣hot100 矩阵置零 标识位
Problem: 73. 矩阵置零 文章目录 思路复杂度Code 思路 👨🏫 参考 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public static void setZeroes(int[][] matrix) {int n matrix.length;i…...
Android App开发-简单控件(3)——常用布局
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,CommonLayouts以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线…...
Linux使用二进制包安装MySQL
目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载:MySQL :: Download MySQL Community Server 二、上传软件…...
【vue3-pbstar-admin】一款基于vue3和nodejs的简洁后台管理系统
Vue3-pbstar-admin 是一个简洁的后台解决方案,提供了基础的用户体系和页面接口权限配置,方便用户进行自定义开发,避免不必要的代码冗余。该方案结合了 Vue3、Element-Plus、Pinia 和 Vite 等先进技术,实现高效的页面布局、状态管理…...
顺序表和链表【数据结构】【基于C语言实现】【一站式速通】
目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组 3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义 2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双…...
SpringBoot 有什么优点?
Spring Boot 是一个用于简化和加速 Spring 框架应用程序开发的项目。它构建在 Spring 框架之上,提供了一种快速开发、简化配置和集成的方式。以下是 Spring Boot 的一些优点: 1、简化配置: Spring Boot 使用约定大于配置的理念,通…...
扫地机器人(二分算法+贪心算法)
1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后,比现在sweep的位置(现在已经覆盖的范围)还要靠左,就是覆盖连续不起来,呢么这个len就是有问题的,退出函数,再…...
Unity中创建Ultraleap 3Di交互项目
首先,创建新的场景 1、创建一个空物体,重命名为【XP Leap Provider Manager】,并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下,创建两个子物体Service Provider(XR)和Service Provider(…...
【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗
一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…...
C数据类型
目录 1. 数据类型分类 2. 整数类型 3. 浮点类型 4. void 类型 5. 类型转换 1. 数据类型分类 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C 中…...
JAVA和Go的不解之缘
JAVA和Go的不解之缘 Java和Go是两种不同的编程语言,它们在语法、特性和设计理念上存在一些明显的异同之处。 1. 语法和特性: Java是一种面向对象的语言,而Go则是一种面向过程的语言。Java拥有类、继承、接口等传统的面向对象特性ÿ…...
(免费领源码)java#SSM#MySQL汽车车辆管理系统68424-计算机毕业设计项目选题推荐
摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…...
25考研每日的时间安排
今天要给大家分享一下25考研每日的时间安排。 没有完美的计划,只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率,所以学多长时间不重要,重要的高效率完成任务。 完美的计划 这个计划看起来很完美,从早到晚有学习…...
小程序直播项目搭建
项目功能: 登录实时聊天点赞功能刷礼物取消关注用户卡片直播带货优惠券直播功能 项目启动: 1 小程序项目创建与配置: 第一步 需要登录小程序公众平台的设置页面进行配置: 首先需要是企业注册的才可以个人不能开通直播功能。服务类…...
《Python 简易速速上手小册》第10章:Python 项目实战(基于最新版 Python3.12 编写)
注意:本《Python 简易速速上手小册》 核心目的在于让零基础新手「快速构建 Python 知识体系」 文章目录 <mark >注意:本《Python 简易速速上手小册》<mark >核心目的在于让零基础新手「快速构建 Python 知识体系」 10.1 项目规划和结构10.1…...
防御保护第六天笔记
一、防火墙的用户认证 用户、行为、流量 --- 上网行为管理三要素 防火墙管理员登录认证的作用有两点:检验身份的合法性,划分身份权限 用户认证 --- 上网行为管理的一部分 用户认证分类有以下三类: 1、上网用户认证 --- 三层认证 --- 所有的…...
PostgreSQL CASE语句深度解析:性能、类型与NULL安全实战指南
1. 为什么你必须真正吃透 PostgreSQL 的 CASE 语句——它远不止是 SQL 里的“if-else”翻译器在 PostgreSQL 实战中,我见过太多人把CASE当成一个语法糖:写几个WHEN...THEN,加个ELSE,再套个END,就以为搞定了。结果呢&am…...
Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)
Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)在当今微服务架构盛行的时代,Go语言因其高性能和并发优势成为后端开发的热门选择。而Goframe作为一款企业级的Go应用开发框架,提供了从数据库操作到API…...
第三幕 御酒掺土,江山为祭
金牌监制,您这一刀改得极其精准,直接把整部戏的格局从“江湖恩怨”拉升到了“家国博弈”的层面!确实,如果只谈慈悲,唐三藏只是个高僧;但如果加上李世民的重托和大唐的国运,他就是一个背负着沉重…...
告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo
嵌入式UI开发革命:5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中,用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境,又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下,调试过程更…...
浏览器 Profile 环境排查:Cookie、LocalStorage、网络出口与自动化任务配置清单
一、为什么浏览器环境经常“今天能用,明天失效”很多团队遇到登录状态丢失、页面配置异常、自动化任务失败时,会先怀疑网络、脚本或系统本身。但在实际项目里,问题经常不是单点故障,而是浏览器环境缺少稳定管理:对象常…...
2026年,揭秘那些真正安全的原生态食材厂家你不可不知的秘密
随着人们生活水平的提升以及对健康的日益重视,选择真正安全的原生态食材已经成为许多人购买食物的标准。但市场的繁杂使得甄别真正安全的食材厂家变得愈加困难。今天,我将通过几个关键角度,为大家揭秘那些真正安全的原生态食材厂家的秘密&…...
一次搞懂内存取证:用Volatility3和Cobalt Strike分析工具复现VNCTF‘来一把紧张刺激的CS’
实战内存取证:从Volatility3到Cobalt Strike信标分析全解析 在网络安全事件响应中,内存取证往往是发现高级威胁的最后一道防线。当攻击者使用文件无落地的技术时,传统的磁盘取证可能一无所获,而内存中却保留着攻击行为的完整痕迹。…...
照着用就行:2026 最新降AIGC软件测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
CANoe诊断测试没CDD文件怎么办?手把手教你用Fault Memory窗口和CAPL脚本读取解析DTC故障码
CANoe诊断测试无CDD文件的实战解决方案:从Fault Memory到CAPL脚本全解析当CDD文件缺失或定义不清晰时,诊断测试工程师常常陷入困境。本文将深入探讨如何利用Fault Memory窗口的基础功能,并通过CAPL脚本实现更灵活、更强大的故障码读取与解析方…...
Web渗透测试能力成长地图:从工具使用到漏洞认知跃迁
1. 这不是工具清单,而是一张Web渗透测试的“能力成长地图”你刚点开这篇文章,大概率正站在两个路口之间:一边是网上铺天盖地的“十大免费扫描器推荐”,点进去全是截图下载链接一句“一键扫漏洞”,结果装完跑两下&#…...
