[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.LNK
    
    COPY    $(SOURCE)\LINK.LNK
    $(LINK) $(LINK_FLAGS)       @LINK.LNK
    COPY    $(OBJ)\TEST.EXE     $(TARGET)\TEST.EXE
    DEL     TEST.MAK
##############################################
#           创建各个目标文件(obj)
$(OBJ)\TEST.OBJ:         \
    $(SOURCE)\TEST.C      \
    $(SOURCE)\INCLUDES.H
    
    COPY    $(SOURCE)\TEST.C
    $(CC)   $(C_FLAGS)  TEST.c
$(OBJ)\PC.OBJ:         \
    $(PC)\PC.C      \
    $(PC)\PC.H
    
    COPY    $(PC)\PC.C
    $(CC)   $(C_FLAGS)  PC.C
$(OBJ)\PT.OBJ:       \
    $(PT)\PT.C      \
    $(PT)\PT.H
    
    COPY    $(PT)\PT.C
    $(CC)   $(C_FLAGS)  PT.C
# 完成头文件的复制
$(WORK)\INCLUDES.H: \
    $(INCLUDES)
    COPY    $(SOURCE)\INCLUDES.H
    COPY    $(PC)\PC.H
    COPY    $(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原理及应用》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

4月23号总结

java实现发送邮件 在做聊天室项目的时候&#xff0c;由于需要发送邮箱验证码&#xff0c;所以自己查找了这方面的内容。 首先需要在Maven里面依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><versio…

英伟达AI系列免费公开课

英伟达公开课官网地址 Augment your LLM Using Retrieval Augmented Generation Building RAG Agents with LLMs langchain的workflow: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c90cb157c9c84bb5b3da380ec56f5c2a.png Generative AI Explained

Linux系统中安装MySQL

1、在电脑中安装虚拟机 2、df -h查看光盘是否挂载&#xff0c;没挂载用mount -o ro /dev/sr0 /media命令挂载 3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#xff0c;未配置则进行配置 配置软件仓库 [rootlocalhost yum.repos.d]# vim rhle.r…

Linux中文件描述符与重定向的深入探索

目录 1. 理解C语言的文件操作函数 2. 操作系统的文件操作接口 3. 文件描述符详解和其内核本质 4. 如何理解Linux下一切皆文件 5. Linux中的重定向 5.1 输出重定向 5.2 追加重定向 5.3 输入重定向 6. 结合文件描述符理解重定向 7.重定向的系统调用 在Linux操作系统中&a…

springboot整合mybatis-plus模版

1.创建springboot项目 Maven类型Lombok依赖Spring Web 依赖MySQL Driver依赖pom.xml&#xff1a;<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/…

上门废品回收小程序,互联网回收拥有哪些特点?

随着社会的进步&#xff0c;人们的生活水平不断提高&#xff0c;产生的可回收物也在不断上升&#xff0c;每年垃圾站都能产生大量的可回收物&#xff0c;这也造成了资源的浪费。 目前&#xff0c;加快发展回收模式&#xff0c;提高我国回收效率成为了当下回收市场发展的重要方…

[笔试强训day04]

文章目录 WY22 Fibonacci数列NC242 单词搜索BC140 杨辉三角 WY22 Fibonacci数列 WY22 Fibonacci数列 #include<iostream> #include<cmath>using namespace std;int n;int main() {cin>>n;int a0,b1,c1;while(n>c){ab;bc;cab;}int ansmin(n-b,c-n);cout&l…

windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了

Windows上安装MySQL8后提示密码不对的问题可以通过以下步骤解决&#xff1a; 安装MySQL8 首先&#xff0c;你需要下载并安装MySQL8。你可以从MySQL官方网站下载符合你操作系统版本的安装包。 安装地址是&#xff1a;MySQL :: Download MySQL Installer 安装过程中&#xff…

ACRN Intel推出的虚拟机是啥样的?

前言 ACRN作为Intel为工控领域推出的一个小型化的虚拟机&#xff0c;它的特点主要有这么几个&#xff1a; 1.针对Intel的芯片做了非常强的优化 2.RT-VM实时虚拟机的实时性很好 3.CACHE缓存技术发挥的好 4.TCC技术 / 当然不是所有intel的芯片都支持&#xff0c;&#xff0c…

鸿蒙(HarmonyOS)性能优化实战-多线程共享内存

概述 在应用开发中&#xff0c;为了避免主线程阻塞&#xff0c;提高应用性能&#xff0c;需要将一些耗时操作放在子线程中执行。此时&#xff0c;子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型&#xff0c;具有内存隔离的特性&#xff0c;所以跨线…

产品规划|如何从0到1规划设计一款产品?

我们要如何从0到1规划设计一款产品?在前期工作我们需要做什么呢?下面这篇文章就是关于此的相关内容,大家一起往下看多多了解了解吧! 一、什么是产品规划? 产品规划是一种策略,它设定了产品的价值和目标,并确定实施方案以实现这些目标。它考虑了产品的整个生命周期,基于…

[RTOS 学习记录] 工程管理工具make及makefile

[RTOS 学习记录] 工程管理工具make及makefile 这篇文章是我阅读《嵌入式实时操作系统μCOS-II原理及应用》后的读书笔记&#xff0c;记录目的是为了个人后续回顾复习使用。 前置内容&#xff1a; 开发工具 Borland C/C 3.1 精简版 文章目录 1 make 工具2 makefile 的内容结构3…

【学习笔记二十四】EWM补货策略和自动补货配置

一、EWM补货策略概述 1.计划补货 ①以联机或批处理模式启动 ②根据最大和最小数量计算补货 ③仅当库存量低于最低数量时才开始 ④四舍五入至最小补货数量的倍数 2.自动补货 ①在WT确认期间启动 ②根据最大和最小数量计算补货 ③只有当库存量低于最低数量时才开始 ④四舍…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

翻页电子图书制作小技巧分享给你

当今社会&#xff0c;二维码已经成为了信息传递的重要方式之一&#xff0c;其在电子商务、广告营销、活动推广等领域广泛应用。而如何将二维码巧妙地融入电子画册中&#xff0c;制作出高端、具有吸引力的作品&#xff0c;成为了许多设计师和营销人员关注的焦点 但是很多人却不知…

ABeam×StartUp丨蓝因机器人访问ABeam旗下德硕管理咨询(深圳)新创部门,展开合作交流

近日&#xff0c;深圳蓝因机器人科技有限公司&#xff08;以下简称“蓝因机器人”&#xff09;创始人陈卜铭先生来访ABeam旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;&#xff0c;与新创部门展开合作交流。 交流中&am…

六西格玛管理培训:我的转变与成长之旅

4月初&#xff0c;我参与了天行健咨询的六西格玛管理培训&#xff0c;这次经历不仅极大地提升了我的工作效率&#xff0c;还帮助我在工作中实现了卓越。现在&#xff0c;我想分享一些我在这次培训中的学习心得和实践经验&#xff0c;希望能对正在寻求提升绩效和卓越之路的大家有…

【无线通信】OQPSK

调制 sps 8; RolloffFactor 0.2; FilterSpanInSymbols 10;bits randi([0, 1], 224*8, 1); % 1792symbols bits*2 - 1; % 1792 re -symbols(2:2:end); % 896 im -symbols(1:2:end); % 896pFilterTx comm.RaisedCosineTransmitFilter(...Shape, Square root, ...Rollo…

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…