[RTOS 学习记录] 复杂工程项目的管理

[RTOS 学习记录] 复杂工程项目的管理

image-20240422181743350

这篇文章是我阅读《嵌入式实时操作系统μCOS-II原理及应用》后的读书笔记,记录目的是为了个人后续回顾复习使用。

前置内容:

工程管理工具make及makefile

文章目录

  • 1 批处理文件与makefile的综合使用
    • 1.1 批处理文件
    • 1.2 运行
  • 2 复杂工程管理示例
    • 2.1 文件体系结构
    • 2.2 批处理文件
    • 2.3 makefile 文件
    • 2.4 源文件、头文件和链接文件
    • 2.5 运行结果

1 批处理文件与makefile的综合使用

使用链接文件、makefile脚本文件和批处理文件完成下面具有3个源程序的应用程序的编译、链接。

头文件 printA.h

#ifndef _PRINTA_H_
#define _PRINTA_H_extern const char *msgA;#endif

源文件 printA.c

#include "printA.h"const char *msgA = "AAAAA";

头文件 printB.h

#ifndef _PRINTB_H_
#define _PRINTB_H_extern const char *msgB;#endif

源文件 printB.c

#include "printB.h"const char *msgB = "BBBBB";

源文件 test.c

#include <stdio.h>
#include "printA.h"
#include "printB.h"int main(void)
{unsigned char i = 0;for (i=0; i<5; i++){printf("%s\n", msgA);printf("   %s\n", msgB);}return 0;
}

链接文件 TEST.LNK

C:\BC\LIB\C0L.OBJ +
PRINTA.OBJ +
PRINTB.OBJ +
TEST.OBJ
TEST
TEST
C:\BC\LIB\CL.LIB

make 脚本文件 TEST.MAK

##############################################
#             创建可执行文件(exe)
TEST.EXE:TLINK   @TEST.LNK##############################################
#           创建各个目标文件(obj)
PRINTA.OBJ:BCC -c -ml -IC:\BC\INCLUDE -LC:\BC\LIB PRINTA.C
PRINTB.OBJ:BCC -c -ml -IC:\BC\INCLUDE -LC:\BC\LIB PRINTB.C
TEST.OBJ:BCC -c -ml -IC:\BC\INCLUDE -LC:\BC\LIB TEST.C

1.1 批处理文件

批处理文件 MAKETEST.BAT

ECHO OFF
ECHO ***************************************
ECHO *           BATCH FILE
ECHO ***************************************
ECHO ON
C:\BC\BIN\MAKE.EXE -f TEST.MAK

1.2 运行

使用 MAKETEST.BAT 命令即可启动批处理,如下图所示:

image-20240422104945178

20240422105136_vrpBTVmBb08_ScreenToGif

2 复杂工程管理示例

在实际工程项目的创建和管理中,众多的各种文件常会因各种原因而分别放在不同的文件夹中。

例如,第三方代码文件通常不会与系统代码文件放置于同一个文件夹下,用户代码文件也不会与系统代码文件或第三方等其他代码文件混杂在一起。

不仅如此,即使同是用户代码文件,在编译过程中所产生的各种临时的中间文件也会被单独分类放置。

总之,为了清楚有序,我们应该为工程设置多个文件夹目录,从而使不同的代码各有其所。也就是说,我们应该充分利用批处理文件和makefile的强大功能,负起对各个目录的管理责任,使工程的创建工作规范有序,从而尽可能减少不必要的错误,提高工作效率。

接下来我们就使用一个示例工程来说明批处理文件和makefile文件在工程管理上的作用。

2.1 文件体系结构

exp2_7.     本次示例工程文件夹
├─MAIN
│  ├─OBJ    临时目录,中间文件存放在这里
│  ├─SOURCE 用户源文件和链接文件
│  ├─TEST   批处理和makefile脚本存放在这里
│  └─WORK   临时目录,用于编译、链接工作场所
├─PC        第三方源文件
└─PORT└─PT    另外的第三方源文件

从文件树可以看到,用户的两个文件夹 SOURCETEST 作为子文件夹存放在 MAIN 文件夹下,这样是为了让文件结构层次更加清晰。

MAIN 文件夹下将会由批处理文件创建两个临时文件夹 WORKOBJ,其中的 WORK 文件夹为源文件编译、链接提供工作场所,OBJ 文件夹用于暂存编译后产生的中间临时文件。之所以如此,是因为某些工程项目可能不会使用到所有的基础文件(源文件、已经存在的目标文件、头文件等),为了防止混乱,我们常常会把一个工程所需要的基础文件事先复制到 WORK 文件夹,然后就在这个文件夹中进行编译、连接,而把得到的中间目标文件复制到 OBJ 文件夹以备查询。

