Unix 环境高级编程(一):开发环境

2023-05-16

Unix 环境高级编程(一):开发环境

  • 一、Unix操作系统
  • 二、Linux操作系统
  • 三、GNU编译工具(GCC)
    • 1、简介
    • 2、基本用法
    • 3、文件后缀
    • 4、构建过程
    • 5、预处理指令
    • 6、预定义宏
    • 7、环境变量
  • 四、静态库
    • 1、简介
    • 2、创建静态库
    • 3、ar 指令
    • 4、调用静态库
  • 五、共享库
    • 1、简介
    • 2、创建共享库
    • 3、调用共享库
    • 3、运行
  • 六、动态加载共享库
    • 1、头文件
    • 2、加载共享库
    • 3、获取函数地址
    • 4、卸载共享库
    • 5、 获取错误信息
  • 七、辅助工具

一、Unix操作系统

二、Linux操作系统

三、GNU编译工具(GCC)

1、简介

  GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。

  GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。

2、基本用法

gcc [options] [filenames] 
/* GCC最基本的用法是∶gcc [options] [filenames] 
 * 其中 options 就是编译器所需要的参数
 * filenames 给出相关的文件名称
 * */

-c /* 只编译,不链接成为可执行文件,
	* 编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,
	* 通常用于编译不包含主程序的子程序文件 
	* */
	
-o /* output_filename,确定输出文件的名称为output_filename,
	* 同时这个名称不能和源文件同名。
	* 如果不给出这个选项,gcc就给出预设的可执行文件a.out 
	* */

-x /* 设定文件所使用的语言, 使后缀名无效, 对以后的多个有效
	* 根据约定 C 语言的后缀名称是 .c 的,
	* 而 C++ 的后缀名是 .C 或者 .cpp, 
	* 如果你很个性,决定你的 C 代码文件的后缀名是 .pig ,
	* 那你就要用这个参数, 这个参数对他后面的文件名都起作用,
	* 除非到了下一个参数的使用
	*  */

-I /* Idirname,
	* 将dirname所指出的目录加入到程序头文件目录列表中,
	* 是在预编译过程中使用的参数 
	* */

-E /* 只激活预处理,这个不生成文件, 
	* 你需要把它重定向到一个输出文件里面 
	* */

-S /* 只激活预处理和编译,就是指把文件编译成为汇编代码 */
	
-g /* 产生符号调试工具(GNU的gdb)所必要的符号资讯,
	* 要想对源代码进行调试,我们就必须加入这个选项
	*  */

-O /* 对程序进行优化编译、链接,
	* 采用这个选项,整个源代码会在编译、链接过程中进行优化处理,
	* 这样产生的可执行文件的执行效率可以提高,
	* 但是,编译、链接的速度就相应地要慢一些 
	* */

-v 			/*  gcc执行时执行的详细过程,gcc及其相关程序的版本号 */

-pedantic 	/* 对不符合ANSI/ISO C语言标准的扩展语法产生警告 */

-Wall 		/* 产生尽可能多的警告 */

-Werror 	/* 将警告作为错误处理 */

3、文件后缀

.c		/* C语言源代码文件 */

.h		/* 程序所包含的头文件 */

.i		/* 预处理后的C语言源代码文件 */

.s		/* 汇编语言文件 */

.S		/* 经过预编译的汇编语言源代码文件 */

.o		/* 编译后的目标文件 */

.a		/* 静态库文件 */

.so		/* 共享库(动态库)文件 */

4、构建过程

编辑 -> 预编译(预处理)-> 编译 -> 汇编 -> 链接

  1. 编辑(hello.c)
/* 使用 vim 编辑器编写代码 */
vim hello.c
  1. 预编译(hello.i)
/* 使用 -E 选项,生成 .i 预编译文件
 * 这个过程处理宏定义和include,去除注释,不会对语法进行检查
 */
gcc -E hello.c -o hello.i
  1. 编译(hello.s)
/* 使用 -S 选项,生成 .s 汇编文件
 * 这个阶段,检查语法
 */
gcc -S hello.i
  1. 汇编(hello.o)
/* 使用 -c 选项,生成 .o 目标文件 */
gcc -c hello.s
  1. 链接(hello)
/* 使用 -o 选项,生成可执行文件 */
gcc hello.o -o hello

5、预处理指令

