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

news/2024/9/22 20:50:53/
[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.ppmy.cn/news/1434943.html

相关文章

嵌入式学习——C语言基础——day8

1. 函数的三种形式 1.1 函数的定义 函数类型 函数名(数据类型1 形式参数1, 数据类型2 形式参数2, ..) { 函数体; return 返回值; } 注意&#xff1a; 1. 函数类型为函数运行结果的类型 2. 函数返回值与函数类型不匹配时,强制将返…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

05.JAVAEE之线程3

1.多线程的代码案例 1.1 单例模式【非常经典的设计模式】 单例 >单个实例(对象) 有些场景中,希望有的类,只能有一个对象,不能有多个!!!在这样的场景下,就可以使用单例模式了 EG:代码中,很多用于管理数据的对象就应该是"单例"的. MySQL JDBC DataSource(描述了 …

java SpringMvc笔记

springMVC M:模型层,包含实体类,业务逻辑层,数据访问层; v: 视图层,html,javascript,vue等 c:控制层,它是用来接收客户端的请求,并返回响应客户端的组件,Servelet组件 SpringMVC 1、轻量级&#xff0c;基于MVC的框架 2、具备IOC和AOP 3、完全基于注解开发 client(客户端)-&am…

前端项目的导入和启动

安装依赖 前端安装依赖只需要在控制台执行“npm i”即可。Tips&#xff1a;当我们执行的时候&#xff0c;有时候会很慢。可以考虑使用yarn或者pnpm。然而使用yarn或者pnpm有时候有一些莫名其妙的问题。所以还是得使用npm&#xff0c; 这个时候可以通过更换镜像源为淘宝镜像源。…

JAVA毕业设计137—基于Java+Springboot+Vue的物流快递仓库管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物流快递仓库管理系统(源代码数据库)137 一、系统介绍 本项目前后端分离&#xff0c;分为员工、销售员、仓库员、商品管理员、超级管理员五种角色 1、员工…

MATLAB使用速成 第三章(MATLAB绘图)

一、二维平面作图 1、简单的x-y坐标图 x、y是长度相同的向量&#xff0c;以x的分量为横坐标&#xff0c;y的分量为纵坐标&#xff0c;作平面曲线&#xff0c;使用命令plot(x,y)。&#xff08;可以省略参数x&#xff0c;这样将会以y的分量下标为横坐标&#xff0c;y的分量为纵坐…

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测&#xff0…