2.2 批处理文件

MAKETEST.BAT 存放路径:E:\Dosbox\exp2_7\MAIN\TEST\MAKETEST.BAT

ECHO OFF
ECHO ***************************************
ECHO *   batch file filename:MAKETEST.BAT
ECHO ***************************************
ECHO ON
MD      ..\WORK
MD      ..\OBJ
CD      ..\WORK
COPY    ..\TEST\MAKETEST.MAK TEST.MAK
C:\BC\BIN\MAKE.EXE -f TEST.MAK
CD      ..\
DEL     WORK
DEL     OBJ
RD      .\WORK
DEL     .\OBJ

2.3 makefile 文件

MAKETEST.MAK 存放路径:E:\Dosbox\exp2_7\MAIN\TEST\MAKETEST.MAK

##############################################
#     makefile filename:MAKETEST.MAK
##############################################
#        用变量表示我们使用到的开发工具
BORLAND = C:\BC
CC = $(BORLAND)\BIN\BCC
LINK = $(BORLAND)\BIN\TLINK
##############################################
#               编译选项说明
#
# -l    生成80286实模式代码
# -c    编译为.obj文件
# -I    指示包含头文件所在路径
# -k    采用标准栈帧
# -L    指示库文件所在路径
# -ml   Large memory内存模式
# -n    指示生成目标文件的位置
##############################################
#        用变量表示我们使用到的文件路径
SOURCE = ..\SOURCE
PC = ..\..\PC
PT = ..\..\PORT\PT
TARGET = ..\TEST
WORK = ..\WORK
OBJ = ..\OBJ
##############################################
#             C编译参数选项变量
C_FLAGS = -c -ml -l -n.\$(OBJ) -k -I$(BORLAND)\INCLUDE -L$(BORLAND)\LIB
##############################################
#             链接参数选项变量
LINK_FLAGS = 
##############################################
#             包含头文件变量
INCLUDES =  $(SOURCE)\INCLUDES.H    \$(PC)\PC.H              \$(PT)\PT.H
##############################################
#             创建可执行文件(exe)
$(TARGET)\TEST.EXE:       \$(WORK)\INCLUDES.H      \$(OBJ)\TEST.OBJ      \$(OBJ)\PC.OBJ      \$(OBJ)\PT.OBJ      \$(SOURCE)\LINK.LNKCOPY    $(SOURCE)\LINK.LNK$(LINK) $(LINK_FLAGS)       @LINK.LNKCOPY    $(OBJ)\TEST.EXE     $(TARGET)\TEST.EXEDEL     TEST.MAK
##############################################
#           创建各个目标文件(obj)
$(OBJ)\TEST.OBJ:         \$(SOURCE)\TEST.C      \$(SOURCE)\INCLUDES.HCOPY    $(SOURCE)\TEST.C$(CC)   $(C_FLAGS)  TEST.c
$(OBJ)\PC.OBJ:         \$(PC)\PC.C      \$(PC)\PC.HCOPY    $(PC)\PC.C$(CC)   $(C_FLAGS)  PC.C
$(OBJ)\PT.OBJ:       \$(PT)\PT.C      \$(PT)\PT.HCOPY    $(PT)\PT.C$(CC)   $(C_FLAGS)  PT.C
# 完成头文件的复制
$(WORK)\INCLUDES.H: \$(INCLUDES)COPY    $(SOURCE)\INCLUDES.HCOPY    $(PC)\PC.HCOPY    $(PT)\PT.H

2.4 源文件、头文件和链接文件

头文件 PC.H 存放路径:E:\Dosbox\exp2_7\PC\PC.H

#ifndef _PC_H_
#define _PC_H_extern const char *msgC;#endif

源文件 PC.C 存放路径:E:\Dosbox\exp2_7\PC\PC.C

#include "PC.h"const char *msgC = "CCCCC";

头文件 PT.H 存放路径:E:\Dosbox\exp2_7\PORT\PT\PT.H

#ifndef _PT_H_
#define _PT_H_extern const char *msgT;#endif

源文件 PT.C 存放路径:E:\Dosbox\exp2_7\PORT\PT\PT.C

#include "PT.h"const char *msgT = "TTTTT";

头文件 INCLUDES.H 存放路径:E:\Dosbox\exp2_7\MAIN\SOURCE\INCLUDES.H

#include "PC.h"
#include "PT.H"

源文件 TEST.C 存放路径:E:\Dosbox\exp2_7\MAIN\SOURCE\TEST.C

#include <stdio.h>
#include "PC.h"
#include "PT.h"int main(void)
{unsigned char i = 0;for (i=0; i<5; i++){printf("%s\n", msgC);printf("   %s\n", msgT);}return 0;
}