#include      // 将指定文件的内容插至此指令处 
#include_next // 与#include一样,但从当前目录之后的目录查找,极少用
#define       // 定义宏
#undef        // 删除宏
#if           // 判定
#ifdef        // 判定宏是否已定义
#ifndef       // 判定宏是否未定义
#else         // 与#if、#ifdef、#ifndef结合使用
#elif         // else if多选分支
#endif        // 结束判定
##            // 连接宏内两个连续的字符串
#             // 将宏参数扩展成字符串字面值
#error        // 产生错误,结束预处理
#warning      // 产生警告
#pragma       // 提供额外信息的标准方法,可用于指定平台
#pragma GCC dependency <文件>     // 若<文件>比此文件新则产生警告
#pragma GCC poison <标识>         // 若出现<标识>则产生错 误
#pragma pack(1/2/4/8)             // 按1/2/4/8字节对齐补齐
#line                             // 指定行号

For example:

  1. error.c
#include <stdio.h>

#if (VERSION < 1)
	#error "Version is too low!"
#elif (VERSION > 4)
	#warning "version is too high!"
#endif

int main(void)
{
	printf("Version is :%d\n", VERSION);

	return 0;
}

在这里插入图片描述

  1. line.c
#include <stdio.h>

int main(void)
{
	printf("line is %d\n", __LINE__);
#line 100
	printf("line is %d\n", __LINE__);	

	return 0;
}

在这里插入图片描述

  1. pragma.c
#include <stdio.h>

#pragma GCC dependency "tmp.c" // 若tmp.c比此文件新则产生警告

int main(void)
{
		

	return 0;
}

在这里插入图片描述

#include <stdio.h>

#pragma GCC poison goto float  // 若出现 goto 或 float 则产生错误

int main(void)
{

	float a;
		
loop :
	goto loop;

	return 0;
}

在这里插入图片描述

/* 64位操作系统下,默认8字节对齐 */
#include <stdio.h>

#pragma pack(1)
    struct S1 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCIIIIHH, 15
#pragma pack(4)
    struct S2 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXIIIIHHXX, 20
#pragma pack(8)
    struct S3 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXXXXXIIIIHHXX, 24


int main(void)
{
#pragma pack()
    printf ("S1: %lu字节\n", sizeof (struct S1));
    printf ("S2: %lu字节\n", sizeof (struct S2));
    printf ("S3: %lu字节\n", sizeof (struct S3));

	return 0;
}

在这里插入图片描述

6、预定义宏

__BASE_FILE__     // 正在编译的源文件名
__FILE__          // 所在文件名
__LINE__          // 行号
__FUNCTION__      // 函数名
__func__          // 同__FUNCTION__
__DATE__          // 日期
__TIME__          // 时间
__INCLUDE_LEVEL__ // 包含层数,从0开始
__cplusplus       // C++编译器将其定义为1,
                  // C编译器不定义该宏

For example:

  1. print.h
#ifndef _PRINT_H
#define _PRINT_H

#include <stdio.h>

void print (void) 
{
    printf ("__BASE_FILE__     : %s\n", __BASE_FILE__);
    printf ("__FILE__          : %s\n", __FILE__);
    printf ("__LINE__          : %d\n", __LINE__);
    printf ("__FUNCTION__      : %s\n", __FUNCTION__);
    printf ("__func__          : %s\n", __func__);
    printf ("__DATE__          : %s\n", __DATE__);
    printf ("__TIME__          : %s\n", __TIME__);
    printf ("__INCLUDE_LEVEL__ : %d\n", __INCLUDE_LEVEL__);
#ifdef __cplusplus
    printf ("__cplusplus       : %d\n", __cplusplus);
#endif // __cplusplus
}

#endif//_PRINT_H
  1. predef.h
#ifndef _PREDEF_H
#define _PREDEF_H

#include "print.h"

#endif//_PREDEF_H

  1. predef.c
#include "predef.h"


int main (void) 
{
    print ();
    return 0;
}

在这里插入图片描述
在这里插入图片描述

7、环境变量

C_INCLUDE_PATH     // C头文件的附加搜索路径,相当于gcc的-I选项
CPATH              // 同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH // C++头文件的附加搜索路径
LIBRARY_PATH       // 链接时查找静态库/共享库的路径
LD_LIBRARY_PATH    // 运行时查找共享库的路径
  1. 通过gcc的-I选项指定C/C++头文件的附加搜索路径
