1.王道_常用命令

用户管理

  • who 有几个用户登录

    • pts 使用的终端
  • 用户类型

    • # root
    • $ 普通用户
  • sudoer

    • sudo 临时变成root,执行命令
  • su 切换用户

  • passwd

    • passwd修改自己的密码
    • passwd 用户
  • 查看已存在的用户个数

    • cat /etc/passwd
    • 密码存放在 /etc/shadow
  • useradd

    • 直接使用此命令,不会产生/home下的家目录
    • 直接使用此命令,shell为sh
    • useradd -m -s /bin/bash
    • -m 创建家目录
    • -s 指定shell版本
  • userdel

    • 同时删除家目录为-r
  • man

    • 在这里插入图片描述

    • 1 命令

    • 2/3 系统调用和库函数

文件和文件系统相关的命令

  • 分层

    • Linux一般使用ext4
    • windows一般使用 NTFS
    • 在这里插入图片描述
  • ls

    • 在这里插入图片描述
    • -a 隐藏文件也显示
    • -l
    • 在这里插入图片描述
  • ln

    • -s
      • 软链接
    • 硬连接
      - 刚创建的文件因为有.和…从而硬链接数显示为2在这里插入图片描述
  • cd

    • cd ~
    • cd -
      • 回到上一个目录,只能保存一个位置
      • 实际上是存储在OLDPWD变量中,在环境变量env
      • 在这里插入图片描述在这里插入图片描述
      • 在这里插入图片描述
  • mkdir

  • rmdir 删除空目录

  • cp

    • -i 如果发生覆盖则提示
    • -f和-i相反
    • -r 拷贝目录
  • chmod

  • rm

    • 删除一个文件,看的是.目录的权限
      -在这里插入图片描述

文件查找

  • find

    • 在这里插入图片描述

    • -name

      • 在这里插入图片描述
      • -name 模糊查找 通配符
        • * 任何字符,包括空字符
        • ? 一个字符
        • [] [0-9] [a-f] 集合内的任何字符
      • -user
      • -uid
      • -group
      • -gid
      • -perm 按照权限查找。
      • -size 按照大小查找 默认单位是 512字节
        • + 表示大于
        • -表示小于
        • 不加表示等于
        • 在这里插入图片描述
      • empty 找到空目录
      • time
        • a access 访问时间 atime amin
        • c status change 状态改变
        • m modify 内容修改
        • 在这里插入图片描述在这里插入图片描述在这里插入图片描述
    • 查询条件

      • -a
      • -o
      • ! 补集
  • truncate

    • 在这里插入图片描述

磁盘相关

  • df

    • -h
  • du

    • 查看指定目录占用的空间
    • -d 查看的深度
      • -d 0 查看本文件的大小
      • -d 1 查看本目录下的各个文件的大小

文件查看和处理

  • cat

    • -n 所有行都编号
    • -b 空行不编号
    • -s 空行压缩
  • file

    • 查看文件的类型
  • echo

    • 直接使用,会带换行
    • -n去掉换行
  • 创建空文件

    • touch fil1
    • echo -n fil1
    • cat > fil1 在Ctrl+D 输入EOF终止符
  • 系统日志文件

    • /var/log/syslog
  • wc

    • word count在这里插入图片描述
  • iconv

    • 在这里插入图片描述

文件内容查找

  • grep
    • 正则表达式 : 高级版本的通配符
    • -n 显示行哈
    • -E 使用最新版本的正则表达式
    • 在这里插入图片描述在这里插入图片描述在这里插入图片描述
    • \<a a出现在单词的开头

命令的组合

  • ;

  • 管道

  • xargs

    • 将标准输入的内容转换为命令的参数
      • xargs ls -al
        • 在这里插入图片描述在这里插入图片描述
        • 在这里插入图片描述在这里插入图片描述
  • 命令替换

    • 在这里插入图片描述

打包和压缩

  • tar

    • 在这里插入图片描述
  • tar cfv file.tar f1 f2 f3 打包 打包之后可以追加包

  • tar xfv file.tar 解开包

  • tar cfvz file.tar.gz f1 f2 f3 压缩包 压缩之后不能追加

  • tar xfvz file.tar.gz f1 f2 f3 解包

