-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
4126 lines (3999 loc) · 183 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://xstarling.gitee.io</id>
<title>林星</title>
<updated>2024-07-08T09:47:09.120Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://xstarling.gitee.io"/>
<link rel="self" href="https://xstarling.gitee.io/atom.xml"/>
<subtitle>温故而知新</subtitle>
<logo>https://xstarling.gitee.io/images/avatar.png</logo>
<icon>https://xstarling.gitee.io/favicon.ico</icon>
<rights>All rights reserved 2024, 林星</rights>
<entry>
<title type="html"><![CDATA[Linux中__init和__exit]]></title>
<id>https://xstarling.gitee.io/9tbat_4xC/</id>
<link href="https://xstarling.gitee.io/9tbat_4xC/">
</link>
<updated>2023-07-21T08:40:38.000Z</updated>
<content type="html"><![CDATA[<h1 id="1-__init和__exit的作用">1. __init和__exit的作用</h1>
<p>参考博客链接:<a href="https://www.cnblogs.com/linengier/p/12380780.html">linengier-linux kernel __init和__exit宏</a></p>
<ul>
<li>会在编译的时候,将对应的代码段放入到 <code>.init.text</code>段内存中,起一个标识作用</li>
</ul>
<h1 id="2-源码剖析">2. 源码剖析</h1>
<blockquote>
<p>linux4.14/include/linux/init.h</p>
</blockquote>
<pre><code class="language-c">/* These are for everybody (although not all archs will actually
discard it in modules) */
#define __init __section(.init.text) __cold __inittrace __latent_entropy __noinitretpoline
#define __initdata __section(.init.data)
#define __initconst __section(.init.rodata)
#define __exitdata __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[基于虚拟机的驱动程序开发]]></title>
<id>https://xstarling.gitee.io/lw5QlVMqW/</id>
<link href="https://xstarling.gitee.io/lw5QlVMqW/">
</link>
<updated>2023-07-19T01:56:17.000Z</updated>
<content type="html"><![CDATA[<h1 id="1-问题汇总">1. 问题汇总</h1>
<h3 id="11-把编译好的ko文件加载模块时出错error-could-not-insert-module-hello_worldko-invalid-module-format">1.1 把编译好的.ko文件加载模块时出错:Error: could not insert module hello_world.ko: Invalid module format</h3>
<blockquote>
<p>编译.ko文件的内核源码和工具链,与目标源码的内核源码和运行环境不匹配</p>
</blockquote>
<h3 id="12-nfs文件系统搭建好传输文件报错touch-cannot-touch-testc-read-only-file-system">1.2 nfs文件系统搭建好,传输文件报错:touch: cannot touch `test.c': Read-only file system</h3>
<blockquote>
<ul>
<li>mount -o remount rw / :检查文件系统是否挂载正常</li>
<li>检查 <code>/etc/exports</code> 文件配置是否正确,nfs-server释放正常启动</li>
<li>service nfs-server start/status/stop</li>
</ul>
</blockquote>
<h3 id="13-export_symbolvar导出static修饰变量报错homelearnsoftwareworksdriversmodule_symbolmodule_paramo-error-local-symbol-itype-was-exported">1.3 EXPORT_SYMBOL(var):导出static修饰变量报错:/home/learn/software/works/drivers/module_symbol/module_param.o: error: local symbol 'itype' was exported</h3>
<blockquote>
<p>取消对应变量的static关键字<br>
<a href="https://zhuanlan.zhihu.com/p/27586298">static、extern关键字说明</a></p>
</blockquote>
<h1 id="2-hello驱动加载学习">2. hello驱动加载学习</h1>
<h3 id="21-实验环境">2.1 实验环境</h3>
<ul>
<li>开发版烧录号ubuntu/Debian镜像</li>
<li>启动开发版,搭建好nfs客户端,挂载共享文件夹</li>
<li>获取Debian镜像的内核源码并编译</li>
<li>下载交叉编译工具链</li>
</ul>
<h3 id="22-编译41971版本内核">2.2 编译4.19.71版本内核</h3>
<p><strong>2.2.1 下载镜像源文件</strong></p>
<p><strong>2.2.2 安装交叉编译工具链</strong></p>
<p><strong>2.2.3 编译内核设置编译路径</strong></p>
<p>deb_distro=bionic</p>
<p>DISTRO=stable</p>
<p>build_opts="${build_opts} O=/home/pi/build"</p>
<p>make ${build_opts} npi_v7_defonfig</p>
<p>make ${build_opts}</p>
<p>make ${build_opts} bindeb-pkg</p>
<h3 id="23-内核模块头文件">2.3 内核模块头文件</h3>
<ul>
<li>#include<linux/module.h>:包函内核模块信息声明的相关函数</li>
<li>#include<linux/init.h>:包含了module_init()和module_exit()函数的</li>
<li>#include<linux/kernel.h>:包含内核提供的各种函数,如printk()</li>
</ul>
<h3 id="24-内核模块打印函数">2.4 内核模块打印函数</h3>
<ul>
<li>
<p>printf:glibc实现的打印函数,工作与用户空间</p>
</li>
<li>
<p>printk:内核模块无法使用glibc库函数,内核自身实现的一个类printf函数,但是需要指定打印等级。</p>
<ul>
<li>#define KERN_EMEGR "<0>"通常是系统崩溃前的信息</li>
<li>#define KERN_ALERT "<1>"需要立即处理的消息</li>
<li>#define KERN_CRIT "<2>"严重情况</li>
<li>#define KERN_ERR "<3>"错误情况</li>
<li>#define KERN_WARNING "<4>"有问题的情况</li>
<li>#define KERN_NOTICE "<5>"注意信息</li>
<li>#define KERN_EMEGR "<6>"普通信息</li>
<li>#define KERN_EMEGR "<7>"调试信息</li>
</ul>
</li>
</ul>
<p><strong>查看当前系统printk打印等级</strong>:cat /proc/sys/kernel/printk</p>
<ul>
<li>当前控制台日志级别(第一数字)</li>
<li>默认消息日志级别(第二数字)</li>
<li>最小的控制台级别(第三数字)</li>
<li>默认控制台日志级别(第四数字)</li>
</ul>
<blockquote>
<p>//使用系统默认打印级别———(默认的打印级别 < 当前打印级别)不能打印<br>
printk("[default] Hello World Module init\n");</p>
</blockquote>
<p><strong>打印内核所有打印信息</strong>:dmesg</p>
<ul>
<li>内核log缓冲区大小有限制,缓冲区数据可能被冲掉</li>
</ul>
<h3 id="25-makefile分析">2.5 Makefile分析</h3>
<ul>
<li>KERNEL_DIR:指向Linux内核具体路径</li>
<li>export:导出变量给子Makefile使用</li>
<li>obj-m := <模块名>.o :定义要生成的模块</li>
<li>$(MAKE):Makefile的默认变量,值为make</li>
<li>选型“-C”:让make工具跳转到Linux内核目录下读取顶层Makefile</li>
<li>M=:表示内核模块源码目录</li>
<li>$(CURDIR):Makefile默认变量,值为当前目录所在路径</li>
<li>make modules:执行Linux顶层Makefile的伪目标,它实现内核模块的源码读取并且编译为#.ko#文件</li>
</ul>
<h3 id="25-编译内核模块">2.5 编译内核模块</h3>
<pre><code class="language-shell">make
</code></pre>
<h3 id="26-把生成的内核模块拷贝到nfs共享目录">2.6 把生成的内核模块拷贝到nfs共享目录</h3>
<pre><code class="language-shell">make copy
</code></pre>
<h3 id="27-开发版加载-卸载及查看内核模块">2.7 开发版加载、卸载及查看内核模块</h3>
<p>insmod xxx.ko //加载内核模块</p>
<p>lsmod | grep "hello" //查看内核模块</p>
<p>rmmod //卸载内核模块</p>
<h3 id="28-代码">2.8 代码</h3>
<h4 id="281-c代码">2.8.1 c代码</h4>
<pre><code class="language-c">#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
/*
* __init:是一个空的宏定义,用于标识当前函数为初始化函数
*/
static int __init hello_init(void){
//设置最高级别打印信息
printk(KERN_EMERG "[KERN_EMERG] Hello World Module init\n");
//使用系统默认打印级别———(默认的打印级别 < 当前打印级别)不能打印
printk("[default] Hello World Module init\n");
return 0;
}
static void __exit hello_exit(void){
printk("[default] good bye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL2");
MODULE_AUTHOR("xlx");
MODULE_DESCRIPTION("Welcome Ling driver");
MODULE_ALIAS("Ling:hello");
</code></pre>
<h4 id="282-make代码">2.8.2 make代码</h4>
<pre><code class="language-make"># 内核源码路径
#KERNEL_DIR = /home/learn/software/kernel/linux-5.19/
KERNEL_DIR = /usr/src/linux-headers-5.19.0-46-generic/
#ARCH=x86
#CROSS_COMPILE=
#export ARCH CROSS_COMPILE
obj-m := hello.o
all:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules
.PHONE:clean copy
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean
copy:
sudo cp *.ko /home/learn/software/kernel/linux-5.19/drivers/ling
</code></pre>
<h1 id="3-内核模块和符号共享">3. 内核模块和符号共享</h1>
<h3 id="mobaxterm设置窗口行数列数">mobaxterm设置窗口行数,列数</h3>
<p>liux终端窗口</p>
<ul>
<li>查看终端窗口的行列:stty size</li>
<li>设置终端窗口列数:stty cols xxx</li>
<li>设置终端窗口行数:stty rows xxx</li>
</ul>
<p>mobaxterm窗口</p>
<ul>
<li>右击会话窗口,选择“edit session” --- “Terminal settings” --- “Terminal font settings” --- “Terminal size”</li>
</ul>
<h3 id="模块参数">模块参数</h3>
<blockquote>
<p>参考视频链接:<a href="https://www.bilibili.com/video/BV1C64y1z7WL/?spm_id_from=333.337.search-card.all.click&vd_source=9752c2c90782ff8bd76174dfbc76c933">[Linux]内核模块参数和导出符号,增强你的内核模块功能_哔哩哔哩_bilibili</a></p>
</blockquote>
<p>根据不同应用场合给内核模块传递不同参数,提高内核模块灵活性</p>
<ul>
<li>
<p>定义一个常见变量</p>
</li>
<li>
<p>使用module_param宏把传参值赋给变量</p>
<blockquote>
<p>module_param(name,type,perm)</p>
<ul>
<li>
<p>name:参数名</p>
</li>
<li>
<p>type:参数类型,如:int,byte(对应char),bool,charp(对应char*)......</p>
</li>
<li>
<p>perm:读写权限</p>
<ul>
<li>不允许设置可执行权限</li>
<li>在“sys/module/模块名/parameters”目录下,会生成该参数对应的文件名(perm=0,则不会生成参数对应的文件名)</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="符号共享">符号共享</h3>
<p>内核模块可以共享导出的符号表</p>
<ul>
<li>变量共享</li>
<li>函数共享</li>
</ul>
<pre><code class="language-c">EXPORT_SYMBOL(sym)
//sym:变量名或函数名
</code></pre>
<p>查看符号表</p>
<pre><code class="language-shell">cat /proc/kallsyms | grep xxx
</code></pre>
<p>Makefile修改</p>
<ul>
<li>有依赖关系的模块,放在一起进行编译</li>
<li>clean伪目标增加清除共享文件夹指令</li>
</ul>
<p>模块手动加载</p>
<ul>
<li>加载是,必须先加载相关依赖模块</li>
<li>卸载时,顺序想法</li>
</ul>
<p>模块自动加载</p>
<ul>
<li>
<p>所有内核模块统一放到“/lib/modules/内核版本”目录下</p>
<pre><code class="language-shell">cp *.ko /lib/modules/内核版本 //此目录用来存放当前操作系统的.ko文件
</code></pre>
</li>
<li>
<p>建立模块依赖关系</p>
<pre><code class="language-shell">depmod -a
</code></pre>
</li>
<li>
<p>查看模块依赖关系</p>
<pre><code class="language-shell">cat /lib/modules/内核版本/modules.dep
</code></pre>
</li>
<li>
<p>加载模块及其他依赖模块</p>
<pre><code class="language-shell">modprobe xxx
</code></pre>
</li>
<li>
<p>卸载模块及其依赖模块</p>
<pre><code class="language-shell">modprobe -r xxx
</code></pre>
</li>
</ul>
<h3 id="附件代码示例">附件代码示例</h3>
<h4 id="module_paramc代码">module_param.c代码</h4>
<pre><code class="language-c">#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
static int itype = 0;
module_param(itype, int, 0);
static bool btype = 0;
module_param(btype, bool, 0644);
static char ctype = 0;
module_param(ctype, byte, 0);
static char* stype = 0;
module_param(stype, charp, 0644);
static int __init param_init(void){
printk(KERN_ALERT "param init\n");
printk(KERN_ALERT "itype=%d\n",itype);
printk(KERN_ALERT "btype=%d\n",btype);
printk(KERN_ALERT "ctype=%d\n",ctype);
printk(KERN_ALERT "stype=%s\n",stype);
return 0;
}
static void __exit param_exit(void){
printk(KERN_ALERT "module exit\n");
}
EXPORT_SYMBOL(itype);
int my_add(int a,int b){
return a + b;
}
EXPORT_SYMBOL(my_add);
int my_sub(int a,int b){
return a - b;
}
EXPORT_SYMBOL(my_sub);
module_init(param_init);
module_exit(param_exit);
MODULE_LICENSE("GPL2");
MODULE_AUTHOR("xlx");
MODULE_DESCRIPTION("module_param");
MODULE_ALIAS("Ling:module_param");
</code></pre>
<h4 id="calculationh代码">calculation.h代码</h4>
<pre><code class="language-c">#ifndef __CALCULATION_H__
#define __CALCULATION_H__
extern int itype;
int my_add(int a,int b);
int my_sub(int a,int b);
#endif
</code></pre>
<h4 id="calculationc代码">calculation.c代码</h4>
<pre><code class="language-c">#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include "calculation.h"
static int __init calculation_init(void){
printk(KERN_ALERT "calculation init\n");
printk(KERN_ALERT "itype + 1=%d,itype - 1=%d\n",my_add(itype, 1),my_sub(itype, 1));
return 0;
}
static void __exit calculation_exit(void){
printk(KERN_ALERT "calculation exit\n");
}
module_init(calculation_init);
module_exit(calculation_exit);
MODULE_LICENSE("GPL2");
MODULE_AUTHOR("xlx");
MODULE_DESCRIPTION("calculation module");
MODULE_ALIAS("Ling:calculation module");
</code></pre>
<h1 id="4-字符设备">4. 字符设备</h1>
<p>copy</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[基于555定时器的波形转换]]></title>
<id>https://xstarling.gitee.io/BRVneXEB3/</id>
<link href="https://xstarling.gitee.io/BRVneXEB3/">
</link>
<updated>2023-06-17T04:30:07.000Z</updated>
<content type="html"><![CDATA[<h1 id="1-前期知识准备">1. 前期知识准备</h1>
<ul>
<li>
<p>555定时器<br>
参考视频链接:<a href="https://www.bilibili.com/video/BV1fr4y1r7Tk/?spm_id_from=333.337.search-card.all.click&vd_source=9752c2c90782ff8bd76174dfbc76c933">爱上半导体-555定时器</a></p>
<ol>
<li>
<p>比较器和RS触发器<br>
比较器:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061352535.png" alt="" loading="lazy"><br>
RS触发器:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061354076.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061355695.png" alt="" loading="lazy"></p>
</li>
<li>
<p>原理图<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306052325437.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061400832.png" alt="" loading="lazy"></p>
</li>
<li>
<p>工作模式</p>
</li>
</ol>
<blockquote>
<p>无稳态电路<br>
单稳态电路<br>
双稳态电流<br>
1. 基本无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060903849.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060923462.png" alt="" loading="lazy"><br>
2. 任意占空比的无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060929125.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060931983.png" alt="" loading="lazy"><br>
3. 50%占空比无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060933131.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060934400.png" alt="" loading="lazy"><br>
<strong>注意</strong>:<br>
应用此电路时要注意,电阻R1不能太小,否则会影响电容C1的充电,导致占空比不是50%。<br>
4. 单稳态模式<br>
在单稳态电路中,输出端保持低电平,在输入端触发之后,输出端变成高电平,延时一段时间后回到低电平并保持。这个特性可以用来制作延时开关。原理图如下:<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060938425.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061335617.png" alt="" loading="lazy"><br>
1. 双稳态模式<br>
双稳态电路指的是输出端可以稳定在高电平或低电平两种状态,可以通过开关在两个状态间切换。这个特性可以用来制作按钮开关。<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061336661.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061340725.png" alt="" loading="lazy"></p>
</blockquote>
</li>
</ul>
<blockquote>
<p><strong>滤波原理</strong>:<br>
参考视频链接:<a href="https://www.bilibili.com/video/BV1ri4y1y7yG/?spm_id_from=333.999.0.0&vd_source=9752c2c90782ff8bd76174dfbc76c933">爱上半导体-滤波器</a></p>
</blockquote>
<ul>
<li>高通滤波器<br>
https://zhuanlan.zhihu.com/p/347963026
<ul>
<li>电路图<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306161448043.png" alt="" loading="lazy"></li>
</ul>
</li>
<li>低通滤波器<br>
https://zhuanlan.zhihu.com/p/347963026
<ul>
<li>电路图<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306161426110.png" alt="" loading="lazy"></li>
<li>电路容抗<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306161436378.png" alt="" loading="lazy"></li>
</ul>
</li>
<li>带通滤波器<br>
https://zhuanlan.zhihu.com/p/347963026</li>
</ul>
<blockquote>
<p>参考博客链接:<a href="https://blog.csdn.net/bigbearger/article/details/104573802">bigbearger-带通滤波器</a><br>
可以由低通滤波和高通滤波进行组合</p>
</blockquote>
<ul>
<li>
<p>差分比例运放电路<br>
知识点:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062106283.png" alt="" loading="lazy"><br>
差分电路改进:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062111183.png" alt="" loading="lazy"></p>
</li>
<li>
<p>积分电路设计<br>
参考链接:<a href="https://zhuanlan.zhihu.com/p/52899137">积分,微分电路</a><br>
参考视频链接:<a href="https://www.bilibili.com/video/BV17y4y1R7zX/?spm_id_from=333.337.search-card.all.click&vd_source=9752c2c90782ff8bd76174dfbc76c933">电子科技队长</a><br>
知识点:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062017211.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062020616.png" alt="" loading="lazy"><br>
积分电路应用:</p>
</li>
<li>
<p>同向积分电路<br>
知识点:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062124150.png" alt="" loading="lazy"></p>
</li>
<li>
<p>微分电路设计<br>
参考链接:<a href="https://zhuanlan.zhihu.com/p/52899137">积分,微分电路</a><br>
参考视频链接:<a href="https://www.bilibili.com/video/BV16A411m7Su/?spm_id_from=pageDriver&vd_source=9752c2c90782ff8bd76174dfbc76c933">微分电路</a><br>
知识点:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062154378.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306062156256.png" alt="" loading="lazy"></p>
</li>
<li>
<p>运放和比较器的区别<br>
参考链接:<a href="https://www.bilibili.com/read/cv9412435">运算放大器和比较器区别</a></p>
</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[vscode阅读源码]]></title>
<id>https://xstarling.gitee.io/0MnwBOxFh/</id>
<link href="https://xstarling.gitee.io/0MnwBOxFh/">
</link>
<updated>2023-06-10T15:10:08.000Z</updated>
<content type="html"><![CDATA[<h1 id="1-vscode阅读源码前提条件">1. vscode阅读源码前提条件</h1>
<p>参考博客链接:<a href="https://blog.csdn.net/weixin_40209493/article/details/128175003">Engineer-Jaylen_Sun-VScode+clangd阅读linux内核源码</a></p>
<ul>
<li>clangd插件---安装</li>
<li>禁止c/c++ intellisense:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306102321760.png" alt="" loading="lazy"></li>
<li>源码目录下有compile_commands.json</li>
<li>compile_commands.json里面含有文件,并且修改<code>"cc"</code> 为 <code>"xxx-gcc"</code></li>
</ul>
<pre><code class="language-shell">make clean
bear make ......
</code></pre>
<h1 id="2-vscode快捷键使用">2. vscode快捷键使用</h1>
<p>参考链接:<a href="https://blog.csdn.net/qq_45261963/article/details/108695261">昱Wy-vscode快捷键</a></p>
<figure data-type="image" tabindex="1"><img src="https://33373sl116.zicp.fun:443/image-blog/202306102334075.png" alt="" loading="lazy"></figure>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[gdb调试]]></title>
<id>https://xstarling.gitee.io/KwiVAQPlb/</id>
<link href="https://xstarling.gitee.io/KwiVAQPlb/">
</link>
<updated>2023-06-09T15:09:22.000Z</updated>
<content type="html"><![CDATA[<h2 id="1-gdb基本命令">1. gdb基本命令</h2>
<h3 id="11-gdb安装">1.1 gdb安装</h3>
<ul>
<li>安装命令:</li>
</ul>
<pre><code class="language-shell">sudo apt install gdb
</code></pre>
<ul>
<li>注意<br>
注意,如果服务器没有安装gdb,上面命令自动安装最新的gdb。</li>
</ul>
<h3 id="12-gdb调试准备">1.2 gdb调试准备</h3>
<p>用gcc编译源程序的时候,编译后的可执行文件<strong>默认不包括源程序代码</strong>,如果你打算编译后的程序可以被调试,编译的时候要加<code>-g</code>的参数。<br>
例如:</p>
<pre><code class="language-shell">gcc -g -o test test.c
</code></pre>
<p>在命令行输入如下命令,即可进入gdb调试</p>
<pre><code class="language-shell">gdb test
</code></pre>
<h3 id="13-基本调试命令">1.3 基本调试命令</h3>
<table>
<thead>
<tr>
<th>命令名称</th>
<th>命令缩写</th>
<th>命令说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>run</td>
<td>r</td>
<td>运行一个待调试的程序</td>
</tr>
<tr>
<td>continue</td>
<td>c</td>
<td>让暂停的程序继续运行</td>
</tr>
<tr>
<td>next</td>
<td>n</td>
<td>运行到下一行</td>
</tr>
<tr>
<td>step</td>
<td>s</td>
<td>单步执行,遇到函数会进入</td>
</tr>
<tr>
<td>until</td>
<td>u</td>
<td>运行到指定行停下来</td>
</tr>
<tr>
<td>finish</td>
<td>fi</td>
<td>结束当前调用函数,回到上一层调用函数处</td>
</tr>
<tr>
<td>return</td>
<td>return</td>
<td>结束当前调用函数并返回指定值,到上一层函数调用处</td>
</tr>
<tr>
<td>jump</td>
<td>j</td>
<td>将当前程序执行流跳转到指定行或地址</td>
</tr>
<tr>
<td>print</td>
<td>p</td>
<td>打印变量或寄存器值</td>
</tr>
<tr>
<td>backtrace</td>
<td>bt</td>
<td>查看当前线程的调用堆栈</td>
</tr>
<tr>
<td>frame</td>
<td>f</td>
<td>切换到当前调用线程的指定堆栈</td>
</tr>
<tr>
<td>thread</td>
<td>thread</td>
<td>切换到指定线程</td>
</tr>
<tr>
<td>break</td>
<td>b</td>
<td>添加断点</td>
</tr>
<tr>
<td>tbreak</td>
<td>tb</td>
<td>添加临时断点</td>
</tr>
<tr>
<td>delete</td>
<td>d</td>
<td>删除断点</td>
</tr>
<tr>
<td>enable</td>
<td>enable</td>
<td>启用某个断点</td>
</tr>
<tr>
<td>disable</td>
<td>disable</td>
<td>禁用某个断点</td>
</tr>
<tr>
<td>watch</td>
<td>watch</td>
<td>监视某一个变量或内存地址的值是否发生变化</td>
</tr>
<tr>
<td>list</td>
<td>l</td>
<td>显示源码</td>
</tr>
<tr>
<td>info</td>
<td>i</td>
<td>查看断点 / 线程等信息</td>
</tr>
<tr>
<td>ptype</td>
<td>ptype</td>
<td>查看变量类型</td>
</tr>
<tr>
<td>disassemble</td>
<td>dis</td>
<td>查看汇编代码</td>
</tr>
<tr>
<td>set args</td>
<td>set args</td>
<td>设置程序启动命令行参数</td>
</tr>
<tr>
<td>show args</td>
<td>show args</td>
<td>查看设置的命令行参数</td>
</tr>
</tbody>
</table>
<h2 id="2-调试core文件">2. 调试core文件</h2>
<blockquote>
<p>当程序挂掉时,系统缺省不会生成core文件。<br>
core文件:有问题的程序运行后,产生“段错误 (核心已转储)”时生成的具有堆栈信息和调试信息的文件</p>
</blockquote>
<ul>
<li>
<p>配置core文件</p>
<ol>
<li>ulimit -a 查看系统参数;</li>
<li>ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件;</li>
<li>ulimit -c [filesize] 设置core文件大小,当最小设置为4之后才会生成core文件</li>
<li>ulimit -c unlimit 把core文件的大小设置为无限制;</li>
<li>运行程序,生成core文件;</li>
<li>gdb 程序名 core文件名。</li>
</ol>
</li>
<li>
<p>core文件命名和保存路径<br>
①core文件有默认的名称和路径,但为了方便,我们通常会自己命名和指定保存路径;</p>
</li>
</ul>
<p>②可以通过 <code>/proc/sys/kernel/core_pattern</code> 设置 core 文件名和保存路径,方法如下:</p>
<p><code>echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern</code></p>
<p>命名的参数列表:</p>
<pre><code class="language-shell"> %p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
</code></pre>
<ul>
<li>调试core文件
<ol>
<li>方法1: gdb [exec file] [core file] 然后执行bt看堆栈信息</li>
<li>方法2:gdb -c [core file],然后 file [exec file],最后再使用<code>bt</code>查看错误位置</li>
</ol>
</li>
</ul>
<p><strong>注意</strong>:<code>bt</code>:命令查看程序运行的栈</p>
<h2 id="3-调试正在运行中的程序">3. 调试正在运行中的程序</h2>
<ul>
<li><strong>调试的流程</strong></li>
</ul>
<ol>
<li>ps查看程序的进程ID<br>
<code>ps -aux| grep test</code></li>
<li>启动gdb调试程序<br>
<strong>方式0</strong>:之间通过程序名和pid<br>
<code> gdb 程序名称 -p 进程ID</code><br>
<strong>方式1</strong>:通过–-pid参数来绑定指定的进程程序。<br>
<code> gdb --pid 25552</code><br>
<strong>方式2</strong>:通过程序和进程号来绑定。<br>
<code> gdb test 25552</code><br>
<strong>方式3</strong>:先启动gdb后,通过attach来绑定pid<br>
<code> gdb attach 25552</code></li>
<li>查看程序的栈信息<br>
<code>bt</code></li>
<li>使用gdb的普通调试命令进行程序调试</li>
</ol>
<ul>
<li><strong>调试命令 (缩写) 作用</strong></li>
</ul>
<pre><code class="language-c">(gdb) break (b) 在源代码指定的某一行设置断点,其中xxx用于指定具体打断点位置
(gdb) run (r) 执行被调试的程序,其会自动在第一个断点处暂停执行。
(gdb) continue (c) 当程序在某一断点处停止后,用该指令可以继续执行,直至遇到断点或者程序结束。
(gdb) next (n) 令程序一行代码一行代码的执行。
(gdb) step(s) 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。
(gdb) until (u)
(gdb) until (u) location 当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
(gdb) print (p) 打印指定变量的值,其中 xxx 指的就是某一变量名。
(gdb) list (l) 显示源程序代码的内容,包括各行代码所在的行号。
(gdb) finish(fi) 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。
(gdb) return(return) 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。
(gdb) jump(j) 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。
(gdb) quit (q) 终止调试。
(gdb) Backtrace(bt) 查看堆栈。
(gdb) info threads 显示当前可调试的所有线程
(gdb) thread ID 切换当前调试的线程为指定ID的线程
(gdb) attach process-id 在gdb状态下,开始调试一个正在运行的进程
(gdb) thread apply all command 所有线程执行command
</code></pre>
<h2 id="4-调试多进程服务程序">4. 调试多进程服务程序</h2>
<blockquote>
<p>调试父进程:set follow-fork-mode parent (缺省)<br>
调试子进程:set follow-fork-mode child<br>
设置调试模式:set detach-on-fork [on|off],缺省是on<br>
标识调试当前进程的时候,其他的进程继续运行,如果用off调试当前进程的时候,其他的进程被gdb挂起<br>
查看调试的进程:info inferiors (*:表示当前调试进程)<br>
切换当前调试的进程:inferior 进程ID</p>
</blockquote>
<ul>
<li>常用命令表格</li>
</ul>
<table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>follow-fork-mode</td>
<td>set follow-fork-mode [parent|child]<br> parent:gdb默认调试的是父进程,如果参数是parent则fork之后继续调试父进程,子进程不受影响 <br> child:如果想调试子进程,则修改参数为child,set follow-fork-mode child之后调试子进程,父进程不受影响。</td>
</tr>
<tr>
<td>show follow-fork-mode</td>
<td>查看当前调试的fork进程的模式</td>
</tr>
<tr>
<td>detach-on-fork</td>
<td>该参数表明gdb在fork之后是否断开(detach)某个进程的调试,或者交给gdb控制.<br>set detach-on-fork [on|off]<br> on:断开调试follow-fork-mode调试的指定进程<br> off:gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。</td>
</tr>
<tr>
<td>show detach-on-fork</td>
<td>查看detach-on-fork模式<br> gdb将每一个被调试进程的执行状态记录在一个名为inferior的结构中。一般情况下一个inferior对应一个进程,每个不同的inferior有不同的地址空间。inferior有时候会在进程没有启动的时候就存在。</td>
</tr>
<tr>
<td>info inferiors</td>
<td>查询正在调试的进程,gdb会为他们分配唯一的Num号,其中前面带'*'号的就是正在调试的进程</td>
</tr>
<tr>
<td>inferior <inferior num></td>
<td>切换调试的进程为inferior num的进程处<br> add-inferior [-copies n] [-exec executable] <br>添加n个新的调试进程,可以用file executable来分配给inferior可执行文件。如果不指定n,则只增加一个inferior;如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序;这时候创建的inferior其关联的进程并没启动。</td>
</tr>
<tr>
<td>clone-inferior [-copies n] [infno]</td>
<td>复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior;如果不指定infno,则就复制正在调试的inferior。</td>
</tr>
<tr>
<td>detach inferior infno</td>
<td>断开(detach)掉编号是infno的inferior。值得注意的是这个inferior还存在,可以再次用run命令执行它。</td>
</tr>
<tr>
<td>kill inferior infno</td>
<td>kill掉infno号inferior。值得注意的是这个inferior仍然存在,可以再次用run等命令执行它。</td>
</tr>
<tr>
<td>remove-inferior infno</td>
<td>删除一个infno号的inferior。删除前需要先kill或者detach这个inferior,因为当一个inferior正在运行时不能被删除.</td>
</tr>
<tr>
<td>set schedule-multiple [on|off]</td>
<td>off:只有当前inferior会执行。 <br> on:全部是执行状态的inferior都会执行。</td>
</tr>
<tr>
<td>show schedule-multiple</td>
<td>查看schedule-multiple的状态。</td>
</tr>
<tr>
<td>set follow-exec-mode [new|same]</td>
<td>same:当发生exec的时候,在执行exec的inferior上控制子进程。 <br> new:新建一个inferior给执行起来的子进程。而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。</td>
</tr>
<tr>
<td>show follow-exec-mode</td>
<td>查看follow-exec-mode设置的模式。</td>
</tr>
<tr>
<td>set print inferior-events [on|off]</td>
<td>用来打开和关闭inferior状态的提示信息。</td>
</tr>
<tr>
<td>show print inferior-events</td>
<td>查看print inferior-events设置的状态。</td>
</tr>
<tr>
<td>maint info program-spaces</td>
<td>用来显示当前gdb管理的地址空间的数目。</td>
</tr>
</tbody>
</table>
<h2 id="5-调试多线程服务程序">5. 调试多线程服务程序</h2>
<ul>
<li>查看线程状态<br>
<strong>在shell中执行</strong>:</li>
</ul>
<blockquote>
<p>查看当前运行的进程:ps aux | grep 进程名称<br>
查看当前运行的轻量级进程:ps -aL | grep 进程名称<br>
查看主线程和子线程的关系:pstree -p 主线程ID</p>
</blockquote>
<p><strong>在gdb中执行</strong>:</p>
<blockquote>
<p>查看线程:info threads<br>
切换线程:thread 线程ID<br>
只运行当前线程:set scheduler-locking on<br>
运行全部的线程:set scheduler-locking off<br>
指定某线程执行某gdb命令:thread apply 线程ID cmd命令<br>
全部的线程执行某gdb命令:thread apply all cmd命令</p>
</blockquote>
<ul>
<li>多线程调试命令</li>
</ul>
<table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>info threads</td>
<td>显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程</td>
</tr>
<tr>
<td>thread ID(1,2,3…)</td>
<td>切换当前调试的线程为指定ID的线程</td>
</tr>
<tr>
<td>break thread_test.c:123 thread all<br>(例:在相应函数的位置设置断点break pthread_run1)</td>
<td>在所有线程中相应的行上设置断点</td>
</tr>
<tr>
<td>thread apply ID1 ID2 command</td>
<td>让一个或者多个线程执行GDB命令command</td>
</tr>
<tr>
<td>thread apply all command</td>
<td>让所有被调试线程执行GDB命令command</td>
</tr>
<tr>
<td>set scheduler-locking 选项 command</td>
<td>设置线程是以什么方式来执行命令<br><strong>set scheduler-locking off</strong>: 不锁定任何线程,也就是所有线程都执行,这是默认值<br><strong>set scheduler-locking on</strong>:只有当前被调试程序会执行<br><strong>set scheduler-locking on step</strong>:在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行</td>
</tr>
</tbody>
</table>
<h2 id="6-服务程序运行日志">6. 服务程序运行日志</h2>
<p>freecplus开源框的日志工具:<a href="https://xie.infoq.cn/article/3c7b99b5c8b5663c61cc06204">freecplus-参考文档</a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[嵌入式]]></title>
<id>https://xstarling.gitee.io/VwNstCxrN/</id>
<link href="https://xstarling.gitee.io/VwNstCxrN/">
</link>
<updated>2023-06-04T15:44:58.000Z</updated>
<content type="html"><![CDATA[<h1 id="1-linux驱动uboot内核移植">1. linux驱动,uboot内核移植</h1>
<h2 id="11-项目准备">1.1 项目准备</h2>
<p>参考准备:<a href="https://zhuanlan.zhihu.com/p/384128160">新爷—嵌入式设置简历准备</a><br>
参考准备:<a href="https://www.zhihu.com/question/434468953">仲一---有面试题</a></p>
<h3 id="111-波形转换555芯片">1.1.1 波形转换(555芯片)</h3>
<ul>
<li>
<p>555定时器<br>
参考视频链接:<a href="https://www.bilibili.com/video/BV1fr4y1r7Tk/?spm_id_from=333.337.search-card.all.click&vd_source=9752c2c90782ff8bd76174dfbc76c933">爱上半导体-555定时器</a></p>
<ol>
<li>
<p>比较器和RS触发器<br>
比较器:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061352535.png" alt="" loading="lazy"><br>
RS触发器:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061354076.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061355695.png" alt="" loading="lazy"></p>
</li>
<li>
<p>原理图<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306052325437.png" alt="" loading="lazy"><br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061400832.png" alt="" loading="lazy"></p>
</li>
<li>
<p>工作模式</p>
</li>
</ol>
<blockquote>
<p>无稳态电路<br>
单稳态电路<br>
双稳态电流<br>
1. 基本无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060903849.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060923462.png" alt="" loading="lazy"><br>
2. 任意占空比的无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060929125.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060931983.png" alt="" loading="lazy"><br>
3. 50%占空比无稳态电路<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060933131.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060934400.png" alt="" loading="lazy"><br>
<strong>注意</strong>:<br>
应用此电路时要注意,电阻R1不能太小,否则会影响电容C1的充电,导致占空比不是50%。<br>
4. 单稳态模式<br>
在单稳态电路中,输出端保持低电平,在输入端触发之后,输出端变成高电平,延时一段时间后回到低电平并保持。这个特性可以用来制作延时开关。原理图如下:<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306060938425.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061335617.png" alt="" loading="lazy"><br>
1. 双稳态模式<br>
双稳态电路指的是输出端可以稳定在高电平或低电平两种状态,可以通过开关在两个状态间切换。这个特性可以用来制作按钮开关。<br>
电路图:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061336661.png" alt="" loading="lazy"><br>
公式:<br>
<img src="https://33373sl116.zicp.fun:443/image-blog/202306061340725.png" alt="" loading="lazy"></p>
</blockquote>
</li>
</ul>
<blockquote>
<p><strong>滤波原理</strong>:<br>
参考视频链接:<a href="https://www.bilibili.com/video/BV1ri4y1y7yG/?spm_id_from=333.999.0.0&vd_source=9752c2c90782ff8bd76174dfbc76c933">爱上半导体-滤波器</a></p>
</blockquote>
<ul>