gcc calc.c cpath.c -I.
  1. 将当前目录作为C头文件附加搜索路径,添加到CPATH环境变量中
export CPATH=$CPATH:. // export保证当前shell的,子进程继承此环境变量
echo $CPATH
env | grep CPATH
  1. 也可以在/.bashrc或/.bash_profile,配置文件中写环境变量,永久有效
export CPATH=$CPATH:.
执行
# source ~/.bashrc 或 # source ~/.bash_profile
//生效,以后每次登录自动生效。
  1. 头文件的三种定位方式
    a)#include “目录/xxx.h”
      头文件路径发生变化,需要修改源程序
    b)C_INCLUDE_PATH/CPATH=目录
      同时构建多个工程,可能引发冲突
    c)gcc -I目录
      既不用改程序,也不会有冲突
  2. 头文件的作用
    a)声明外部变量、函数和类
    b)定义宏、类型别名和自定义类型
    c)包含其它头文件
    d)借助头文件卫士,防止因同一个头文件被多次包含,而引发重定义错
  3. 包含头文件时需要注意的问题
    a)gcc的-I选项
      指定头文件附加搜索路径
    b)#include <…>
      先找-I指定的目录,再找系统目录
    c)#include “…”
      先找-I指定的目录,再找当前目录,最后找系统目录
    d)头文件的系统目录
/usr/include 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/5.4.0/include

四、静态库

1、简介

  1. 链接静态库是将库中的被调用代码复制到调用模块中
  2. 静态库占用空间非常大,不易修改但执行效率高
  3. 静态库的缺省扩展名是.a

2、创建静态库

  1. 编辑源代码
vim xxx.c/xxx.h
  1. 编译成目标文件
gcc -c xxx.c -o xxx.o
  1. 打包成静态库文件
ar -r libxxx.a xxx.o ...

3、ar 指令

ar指令:ar [选项] 静态库文件名 目标文件列表 
-r // 将目标文件插入到静态库中,已存在则更新 
-q // 将目标文件追加到静态库尾 
-d // 从静态库中删除目标文件 
-t // 列表显示静态库中的目标文件 
-x // 将静态库展开为目标文件 
/* 注意:提供静态库的同时也需要提供头文件 */

4、调用静态库

  1. 直接调用
gcc main.c libxxx.a
  1. 通过LIBRARY_PATH环境变量指定库路径
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc main.c -lmath (环境法)
  1. 通过gcc的-L选项指定库路径
unset LIBRARY_PATH
gcc main.c -lmath -L. (参数法)
  1. 一般化的方法:
gcc .c/.o -l<库名> -L<库路径>
  1. 运行
      在可执行程序的链接阶段,已将所调用的函数的二进制代码,复制到可执行程序中,因此运行时不需要依赖静态库。

五、共享库

1、简介

  1. 链接共享库则只是在调用模块中,嵌入被调用代码在库中的(相对)地址
  2. 共享库占用空间小,易于修改但执行效率略低
  3. 共享库的缺省扩展名是.so

2、创建共享库

  1. 编辑源程序
vim xxx.x/xxx.h
  1. 编译成目标文件
gcc -c -fpic xxx.c
  1. 链接成共享库文件
gcc -shared xxx.o -o libxxx.so
  1. PIC (Position Independent Code)
      位置无关代码。可执行程序加载它们时,可将其映射到其地址空间的任何位置。
-fPIC // 大模式,生成代码比较大,运行速度比较慢,所有平台都支持。 
-fpic // 小模式,生成代码比较小,运行速度比较快,仅部分平台支持。 
/* 注意:提供共享库的同时也需要提供头文件 */

3、调用共享库

  1. 直接调用
gcc main.c libxxx.so
  1. 通过LIBRARY_PATH环境变量指定库路径
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc main.c -lmath (环境法)
  1. 通过gcc的-L选项指定库路径
unset LIBRARY_PATH
gcc main.c -lmath -L. (参数法)
  1. 一般化的方法
gcc .c/.o -l<库名> -L<库路径>

3、运行

  运行时需要保证LD_LIBRARY_PATH,环境变量中包含共享库所在的路径。
  在可执行程序的链接阶段,并不将所调用函数的二进制代码复制到可执行程序中。
  而只是将该函数在共享库中的地址嵌入到可执行程序中,因此运行时需要依赖共享库。
  gcc缺省链接共享库,可通过-static选项强制链接静态库。

六、动态加载共享库

1、头文件

