tech_tips

学习资料网站

https://csdiy.wiki/

stm32

使用stm32cube导出的makefile工程:

make进行编译,想要添加自己的c文件需要修改makefile,但打开cubemx时Makefile文件无法修改,需要另外复制一个,并在使用make命令的时候用-f指定它,生成clangd需要的compile_commands.json需要使用compiledb工具,加在make命令前,如:compiledb make -f _Makefile -j10

(compiledb在纯Makefile工程中起作用,在一些通过cmake生成的Makefile工程中很多编译命令无法记录)

openocd完成二进制文件烧录,需要下载一些特定芯片的配置文件,常见芯片的cfg文件一般都有
一般通过openocd -f *.cfg进入openocd调试,可通过telnet连接到本地端口,常用openocd命令:
init, halt, reset halt, flash [your_image] [addr], shutdown

可以通过arm-none-eabi-gdb进行调试,
连接到openocd:
target remote localhost:3333
加载二进制文件:
file [your_hex]

编程

c++

关于std::ref()

考虑函数时编程(如std::bind())在使用时,是对参数直接拷贝,而不是引用。

linux c

注意临界区内所有跳转语句(函数调用,goto,longjump,break等),若跳转去的地方仍在临界区内,可以忽略解锁动作,若在临界区外,则必须先解锁再跳转。

python

python执行命令行:

  1. os.system() # 返回指令执行的状态码
  2. os.popen() # 返回指令执行中的输出内容
  3. subprocess.popen() # subprocess用来取代一些旧的模块方法
  4. subprocess.call()
  5. subjprocess.getstatusoutput() # 返回元组 (执行状态, 输出结果)

工具

dia

一个linux平台上的类似visio的画图工具

wsl2 proxy

在宿主windows上

  1. 配置好http_proxy,保证正常运行
  2. 关闭防火墙
  3. 开启代理软件的允许来自局域网的链接选项
  4. 记录http_proxy端口号。可在系统设置、或者代理软件中查看。

在wsl2上

  1. 确定wsl2访问windows使用的ip地址

    cat /etc/resolv.conf
  2. 配置wsl2的http_proxy

    export http_proxy=http://$proxy_server:$proxy_port
    export HTTP_PROXY=$http_proxy
    export https_proxy=$http_proxy
    export HTTPS_PROXY=$http_proxy
  3. 检查是否配置成功,curl -v "https://ip.jackjyq.com"正常会返回代理服务器IP地址

参考

正则表达式

【10分钟快速掌握正则表达式】 https://www.bilibili.com/video/BV1da4y1p7iZ/?share_source=copy_web&vd_source=ff44c1b39d374b93180b2b2b0016efb3

一个帮你读论文的ai: chatpdf

scp

scp从linux上下载文件到本地:

scp usr@ip:/path/to/file.txt /path/to/local
scp -r usr@ip:/path/to/directory /path/to/local

链接

(filezilla更好用)

windows

cmd下使用set variable_name=value设置环境变量,echo %variable_name%可将其打印出来

unix

使用ulimit -c设置core文件大小,可以生成程序意外终止时的现场(core文件),这个core文件可以用gdb进行调试

linux文件转编码可使用dos2uinx工具
windows上转转编码可使用系统记事本,另存为gb18030,它是较新的汉字编码标准

进程的终止

正常终止:

  1. 从main返回
  2. 调用exit
  3. 调用_exit或_Exit
  4. 最后一个线程从其启动例程返回
  5. 最后一个线程调用pthread_exit

异常终止

  1. 调用abort
  2. 接到信号并终止
  3. 最后一个线程对其取消请求作出相应

shell


<c-r>搜索历史命令

journal -u <unit> 查看特定的系统日志,类似命令可与less/moregreptail等连用

grep

遍历当前目录并查找文件中内容:

grep -r "content_to_find" .

计算文件中a出现的次数:

  1. tr -cd 'a' < file | wc -c
    tr对file进行处理,-c表示反选,-d表示删除,即删除a以外的字符,使用wc计算次数
  2. grep -o 'a' file | wc -l
    grep对文件内容进行过滤,-o表示只过滤出匹配的内容(而不是默认打印存在匹配项的整行),然后用wc计算匹配次数

ods

pgrep, pkill, pidwait - look up, signal, or wait for processes based on name and other attributes

trap "kill $pid" INT TERM在发送终止信号给对应程序时也会使后台运行的程序终止

gdb调试


gdb基本

i [item] 显示某类信息(info),常用i b(break points),i f(frame)函数帧,i funtions函数,i locals显示所有局部变量

