学习资料网站
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::bind())在使用时,是对参数直接拷贝,而不是引用。
linux c
注意临界区内所有跳转语句(函数调用,goto,longjump,break等),若跳转去的地方仍在临界区内,可以忽略解锁动作,若在临界区外,则必须先解锁再跳转。
python
python执行命令行:
- os.system() # 返回指令执行的状态码
- os.popen() # 返回指令执行中的输出内容
- subprocess.popen() # subprocess用来取代一些旧的模块方法
- subprocess.call()
- subjprocess.getstatusoutput() # 返回元组 (执行状态, 输出结果)
工具
dia
一个linux平台上的类似visio的画图工具
wsl2 proxy
在宿主windows上
- 配置好http_proxy,保证正常运行
- 关闭防火墙
- 开启代理软件的
允许来自局域网的链接选项 - 记录http_proxy端口号。可在系统设置、或者代理软件中查看。
在wsl2上
-
确定wsl2访问windows使用的ip地址
cat /etc/resolv.conf -
配置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 -
检查是否配置成功,
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,它是较新的汉字编码标准
进程的终止
正常终止:
- 从main返回
- 调用exit
- 调用_exit或_Exit
- 最后一个线程从其启动例程返回
- 最后一个线程调用pthread_exit
异常终止
- 调用abort
- 接到信号并终止
- 最后一个线程对其取消请求作出相应
shell
<c-r>搜索历史命令
journal -u <unit> 查看特定的系统日志,类似命令可与less/more、grep、tail等连用
grep
遍历当前目录并查找文件中内容:
grep -r "content_to_find" .
计算文件中
a出现的次数:
tr -cd 'a' < file | wc -c
tr对file进行处理,-c表示反选,-d表示删除,即删除a以外的字符,使用wc计算次数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调试
[置顶]既然大家都收藏了,给看下我的笔记,欢迎来补充更正呀~~
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 changed.
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)
$@表示当前规则的目标。以下代码中$@表示$(EXEC)$(EXEC): $(OBJS) $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)$<表示当前规则中的第一个依赖项(Dependency)。以下代码中$<表示.cpp文件,%表示模式匹配%.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@$^表示当前规则中的所有依赖项(Dependency)。
寻找文件
将当前目录下所有的.cpp文件赋值给SRCS变量
SRCS := $(wildcard *.cpp)
字符替换
- 直接替换
$(SRCS:.cpp=.o)将文件后缀从.cpp换成.o - 使用
$(patsubst <pattern>,<replacement>,<text>)替换
关于*和%,两者都可以当通配符使用,但是*只能匹配0个或多个字符,而%只能匹配1至多个字符,而且*可以在表达式中多次出现,而%只能出现一次。
*匹配每个匹配的文件,%匹配任何匹配的文件
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使用
cmake
target_link_libraries(target libs)中target应与add_executable指定的一致。
tmux
tmux vi-mode
- 将
setw -g mode-keys vi写入~/.tmux.conf - 使用
<c-b> [进入vi模式 <space>开始选择文本,,<enter>确定文本,<c-b> ]粘贴,或者粘贴 q,<enter>,A退出vi模式
vim操作
vim宏录制功能
q [key]按q和某个按键开始录制- .....(操作).....
q结束录制- 使用
@ + [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>回溯调用栈 tp, tn上一个下一个同名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