#include <dlfcn.h>

2、加载共享库

/*
* 返回值:
* 		成功返回共享库句柄,失败返回NULL。
* 
* 参数:
*   filename:共享库路径
*      若只给文件名,则根据LD_LIBRARY_PATH环境变量搜索。
*   flag取值:加载方式
*      RTLD_LAZY - 延迟加载,使用共享库中的符号 (如调用函数)时才加载。 
*      RTLD_NOW  - 立即加载。
*/
void* dlopen (const char* filename,    int flag);

3、获取函数地址

/*
 * 返回值:
 * 		成功返回函数地址,失败返回NULL。
 * 
 * 参数:
 * 		hanedle:共享库句柄
 * 		symbol:函数名
 */
void* dlsym (void* handle,const char* symbol );

4、卸载共享库

/*
 * 成功返回0,失败返回非零。
 */
int dlclose (void* handle);

5、 获取错误信息

/*
 * 有错误发生则返回错误信息字符串指针,否则返回NULL。
 */
char* dlerror (void);

七、辅助工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unix 环境高级编程(一):开发环境 的相关文章

  • 解决eclipse中出现Resource is out of sync with the file system问题

    作者 xff1a reille 本博客网址 xff1a http blog csdn net reille xff0c 转载本博客原创文章请注明出处 本文内容概要 xff1a 解决eclipse中出现Resource is out of s
  • 代码中特殊的注释技术——TODO、FIXME和XXX的用处

    作者 xff1a reille 本博客网址 xff1a http blog csdn net reille xff0c 转载本博客原创文章请注明出处 本文内容概要 xff1a 代码中特殊的注释技术 TODO FIXME和XXX的用处 更多请
  • 个人网站梦想终实现即reille blog | velep.com成长之路

    最近用wordpress开放平台软件建立了一个属于自己的个人博客网站velep com即reille blog xff0c 中文名 xff1a reille博客 xff0c 圆了自己多年来的梦想 xff0c 感觉像是在这大千互联网里找到了属
  • PaddleX树莓派部署--神经计算棒2代

    PaddleX树莓派部署 神经计算棒2代 PaddleX支持在树莓派上插入NCS2 神经计算棒2代 通过OpenVINO部署PadlleX训练出来的分类模型 注意 xff1a 目前仅支持分类模型 仅支持Armv7hf的树莓派 前置条件 OS
  • Hbase数据结构和体系架构

    1 HBase与关系数据库比较 1 xff09 行式数据库 优点 1 数据存储在一起 2 INSERT UPDATE数据较容易 缺点 1 选择操作 xff08 select xff09 时 xff0c 即使是几行所有数据也要被读取 2 xf
  • Ubuntu安装remmina

    官方教程 xff1a https github com FreeRDP Remmina wiki sudo apt span class hljs attribute add span span class hljs attribute r
  • ros运行rviz时出现QXcbConnection: XCB error: 148错误

    原因 xff1a 由于使用了vnc远程控制下位机 xff0c rviz是一个基于opengl开发的图形插件 xff0c 需要使用理论的屏幕参数 xff08 thetis screen xff09 xff0c 使用vnc会导致屏幕参数值不对
  • FreeRTOS内核源码解读之-------系统启动(三)

    前面文章两篇文章介绍了FreeRTOS的启动过程 xff0c 但是有些问题还没有解决 xff0c 在本篇文章中将会逐一解决 首先 xff0c 在 FreeRTOS内核源码解读之 系统启动 xff08 一 xff09 中提到Cortex M4
  • C++ MathGL 二维数据绘图

    C 43 43 MathGL环境搭建参考 https blog csdn net vaincury article details 105438971 MathGL官网 http mathgl sourceforge net doc en
  • 面经——小马智行2022秋招嵌入式

    笔试 单选 xff1a 双向链表 实时操作系统特征 死锁的必要条件 小端对齐时 xff0c 不用sizeof判断int长度 const typedef 结构体字节对齐 堆和栈 n阶阶乘的时间复杂度 tcpudp static 常见通信协议
  • silicon labs平台通过串口升级固件方案

    开发环境 windowssimplicity studio 5geck sdk 4 1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile ld文件的flash和ram的配置跟自己的a
  • Postman前置脚本

    位置 xff1a 作用 xff1a 调用脚本之前需要执行的代码片段 一 产生随机数字 生成0 1之间的随机数 xff0c 包括0 xff0c 不包括1 xff1b var random 61 Math random console log
  • Ubuntu下启动后网卡没有服务没有启动的问题

    参照了很多帖子 xff0c 两个典型的帖子分别是 https blog csdn net ErErFei article details 98205463 Ubuntu 18 04设置开机自动启动 https blog csdn net w
  • 错误:datatype/md5sum

    学习中科院ros入门时 xff0c 在用roscpp实现主题的发布和订阅 xff0c 遇到以下错误 xff1a ERROR Client listener wants topic gps info to have datatype md5s
  • C++的门道(一些C++的关键坑)

    C 43 43 的门门道道 导语 C 43 43 是一门被广泛使用的系统级编程语言 xff0c 更是高性能后端标准开发语言 xff1b C 43 43 虽功能强大 xff0c 灵活巧妙 xff0c 但却属于易学难精的专家型语言 xff0c
  • EGO-PLANNER安装问题记录以及如何在Ubuntu22.04LTS上安装ROS noetic

    一 Ubuntu系统版本及ROS版本 笔者误操作升级系统版本到了Ubuntu22 04LTS xff0c 在这个版本中系统不支持ROS1的安装 xff0c 笔者尝试用ROS2运行ego planner xff0c 并未运行成功 xff0c
  • 算法竞赛中常用的STL

    C 43 43 标准模板库 xff08 STL xff09 封装了大量十分有用的数据结构和算法 xff0c 熟练使用STL将会使我们的程序编写如虎添翼 接下来会介绍几种在程序竞赛中常用到的STL类 如果想了解更多 xff0c 推荐直接访问官
  • Lwip从入门到放弃之(一)---基础网络知识扫盲

    Lwip从入门到放弃之 基础网络知识扫盲 一 由于工作中用到了有关Lwip的有关知识 xff0c 本人作为一个网络通信协议的门外汉 xff0c 打算系统的学习一下以太网通讯的有关知识 而Lwip作为一款开源的轻量级TCP IP协议栈 xff
  • nginx电信合规100分配置

    在日常线上部署中 xff0c 总会遇到nginx配置基线漏洞 xff0c 整理了一份nginx100分配置分享下 可以通过基线扫描 nginx conf user nobody worker processes 1 error log lo
  • gitee码云webhook,代码提交后同步到服务器。

    1 创建脚本 xff0c 写入以下内容 脚本放入www根目录下 span class token delimiter important lt php span span class token variable json span spa