b [where] 打断点(breakpoint),可以是行号,可以是函数名,b *[num]表示在[num]地址打断点

d [num] 删除(delete)某个断点(breakpoint),若没有参数则全部删除,clear [行号/函数名]清除断点

disable/enable num 禁用/启用编号为[num]的断点,

r 运行(run)

c 继续运行(continue)

n 运行到下一行(next)

l [num] 显示(list)num附近10行(default),连续使用l会显示接下来的内容

p [var] 打印(print)某个变量的值,也可计算任何跟此var相关的公式。p $reg打印寄存器的值。

格式化字符 含义
x 十六进制 p/x sum
d 十进制
u 十六进制显示无符号整型
o 八进制
t 二进制
a 十六进制
c 字符格式显示
f 浮点数
数组打印

set print elements [num] 默认打印200个,设置打印个数

set print elements 0 不限制打印个数

print *(arr + [起始地址])@[num] 选择打印数组范围

set print array-indexes on 打印数组内容同时显示数组下标

内存打印
x/nfu addr

f格式打印从addr开始的n个长度单元为u的内存值

参数 含义
n 输出单元个数
f 输出格式
u 表明一个单元长度。b(yte):1字节,h(alfword):2字节,w(ord):4字节,g(iat word):8字节

<enter> 重复上一条命令

函数调试

bt 打印当前函数调用栈(backtrace)信息,bt full 显示所有堆栈的所有参数信息

s 单步运行(step),遇到函数跳入

finish 执行完函数剩余代码。返回最终函数执行结果

return [return_value] 直接返回,不执行完该函数剩余代码,如果函数有返回值,可以指定返回值

小想法:c程序的栈是在高地址空间,从上往下累加,被调用的栈地址更低,所以down是进入callee,up是返回caller

在调用栈中往上跳一个层级:up,在调用栈中往下跳一个层级:down,跳到某个特定的层级:frame [num],其中num是栈的标号。

watch [EXPRESSION] 监控某个表达式的值是否发生变化。1. 变量 2. 内存的值。info watch 查看当前watch的信息

ref

油管评价很高的GDB课件,包括段错误调试(指针传参小程序)递归调试(阶乘程序)。英语6级水平或雅思6.5轻松能听懂,有字幕难懂词汇有标注,C语言英语来一起卷吧。 链接

陈皓coolshell网 gdb调试

GDB调试命令

[置顶]既然大家都收藏了,给看下我的笔记,欢迎来补充更正呀~~

06: 23 run
15.14 quit
10:46 list 显示当前命令行起的十行commond
07:24 break  设置断点 (可段在命令行/b L_number,也可在子程序/ b fun_ name) (信息行func里面,显示的是当前参数的值) 指针如果接受到地址的话,会正确显示。
next
12:06 print 【variable】的值 也可计算任何跟此var相关的公式。

15:47 example: 段错误调试
19:18 up (当前命令行/函数是谁在调用,也就是让GDB显示上一步的命令)
/down 指针B(函数名) 调试  (call stack)整个action 称作此。
21:44 display (variable)/undisplay (current item number) 查看variable(int)看值的变化,or variable(pointer)看指针地址变化,就可以找到指针丢失的那条命令。
26:30 backtrace  (函数里面)查看所有的display内容。

27:19 example:阶乘递归调试
29:55 step in (函数里面) go into 函数,函数里面的语句逐条调试
31:57 continue
34:40 finish 当前函数,显示函数变量们的值

38:00 example 4 
40:16 watch  watchpoint  (var)  observe var  has ​change​d. 
44:08 info  b/variable
44:28 delete Number
47:15 whatis  查变量属性

48:29 example 5
49:43 target record-full
52:00 reverse  倒运行 /step /c
52,55 set var "变量名= value“  重设变量值 ​

makefile

makefile示例

SRC_DIR = ./src
INCLUDE_DIR = ./include E:/Softs/opencv/opencv_mingw_3.4.16/include 
LIB_DIR = E:/Softs/opencv/opencv_mingw_3.4.16/x64/mingw/lib
OBJ_DIR = ./obj

# process the strings
INCLUDE_DIR := $(patsubst %, -I%, $(INCLUDE_DIR))
# ld libs
LDLIBS := $(patsubst $(LIB_DIR)/lib%.a, -l%, $(LDLIBS))