远程拷贝

  • scp
    • 基于ssh的cp
    • 在这里插入图片描述

身份认证

  • 密码
  • 密钥
    • 在这里插入图片描述

Vim

  • vim分为三种模式:普通(命令)模式,编辑状态和视觉模式。

a 从光标后面开始添加文本(表示新增 append)
A 从光标所在行的末尾开始添加文本
i 从光标前面开始插入文本(表示插入 insert)
I 从光标所在行的开始处插入文本

光标移动

^ 光标移动到行首 -------------- -------------- -------------- --------------
$ 光标移动到行尾 -------------- -------------- -------------- --------------
ctrl+d 向下翻半页(down)
ctrl+f 向下翻一页(forward)
ctrl+u 向上翻半页(up)
ctrl+b 向上翻一页(backward)
gg 光标定位到文档头 -------------- -------------- -------------- --------------
G 光标定位到文档尾 -------------- -------------- -------------- --------------
H 光标定位到当前页首(head)
L 光标定位到当前页的最后一行的行首(lastline)
w 光标往后移一个字 (word)
b 光标往前移一个字 (block)
[n]+ 光标向后移动n行,[n]表示一个整数 10+
[n]- 光标向前移动n行,[n]表示一个整数 10-
[n]G 光标定位到第n行行首, [n]表示一个整数 20G -------------- -------------- -------------- --------------
:[n] 第n行

命令模式
删除和修改
d就行剪切,p就是粘贴

x 删除光标处的字符
dd 删除光标所在的整行
3dd 删除光标所在行以及下面的两行(删除3行)
d$ 删除光标到行尾的文本,常用语删除注释语句 (等价于d$)
d^ 删除光标到行首的文本 dt"删除到双引号位置
1,19d删除1到19行
dw 删除一个字
d3w 删除三个字
yy 复制光标所在的整行 yank复制
[n]yy 从光标开始往下复制n行,[n]表示一个整数
p 将复制后的文本粘贴到光标处
u 撤销上次操作
取消撤销:Ctrrl+r

查找与替换

/[str] 查找字符串str,[str]表示要查找的字符串
回车后会加亮显示所有找到的字符串,接着输入n移动到下一个找到的字符串,输入N移动到上一个找到
的字符串
: s/[src]/[dst]/[i忽略大小写][g处理本行中所有的匹配项] 用dst替换字符串src
: s/hello/world/ig 替换一行
:x,y s/[src]/[dst]/ig(x-y行中找)
:3,6 s/hello/world 将3-6行里面,找到第一个hello替换为world
:%s/[src]/[dst]/g 将文档中所有src的字符串替换为dst字符串
:%s/^ //g 将文档每一行的行首的空格去掉
:%s/^\t//g 将文档每一行的行首的制表符去掉
提问:如何使用替换命令注释所有块内代码?
提问:如何使用替换命令转换实现制表符和4个空格之间的转换?
shift+% 可以进行括号的匹配

可视模式
在这里插入图片描述
选中之后,按=,代码对齐
gg=G全文代码对齐

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

  • vimdiff

  • 多标签的切换

  • n下一个

  • N上一个

  • bd关闭当前标签

编译工具链

gcc

  • 三种主流的编译工具链

    • gcc
      • MinGW(gcc移植到Windows的)
    • clang
    • msvc
      • windows
  • <>/usr/include目录中查找

  • ""在本目录下进行查找

  • 生成可执行程序的流程

    • 预处理 a.i gcc -E
      • #include文件包含
      • #define宏定义
    • 编译 a.s 汇编语言代码 gcc -s
      • 变量名/数组名都变成地址
      • 类型信息变成指令的长度
      • 函数调用 压栈/弹栈
      • 调用其他函数 call指令
    • 汇编 a.o 机器语言 gcc -c
      • as命令 汇编语言(.s) -> 机器语言(.o)
      • 在vim中输入:!xxd.o翻译为十六进制,:!xxd -r十六进制恢复到原来的 或者od -h test.o
      • nm 列出目标文件的所使用的函数
    • 链接
      • ld链接器
      • ldd 可以看到用到那些库

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

  • -D 定义一个宏
  • -Wall 开启所有警告
  • -I 设置头文件搜索路径,默认是当前目录