随机推荐

  • Socket接口编程

    简介 1 Socket 英文原意是 孔 或者 插座 的意思 在网络编程中 通常将其称之为 套接字 当前网络中的主流程序设计都是使用 Socket 进行编程的 因为它简单易用 更是一个标准 能在不同平台很方便移植 2 socket是统一的编程
  • Linux基础命令-chattr更改文件隐藏属性

    目录 前言 一 chattr命令介绍 二 语法及常用参数和模式 2 1 一样用help或man查看语法 2 2 常用参数 2 3 命令的模式 三 参考实例 3 1 给文件添加无法修改的权限 3 2 从指定文件移除隐藏属性 3 3 给目录添加
  • 四轴飞行器的串级PID参数整定经验

    串级PID即将两个PID控制器按照串联的方式连接起来 xff0c 前一个的输出作为后一个的输入两者共同控制控制对象 对于四旋翼来讲最普通的就是外环角度环 xff0c 内环角速度环 xff0c 两者怎么联系呢 xff0c 有的说法是 xff1
  • 嵌入式C语言复习——Day4

    嵌入式C语言复习 Day4 C语言函数的使用 1 函数概述 xff1a 一堆代码的集合 xff0c 用一个标签去描述它 xff0c 复用化 xff1b 函数三要素 xff1a 1 函数名 xff08 地址 xff09 2 输入参数 3 返回
  • C++基础复习——Day2

    类和对象 封装对象的初始化和清理构造函数和析构函数构造函数的分类及调用拷贝构造函数调用时机深拷贝与浅拷贝 C 43 43 对象模型和this指针友元运算符重载加号运算符重载左移运算符重载递增运算符重载赋值运算符重载 继承继承的基本用法继承方
  • 【模电基础复习】

    模拟电子技术 概念向 1 二极管杂质半导体的形成载流子是什么线性元件与非线性元件PN结形成原理及特性PN结的击穿二极管特性和主要参数二极管应用其他二极管类型 1 思考题为什么称空穴是载流子 xff1f 如何从PN结的电压电流特性方程来理解其
  • 【数电基础复习】

    数字电子技术 概念向 数制和码制数字量与模拟量位权十 二进制运算反码 补码奇偶校验 逻辑函数逻辑代数运算最小项和最大项逻辑函数化简方法 门电路CMOS门电路CMOS反相器CMOS电压传输特性和电流传输特性CMOS反相器静态输入特性和输出特性
  • 数据结构与算法——队列

    数据结构与算法 队列队列的链式存储结构创建一个队列入队列操作 出队列操作销毁一个队列 队列 队列 xff08 queue xff09 是只允许在一端进行插入操作 xff0c 而在另一端进行删除操作的线性表 与栈相反 xff0c 队列是一种先
  • 数据结构与算法——递归和分治

    数据结构与算法 递归斐波那契数列的递归实现 分治 递归 在现实当中 xff0c 我们只有在迫不得已的情况下才使用递归 xff0c 因为递归本身的效率并不理想 xff0c 但他的思想却值得我们留存在记忆之中 斐波那契数列的递归实现 使用递归实
  • 数据结构与算法——字符串

    数据结构与算法 字符串字符串的比较字符串的存储结构BF算法KMP算法 字符串 定义 xff1a 串 String 是由零个或多个字符组成的有限序列 xff0c 又名叫字符串 一般记为 s 61 a1a2a3 an n gt 61 0 串可以
  • 数据结构对齐规则(C语言)

    概念 xff1a 一些概念是为了容易理解 xff0c 自己定义的 1 基本对齐系数 xff1a 默认情况 xff1a 由编译器和操作系统决定 xff0c 一般来说32位系统对齐系数为4 xff08 字节 xff09 xff1b 64位系统对
  • ubuntu grace/xmgrace安装和使用

    grace是什么 xff1f Grace是 GRaphing Advanced Computation and Exploration of data 的缩写 它是在X Window系统和Motif下的所见即所得 xff08 所见及所得 x
  • OFDM多径传输时域和频域模型,以及循环前缀的作用

    1 多径信道传输模型 从信号传输的基本模型入手 考虑如下式所示的线性时不变系统 xff0c y t 61 h
  • 对单片机堆栈的理解

    看关于单片机方面的书籍的时候 xff0c 总是能看到别人说的一些堆栈啊什么的操作 xff0c 之前看到这个术语就直接跳过 xff0c 没想到去探究单片机内部的原理 但是最近课程学习微机原理这门课 xff0c 需要我们写汇编程序 xff0c
  • ROS 中package.xml文件详解01

    package xml文件时每一个ros包都要有的一个文件 xff0c 也是必须要包含的一个文件 1 最简单的xml文件 span class token operator lt span package format span class
  • 常用车载总线CAN、CAN FD、LIN、FlexRay、Ethernet介绍

    文章目录 前言 关于这些总线的详细介绍可分别参考如下 xff1a 一 为什么要这些总线二 车载总线的种类1 CAN1 1 CAN协议简介1 2 CAN协议特点 2 CAN FD2 1 CAN FD协议简介2 2 CAN FD协议特点 3 L
  • Leetcode刷题【8. 字符串转换整数】

    力扣第8题 xff0c 字符串转换整数 atoi 题目描述 xff1a 请你来实现一个 myAtoi string s 函数 xff0c 使其能将字符串转换成一个 32 位有符号整数 xff08 类似 C C 43 43 中的 atoi 函
  • Leetcode刷题【10. 正则表达式匹配】

    力扣第10题 xff0c 正则表达式匹配 题目描述 xff1a 给你一个字符串 s 和一个字符规律 p xff0c 请你来实现一个支持 和 的正则表达式匹配 匹配任意单个字符 匹配零个或多个前面的那一个元素 所谓匹配 xff0c 是要涵盖
  • Jetseon TX2 & IntelRealsense D435i & Python

    Jetseon TX2 amp IntelRealsense D435i amp Python amp Socket 一 IntelRealsense Python Wrapper GitHub 1 Installation pip ins
  • Unix 环境高级编程(一):开发环境

    Unix 环境高级编程 xff08 一 xff09 xff1a 开发环境 一 Unix操作系统二 Linux操作系统三 GNU编译工具 xff08 GCC xff09 1 简介2 基本用法3 文件后缀4 构建过程5 预处理指令6 预定义宏7