SRCS = $(wildcard $(SRC_DIR)/*.cpp)

# OBJS = $(patsubst $(SRC_DIR)%.cpp, %.o, $(SRCS))
OBJS = $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRCS))

# compile flags
CXX = g++
CXXFLAGS = -std=c++11 $(INCLUDE_DIR) -g
LDFLAGS = -L$(LIB_DIR)
LDLIBS = $(wildcard $(LIB_DIR)/*.dll.a)

EXEC = run.exe 

# target and rules
all: $(EXEC) # default target

$(EXEC): $(OBJS)
    @echo "linking libs: $(LDLIBS)"
    $(CXX) $(LDFLAGS) -o $@ $^ $(LDLIBS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp # 
    $(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm -f $(EXEC) $(OBJS)
  1. $@表示当前规则的目标。以下代码中$@表示$(EXEC)
    $(EXEC): $(OBJS)
    $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
  2. $<表示当前规则中的第一个依赖项(Dependency)。以下代码中$<表示.cpp文件,%表示模式匹配
    %.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
  3. $^表示当前规则中的所有依赖项(Dependency)。

寻找文件

将当前目录下所有的.cpp文件赋值给SRCS变量

SRCS := $(wildcard *.cpp)

字符替换

  1. 直接替换$(SRCS:.cpp=.o)将文件后缀从.cpp换成.o
  2. 使用$(patsubst <pattern>,<replacement>,<text>)替换

关于*%,两者都可以当通配符使用,但是*只能匹配0个或多个字符,而%只能匹配1至多个字符,而且*可以在表达式中多次出现,而%只能出现一次。

*匹配每个匹配的文件,%匹配任何匹配的文件

关于模式匹配: makefile中%和*之间的区别是什么

OBJS = $(SRCS:.cpp=.o)
# or OBJS = $(patsubst %.cpp, %.o, $(SRCS))
# $(patsubst <pattern>,<replacement>,<text>)

赋值符

= 延时赋值,当变量被使用时才会被赋值

:= 立即赋值,变量的值将立即展开

?= 当变量未定义时才赋值

+= 在变量后追加值

!= 通过命令给变量赋值,DATE != date +%Y-%m-%d 为当前日期赋值

.PHONY

.PHONY 是一个特殊的目标,用于定义伪目标(phony target)。伪目标是那些不产生实际输出文件的目标,而是用于指定一组操作的名称。.PHONY 目标告诉Make工具,不管是否存在同名的文件,都要执行其定义的操作,而不会对文件进行依赖性检查。

fzf使用

fzf使用笔记

cmake

target_link_libraries(target libs)中target应与add_executable指定的一致。

tmux

tmux vi-mode

  1. setw -g mode-keys vi写入~/.tmux.conf
  2. 使用<c-b> [进入vi模式
  3. <space>开始选择文本,,<enter>确定文本,<c-b> ]粘贴,或者粘贴
  4. q<enter>A退出vi模式

vim操作


vim宏录制功能

  1. q [key] 按q和某个按键开始录制
  2. .....(操作).....
  3. q 结束录制
  4. 使用@ + [key] 进行宏操作,[key]即之前使用的按键,也可使用@ @执行上一次宏操作

vim寄存器

https://blog.csdn.net/alwaysbefine/article/details/122172503
https://blog.csdn.net/lanuage/article/details/125096107

vim符号跳转相关,ctags

ctags -R . 生成tag文件,在有tags文件目录下使用vim -t main可直接从main()开始阅读, <c-]>查看定义,<c-t>回溯调用栈 tptn上一个下一个同名tag

缩进

>4j缩进当前行和下4行

类似的操作还有gc4j注释当前行和下4行

选中

选中当前词,vaw选中词以及相连的符号如(){}:,;

yap复制连续的内容

搜索

# * 搜索当前词

居中

zz居中当前行

大小写切换

gu转为小写,gU转为大写

打开文件或网址

gf 打开文件,gx 打开网址

数字

<c-a>数字递增,<c-x>数字递减

odds

在某些设置下,<tab>被自动转换成空格,可用<c-v-i>插入<tab>

:.,.+4s/;/, 将4行文本末尾的;替换为,


收益率超过6%就要打问号,超过8%就很危险,10%以上就要准备损失全部本金

陈皓访谈

ssrc校验相关
https://blog.csdn.net/renhui1112/article/details/127151248

TBD: To Be Determined / To Be Decided

TBC: To Be Confirmed

TBA: To Be Announced

WIP: Work In Progress

TBR: To Be Resolved

TBF: To Be Fixed

TBP: To Be Planned

TBN: To Be Noted

TBC: To Be Checked

TBU: To Be Updated

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