gdb

  • gcc -c的时候需要加上-g选项 ,补充符号信息

    • gcc -o 编译优化 o0, o1,o2,o3。调试的时候不要开启编译优化
  • 启动gdb的两种方式

    • gdb 然后 file test
    • gdb test
  • list

    • list 列出10行代码 按一下list 列出下一个10行代码,回到第一个10行list 1 list可以简写为l
    • list print 列出print函数的代码
    • list test.c:10列出test程序的第10行
  • run/r 执行

  • 断点操作

    • break\b print 打断点
    • info\i break\b 展示断点信息
    • disable 1 取消断点1
    • enable 1 断点1恢复
    • delete 1 删除 断点1
  • 监视

    • print arr[1] 看一次
    • display arr[1] 一直看
    • 关闭display
      • 在这里插入图片描述
  • next/n 逐过程

  • step/s 逐语句 会进入函数

  • continue 运行到下一个断点

  • 看内存

    • x
    • 在这里插入图片描述
  • 查看栈的情况

    • backtrace/bt
  • ulimit -a 是 Unix/Linux 系统中用于 显示当前用户进程的资源限制 的命令。这些限制决定了进程可以使用的系统资源(如内存、文件句柄、CPU 时间等)。

  • 使用gdb处理系统报错

    • 调试core文件 man core

      • 在这里插入图片描述
      • 如果没有core文件,可能的原因
        • 在这里插入图片描述
    • 使用gdb调试

      • 在这里插入图片描述
  • 添加命令行参数

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

库文件

  • 头文件在编译阶段起作用,库文件在链接阶段起作用。

静态库

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

动态库

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

产品更新

  • 升级库
  • 通过软链接

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

Makefile

  • 代码构架工具

  • 增量编译

  • 文件名

    • Makefile
    • makefile
  • 在这里插入图片描述

  • 命令什么时候会执行

    • 目标没有产生时—伪目标就是利用这种规则
    • 依赖的文件的日期发生改变时
  • 伪目标

    • 什么是伪目标,看是否可以生成目标
    • 文件不存在,但是一直生成不了 ,就会一直执行
    • 在这里插入图片描述
    • 在这里插入图片描述
    • 全量编译
      • 在这里插入图片描述
    • 在这里插入图片描述
  • 变量

    • 只能操作字符串
    • 自定义变量
      • 在这里插入图片描述
    • 自动变量
      • 在这里插入图片描述
    • 预定义变量
      • 在这里插入图片描述
      • 可以更改预定义变量的值
        • 在这里插入图片描述
  • %匹配符

    • 在这里插入图片描述
    • 在这里插入图片描述
  • makefile提供的函数

    • SRCS:=$(wildcard *.c) 找出当前目录下的.c文件
    • OBJS:=$(patsubst %.c %.o $(SRCS))将变量SRCS中的.c变成.o
    • 在这里插入图片描述
