[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://xiahunao.cn/news/2980213.html

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

相关文章

C语言学习/复习29--内存操作函数memcpy/memmove/memset/memcmp

一、内存操作函数 1.memcpy()函数 注意事项1&#xff1a;复制的数目以字节为单位 注意事项2&#xff1a;一定要保证有足够空间复制 模拟实现1 拷贝字符案例&#xff1a;由于拷贝时函数本事就以字节为单位拷贝所以该例子也可用于其他类型数据的拷贝。 模拟实现2 将自身的…

YOLOv8 关键点检测模型训练部署

文章目录 1、YOLOv8安装及使用1.2、命令行使用1.3、使用python-API模型预测1.4、pt转换ONNX 2、训练三角板关键点检测模型2.1、训练命令 3、ONNX Runtime部署 1、YOLOv8安装及使用 参考链接: 同济子豪兄视频 github原文链接 # 安装yolov8 pip install ultralytics --upgrade …

Linux-LVM与磁盘配额

一、LVM概述 Logical Volume Manager&#xff0c;逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot分区用于存放引导文件&#xff0c;不能基于LVM创建 LVM机制的基本概念 PV&#xff08;物理卷&#xff09;&#xff…

情感识别——情感计算的模型和数据集调查

概述 情感计算指的是识别人类情感、情绪和感觉的工作&#xff0c;已经成为语言学、社会学、心理学、计算机科学和生理学等领域大量研究的主题。 本文将概述情感计算的重要性&#xff0c;涵盖思想、概念和方法。 情感计算是皮卡德于 1997 年提出的一个想法&#xff0c;此后出…

生产数据采集系统

在数字化浪潮的推动下&#xff0c;生产数据采集系统已经成为企业提升生产效率、优化运营管理的关键工具。那么&#xff0c;什么是生产数据采集系统呢&#xff1f;简单来说&#xff0c;生产数据采集系统是指通过一系列技术手段&#xff0c;实时收集、处理和分析生产线上的各类数…

STM32 I²C通信

一、IC总线通信 1.1 IC总线特点 IC&#xff08;Inter Integrated Circuit&#xff0c;集成电路总线&#xff09;&#xff0c;通过串行数据线SDA&#xff08;Serial Data&#xff09;和串行时钟线SCL&#xff08;Serial Clock&#xff09;来完成数据的传输。 特点&#xff1a;…

java泛型介绍

Java 泛型是 JDK 5 引入的一个特性&#xff0c;它允许我们在定义类、接口和方法时使用类型参数&#xff0c;从而使代码更加灵活和类型安全。泛型的主要目的是在编译期提供类型参数&#xff0c;让程序员能够在编译期间就捕获类型错误&#xff0c;而不是在运行时才发现。这样做提…

(ICML-2021)从自然语言监督中学习可迁移的视觉模型

从自然语言监督中学习可迁移的视觉模型 Title&#xff1a;Learning Transferable Visual Models From Natural Language Supervision paper是OpenAI发表在ICML 21的工作 paper链接 Abstract SOTA计算机视觉系统经过训练可以预测一组固定的预定目标类别。这种受限的监督形式限制…

[笔试训练](四)

010 Fibonacci数列_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 1.创建一个数组fib[]&#xff0c;保存范围内的所有斐波那契数&#xff0c;再求离N最近的斐波那契数。 2.创建3个数a,b,c,依次先后滚动&#xff0c;可得出所有的斐波那契数&#xff0c…

椋鸟数据结构笔记#11:排序·下

文章目录 外排序&#xff08;外部排序&#xff09;文件拆分并排序归并文件两个文件归并多文件归并优化 萌新的学习笔记&#xff0c;写错了恳请斧正。 外排序&#xff08;外部排序&#xff09; 当数据量非常庞大以至于无法全部写入内存时&#xff0c;我们应该怎么排序这些数据呢…

贪吃蛇(C语言版)

在我们学习完C语言 和单链表知识点后 我们开始写个贪吃蛇的代码 目标&#xff1a;使用C语言在Windows环境的控制台模拟实现经典小游戏贪吃蛇 贪吃蛇代码实现的基本功能&#xff1a; 地图的绘制 蛇、食物的创建 蛇的状态&#xff08;正常 撞墙 撞到自己 正常退出&#xf…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言&#xff1a;在上一章节中我们介绍并成功搭建了Eureka集群&#xff0c;本章节则介绍如何把微服务注册进Eureka集群&#xff0c;使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件&#xff0c;使这…

刷题之Leetcode242题(超级详细)

242.有效的字母异位词 力扣题目链接(opens new window)https://leetcode.cn/problems/valid-anagram/ 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2…

使用kali进行DDos攻击

使用kali进行DDos攻击 1、打开命令提示符&#xff0c;下载DDos-Attack python脚本 git clone https://github.com/Elsa-zlt/DDos-Attack 2、下载好之后&#xff0c;cd到DDos-Attack文件夹下 cd DDos-Attack 3、修改&#xff08;设置&#xff09;对ddos-attack.py文件执行的权…

抖音小店现在还能做吗?未来还有多大的发展空间?聊聊我的看法

大家好&#xff0c;我是电商笨笨熊 关于“抖店还能做吗”这样的问题&#xff0c;每年都有人在问&#xff1b; 尤其是今年来说&#xff0c;抖店已经走过了四五年的时间&#xff0c;很多人担心抖店还能走多远&#xff0c;还能做多久&#xff1b; 一些一直未进入抖店但持续在观…

【从零开始学习IO机制 | 第一篇】I/O的演进之路

前言&#xff1a; 自诞生以来&#xff0c;Java 一直是软件开发领域的重要一环。作为一种广泛应用于各种应用程序和系统的编程语言&#xff0c;Java 一直致力于提供高效、可靠的 I/O&#xff08;输入/输出&#xff09;操作&#xff0c;以满足不断增长的软件需求和用户期望。 Ja…

javaweb-数据库

数据库管理系统&#xff08;DataBase Management System&#xff0c;简称DBMS&#xff09; MySQL 官网&#xff1a;MySQL :: Developer Zone 安装 官网下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 图形化工具 通常为了提高开发效…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下&#xff0c;只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了&#xff0c;甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

Linux部署MySQL8.0—手把手保姆级教程

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、下载MySQL8.0安装包二、安装MySQ…