链接文件 LINK.LNK 存放路径:E:\Dosbox\exp2_7\MAIN\SOURCE\LINK.LNK

C:\BC\LIB\C0L.OBJ +
..\OBJ\PC.OBJ +
..\OBJ\PT.OBJ +
..\OBJ\TEST.OBJ
..\OBJ\TEST
..\OBJ\TEST
C:\BC\LIB\CL.LIB

2.5 运行结果

启动批处理脚本:

20240422180001_WxUn3yu2uZ2_ScreenToGif

执行可执行文件 TEST.EXE

image-20240422180128199

参考资料:

《嵌入式实时操作系统μCOS-II原理及应用》

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BootstrapAdmin Net7:基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录

BootstrapAdmin Net7&#xff1a;基于RBAC的后台管理框架,实现精细化权限管理与多站点单点登录 摘要 随着企业信息化建设的不断深入&#xff0c;后台管理系统在企业运营中扮演着越来越重要的角色。本文介绍了一款基于RBAC&#xff08;Role-Based Access Control&#xff09;的…

sc2024项目consul

1. 什么是consul HashiCorp Consul是一款服务网络解决方案&#xff0c;可让团队管理服务之间以及内部部署和多云环境及运行时的安全网络连接。consul提供服务发现、服务治理、流量管理和对网络基础设施设备的自动更新。(添加链接描述)Consul使用Go语言开发 2. 功能 多数据中…

(CVPR,2024)CAT-Seg:基于成本聚合的开放词汇语义分割

文章目录 相关论文相关资料摘要引言方法计算成本与嵌入空间成本聚合类别成本聚合CAT-Seg框架 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;CAT-Seg&…

Vuex 的原理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store” 基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 ( state )。 Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的…

ai写作软件哪个好,5款倍受好评的AI写作软件

ai写作软件哪个好&#xff0c;5款倍受好评的AI写作软件!在当今信息爆炸的时代&#xff0c;人们对于高效、智能的工具需求日益增加。AI写作软件因其独特的优势逐渐成为许多人的选择。但是在众多的AI写作软件中&#xff0c;究竟哪一款更胜一筹呢&#xff1f;下面将介绍5款倍受好评…

Centos7虚拟机与真机乎ping以及虚拟机ping不通的原因

以下是本机的网络地址 首先我在这两天的学习中遇到了以下种种问题&#xff1a; 本机与虚拟机互相ping不通虚拟机无法连接网络访问互联网本机可以ping通虚拟机 但是虚拟机不能ping本机 解决方法&#xff1a; 我在这里把dhcp改成了静态ip地址 这样以后不管怎么变化IP地址都没…

对接浦发银行支付(八)-- 对账接口

一、背景 本文不是要讲述支付服务的对账模块具体怎么做&#xff0c;仅是介绍如何对接浦发银行的对账接口。 也就是说&#xff0c;本文限读取到对账文件的内容&#xff0c;不会进一步去讲述如何与支付平台进行对账。 如果要获取商户的对账单&#xff0c;需要遵循以下步骤&…

Dubbo元数据中心

元数据中心为 Dubbo 中的两类元数据提供了存取能力&#xff1a;地址发现元数据、服务运维元数据。 一、地址发现元数据 Dubbo3 中引入了应用级服务发现机制用来解决异构微服务体系互通与大规模集群实践的性能问题&#xff0c;应用级服务发现将全面取代 2.x 时代的接口级服务发…

【Vue3】$subscribe订阅与反应

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

eNSP-路由引入与过滤简单配置

目录 实验要求 IP配置 配置动态路由协议 RIP OSPF 查看建邻情况 双向重发布 路由过滤 地址前缀列表 静默接口 实验要求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 loopback 口模拟业务网段 2、R1 和R2 运行 RIPv2&#xff0c;R2&am…

SpringCloud系列(9)--将服务消费者Consumer注册进Eureka Server

前言&#xff1a;上一章节我们介绍了如何将服务提供者注册进Eureka服务里&#xff0c;本章节则介绍如何将服务消费者Consumer注册进Eureka服务里 Eureka架构原理图 1、修改consumer-order80子模块的pom.xml文件&#xff0c;引入Eureka Clinet的依赖&#xff0c;然后reolad一下&…

学习笔记Day21:转录组差异分析

转录组差异分析 差异分析难点在于将数据处理成需要的格式 表达矩阵 数值型矩阵-count 行名是symbol 低表达量的基因需要过滤 分组信息 因子&#xff0c;对照组在level第一位 与表达矩阵的列一一对应 项目名称 字符串&#xff08;不要有特殊字符&#xff09; TCGA-XX…