#include "stm32f10x.h" // 包含STM32标准外设库(寄存器定义与驱动API) #include <stdint.h> // 标准整数类型支持 #include <stdio.h> // 用于调试打印输出 #include "Delay.h" // ============================= // 硬件连接定义(根据实际电路修改) // ============================= #define TRIG_PIN GPIO_Pin_8 // 连接超声模块Trig脚的IO口(PA8) #define ECHO_PIN GPIO_Pin_9 // 连接超声模块Echo脚的IO口(PA9) #define USART_TX USART1 // 串口发送通道选择 #define BAUD_RATE 9600 // 波特率设置 volatile uint32_t captureTimeStamp = 0; // 存储捕获到上升沿的时间戳(全局变量) volatile float distanceCm = 0.0f; // 最终计算出的距离值(厘米单位) void SystemClockConfig(void); // 系统时钟初始化函数声明 void UsartInit(void); // 串口通信初始化函数声明 void TimCaptureInit(void); // 定时器输入捕获模式配置函数声明 static void InterruptHandler(void); // 中断服务例程原型定义 int main(void) { // -------------------------------------- // 第一步:基础环境搭建 // -------------------------------------- SystemClockConfig(); // ① 配置HSE为系统主频源并分配各外设时基 UsartInit(); // ② 初始化串口参数(波特率/数据位等) TimCaptureInit(); // ③ 设置定时器的输入捕获模式及预处理功能 // -------------------------------------- // 第二步:主循环逻辑处理 // -------------------------------------- while (1) { if (distanceCm > 0) { // 确保有效测量结果可用时才进行后续操作 printf("Distance: %.2f cm\r", distanceCm); // 通过串口发送格式化的距离信息 Delay_ms(500); // 等待半秒避免频繁刷新屏幕影响观察效果 } } } // ============================================ // 系统时钟树形结构配置(72MHz主频典型设置) // ============================================ void SystemClockConfig(void) { RCC->CR |= (1 << 0); // 启用HSE晶体振荡器开始工作 while (!(RCC->CR & (1 << 16))) {} // 轮询等待直到稳定就绪标志位置位成功 FLASH->ACR |= FLASH_ACR_PRFTBE; // 开启预取指缓存加速程序执行效率 RCC->CFGR |= RCC_CFGR_SWS_1; // 切换至外部高速晶振作为主干线时钟源 while (RCC->CFGR & RCC_CFGR_SWS) // 确认已完成切换动作前保持阻塞状态 ; // 空循环等待过渡完成 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA端口时钟供应以便后续操作寄存器 } // ============================================ // 异步串行通讯接口初始化(基于USART1) // ============================================ void UsartInit(void) { // GPIO重映射配置 - 将TX/RX功能引脚路由到默认物理位置 RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // 使能交替功能IO组控制单元访问权限 AFIO->MAPR &= ~AFIO_MAPR_USART1_REMAP; // 取消高级外设重定向映射关系恢复原始布局 // 初始化USART参数结构体实例对象创建过程 USART_InitTypeDef usartSetting; usartSetting.USART_BaudRate = BAUD_RATE; // 设置传输速率参数值大小合适范围可调 usartSetting.USART_WordLength = USART_WordLength_8b; // 数据帧长度固定为8位字符格式兼容常用终端设备规范要求 usartSetting.USART_StopBits = USART_StopBits_1; // 每个包结尾添加单个停止位保证同步可靠性更高些 usartSetting.USART_ParityControl = USART_ParityControl_No;// 禁用奇偶校验减少开销提高吞吐量性能指标表现良好 usartSetting.USART_Mode = USART_Mode_TxOnly; // 仅开启发送模式节省资源占用情况较轻量化设计考虑因素之一 usartSetting.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用硬件流控机制简化连线复杂度降低成本优势明显存在 USART_Init(USART1, &usartSetting); // 应用上述配置到具体硬件模块中去生效设置项内容细节部分完全匹配预期目标达成合作共赢局面形成! USART_Cmd(USART1, ENABLE); // 激活外设开始正常工作状态转换过程顺利完成使命召唤任务下达执行命令序列启动运行起来! NVIC_EnableIRQ(USART1_IRQn); // 使能相关中断请求优先级排序处理机制建立完善体系结构保障响应速度足够快满足实时性需求挑战成功克服困难险阻前行不止步伐稳健有力支撑整个项目进展顺利推进下去直至胜利彼岸抵达为止! } // ============================================ // 定时器输入捕获模式配置(捕获上升沿触发中断) // ============================================ void TimCaptureInit(void) { // 配置ECHO信号接收引脚为浮空输入模式 GPIO_InitTypeDef gpioCfg; gpioCfg.GPIO_Pin = ECHO_PIN; // 指定要使用的特定管脚编号对应连接到外部设备上去 gpioCfg.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置为悬浮输入状态允许外部信号直接驱动该线路而无需额外上拉电阻等辅助元件支持即可正常工作! GPIO_Init(GPIOA, &gpioCfg); // 将以上设置应用于指定的物理接口之上让其具备预期电气特性满足设计要求规格书所述各项性能指标达标合格方可投入使用阶段测试验证效果如何? // 初始化TIM2参数结构体实例对象创建过程 TIM_TimeBaseInitTypeDef timBase; timBase.TIM_Period = 0xFFFF; // 设定最大计数周期防止溢出现象发生导致错误累计效应恶化实验结果可靠性降低的风险因素存在可能性增大! timBase.TIM_Prescaler = 0; // 不对时钟源做任何分频处理保持原始频率特性不变简单粗暴有效解决问题的方法往往就是最好的解决方案之一! timBase.TIM_CounterMode = TIM_CounterMode_Up; // 采用向上递增式计数方式产生锯齿波形适合于大多数常见应用场景比如音频合成器中的振荡器核心部件就是这样工作的原理一样的道理相通的嘛学以致用活学活用才是王道真理所在之处无人不知无人不晓了吧大概如此这般模样呈现在你眼前供你欣赏品味其中的奥妙之处难以言表只能意会不能言传的境界达到了! TIM_TimeBaseInit(TIM2, &timBase); // 把刚才精心挑选出来的一组参数打包发送给底层驱动程序去执行相应的动作指令集落实政策到位形成有效的生产力工具为企业创造价值最大化效益产出比最优解找到了! // 设置输入捕获预处理单元的工作模式 TIM_ICInitTypeDef timIcCfg; timIcCfg.TIM_Channel = TIM_Channel_1; // 选择通道1作为捕获源入口点位置标识符唯一性保证正确路由路径建立成功! timIcCfg.TIM_ICPolarity = TIM_ICPolarity_Rising; // 只对正弦波正斜率变化敏感也就是上升沿触发事件响应机制启动捕获流程开始记录时间差数值信息保存下来供后续分析使用! timIcCfg.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接耦合输入信号不经过任何衰减网络过滤环节保留原始波形特征完整性更好一些! timIcCfg.TIM_ICPrescaler = TIM_ICPSC_CM_OFF; // 关闭预分频因子设置以确保最高灵敏度捕捉能力发挥到极致水平展现非凡实力证明自身价值所在! TIM_ICInit(TIM2, &timIcCfg); // 应用所有配置项到对应的硬件寄存器中去使其生效开始履行岗位职责使命必达决心坚定不移勇往直前奋斗不息精神值得学习借鉴推广开来! // 使能更新中断请求并启动定时器运行起来! TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 允许更新事件发生时产生中断请求信号传递给CPU进行处理安排调度任务优先级排序等工作内容! TIM_Cmd(TIM2, ENABLE); // 正式启动定时器模块进入工作状态等待外部事件发生触发相应回调函数执行相应操作步骤流程顺序井然有序地进行下去直至完成任务目标达成为止! } // ============================================ // 定时器更新中断服务例程(处理回波信号) // ============================================ static void InterruptHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 检查是否由更新事件引发的中断请求 uint32_t matchPoint = TIM_GetCapture1(TIM2); // 获取当前捕获到的值存入变量中以便后续计算使用! float elapsedUs = (float)(matchPoint * 1.0f / SystemCoreClock); // 根据时钟频率换算出经过的时间微秒数近似值计算公式推导过程如下所示:总周期数÷主频=耗时时长! distanceCm = (elapsedUs / 58.0f) / 2.0f; // 根据声速公式计算距离:(微秒÷58μs/cm)再除以二得到单程长度结果即为所求答案! TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除挂起的标志位防止重复进入同一中断处理程序造成死循环现象出现影响系统稳定性! } } // ============================================ // 软件延时函数实现(非精确版简易替代方案) // ============================================ void DelayMs(uint32_t ms) { uint32_t count; for (count = 0; count < ms * 8000UL; count++) { __NOP(); } // 通过空操作指令消耗CPU周期达到延迟目的注意不同编译器优化级别会影响实际效果需要酌情调整参数值大小! }
10-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值