- 博客(37)
- 资源 (1)
- 收藏
- 关注
原创 RCU检测CPU stall的原理
在系统中,有时可能会看到如下警告:INFO: rcu_sched self-detected stall on CPU 0-...: (9999 ticks this GP) idle=cee/140000000000001/0 softirq=64858/64858 fqs=4891 (t=10000 jiffies g=13416 c=13415 q=68)Task dump for CPU 0:my_debug_1 R running task 这是rcu的cpu
2021-11-22 20:39:48
17089
原创 nginx event 事件模块中 ev->write 的作用
起因在stream模块中,使用到了事件结构 ngx_event_t 中的 write 条目,但是一直不知道这个东西在哪设置,其什么作用。事实上,一直以来我都有一个误区,认为 ngx_stream_proxy_process_connection() 函数的第二个参数 from_upstream 表示的是数据是否来自上游。以至于,在如下代码时,很困惑,为什么,靠一个 ev->write 就能够确定,数据是否是从上有来的呢??static voidngx_stream_proxy_upstream
2021-11-03 15:54:07
1141
原创 力扣 爬楼梯
题目要求假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶作者:力扣 (LeetCode)链接:https://leetcode-cn.c
2021-01-05 20:48:31
220
原创 TCP/IP卷一 阅读笔记 RARP逆地址解析协议
作用通过MAC地址获取IP地址,通常用于无盘系统地启动。通常IP地址被存储在文件中,所以无盘系统无法正常获取IP地址,而是靠RARP协议通过网络获取IP地址。格式在以太网中,RARP请求格式如下:RAPR请求格式同ARP一致,只是某些位的内容需要变化。帧类型:0x8035操作字段op:请求为3,应答为4tcpdump命令实例第一行第一行是发送者发送的数据。其中 8:0:20:3:f6:42 表示源主机MAC地址,而 ff:ff:ff:ff:ff:ff 表示广播,该消息会发送给当前网路
2020-12-13 16:22:25
383
原创 TCP/IP卷一 阅读笔记 BSD分组过滤器
BSD分组过滤器,又称为BSF,也就是BSD Packet Filter。BSF是依赖与底层操作系统的,并不是所有的系统都支持。原理是将以太网设备的驱动程序设置为混杂模式,然后从驱动程序处接收所有发送和接收的数据。在BSF中,会为每一个使用BSF的应用程序分配一个过滤器。这些从驱动程序处接收来的所有数据,经过过滤器后剩下的就是应用程序感兴趣的数据了。然后将这些数据从内核复制到用户空间,也就是应用程序。为了避免频繁的从内核向用户空间复制数据,BSF增加了一个缓冲区,然后会提供一个应用程序可设置的超时时间
2020-12-11 20:31:10
297
原创 lP地址 与 MAC地址
作用IP地址本质上是终点地址,它在跳过路由器的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。也可以说IP是网络到网络,而MAC是设备到设备。分层IP是在网络层 中的 IP协议使用的,而MAC地址是在 链路层 中的 以太网协议 中使用的。如果网络层不是用IP协议,就不需要使用IP地址,链路层不使用以太网协议就不一定需要使用MAC地址。所以,这样分层来设计网络可以使网络层与链路层的协议更灵活地替换,网络层
2020-12-07 18:20:39
368
2
原创 libmodbus-3.1.6 unit-test-client.c 和 unit-test-server.c源码阅读
unit-test-client.c根据命令行输入来判断使用哪些具体的协议,默认使用modbus tcp协议。if (argc > 1) { if (strcmp(argv[1], "tcp") == 0) { use_backend = TCP; } else if (strcmp(argv[1], "tcppi") == 0) { use_backend = TCP_PI; } else if (s
2020-11-26 10:40:09
1095
原创 accept 和 accept4 区别,以及O_CLOEXEC的作用
accept4()函数共有4个参数,相比accept()多了一个flags的参数,用户可以通过此参数直接设置套接字的一些属性,如SOCK_NONBLOCK或者是SOCK_CLOEXEC。当accept4的flags为0的时候,accept4和accept没有区别。SOCK_CLOEXEC和O_CLOEXEC标志位,与使用fcntl设置文件描述符的FD_CLOEXEC有同样的作用,都是在fork的子进程中用exec系列系统调用加载新的可执行程序之前,关闭子进程中fork得到的fd。当一个进程使用fork
2020-11-25 18:34:23
3927
原创 LINUX 内核零散知识 container_of宏
container_of是内核中常用的一个宏。定义如下:#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr = (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); })设个宏共有三个参数:ptr:结构体成员member的地址type:结构体的类型member:结构体成员container
2020-09-19 15:38:14
174
原创 错误集 字符设备驱动 echo 死循环
现象使用如下命令访问字符设备驱动,本意是通过echo命令调用驱动中的write函数。echo 1 > /dev/mydev但是结果出现了死循环,echo命令并不结束。原因:write函数中,在返回的时候,固定的返回一个0.分析echo命令,进行了3步操作,打开文件,写入数据,关闭文件。在写入文件的时候,有对返回值的判断操作,若返回值不等于写入的数据数量,则会再次进行写入操作。个人推测是根据返回值进行偏移,再次进行写入。但是返回值若是0,则会导致不停的写入,则会产生死循环。..
2020-08-27 11:35:30
638
原创 C语言 结构体 所占内存 计算方式详解(没有对字节对齐进行解释)
目录虚拟机和gcc版本测试例程基本类型结构体测试计算方法结构体嵌套虚拟机和gcc版本因为此结论可能和ubuntu和编译器的版本有关,所以先说明一下。ubuntu版本如下:gcc版本如下:测试例程基本类型结构体由基本类型组成的结构体的所占空间的大小判断比较简单。所以没做过多测试。测试过程如下。测试typedef struct{ int a; char b; short c;}a_t;sizeof(a_t) = 8//********************
2020-07-04 21:19:06
874
原创 arm 裸机编程 外部中断篇
GIC即 Generic Interrupt Controller 通用中断控制器,是支持和管理系统找你孤单的集中式资源。提供:从硬件(外围)启用、禁用和生成处理器中断产生软件中断中断屏蔽和优先级支持三种中断:软件生成中断(SGI)专用外设中断(PPI):特定于单个处理器的外围中断共享外设中断(SPI):这是可以将其分发给任何处理器组合的外围中断触发方式:边沿触发...
2020-04-27 09:05:09
395
原创 ARM 裸机编程 PWM篇
简介Exynos 4412具有五个32位脉宽调制(PWM)计时器。这些计时器为ARM子系统生成内部中断。此外,计时器0、1、2和3包括PWM功能,该功能可驱动外部I / O符号 。计时器0中的PWM具有可选的死区发生器功能,以支持大电流设备。定时器4是内部定时器,不带输出引脚。定时器使用APB-PCLK作为源时钟。定时器0和1共享一个可编程的8位预分频器,可为PCLK提供第一级分频。定时器2...
2020-04-22 16:39:05
642
原创 arm 裸机编程 看门狗篇
Watchdog Timer看门狗是一种即使设备。可以用起产生中断信号或者复位信号。功能支持带中断请求的正常间隔定时模式如果计时器计数达到0(超时),则激活内部复位信号支持 水平触发 中断机制。简介PCLK为输入频率,其会经过两次分频,分别由WTCON[15:8]和WTCON[4:3]控制。然后每有一次电平的周期变,WTCNT中的Down Counter就会递减。当其为零的...
2020-04-21 19:16:39
324
原创 Linux网络编程基础
基础知识网络分层思想网络采用分而治之得方法设计,将网络得功能划分为不同的模块,以分层的形式有机的集合在一起。每层向实现不同的功能,每层向上层提供服务,同时使用下层提供的服务网络分层的作用为了让网络功能模块化,便于管理和通信OSI七层协议模型OSI模型是一个理想的、通用的但尚未实现的模型通信特点:属于对等通信,为了使数据分组从源发出到达目的地源端OSI模型的每一层必须与目的端对应层...
2020-04-18 12:31:20
201
原创 arm 裸机编程 串口篇
实际上波特率并不等于bps。波特率:一秒钟传输码元的个数bps:一秒钟发送的比特位位数而码元是承载信息量的基本信号单位,一个二进制码元占一个比特位所以仅仅二进制码元时,bps等于波特率同步和异步方式:配置串口大的步骤(使用轮询方式):波特率起始位、停止位、奇偶校验位、数据位收发模式需要分别知道读取和发送串口数据的寄存器需要知道什么时候收数据,什么时候发数据,即状态寄存器。...
2020-04-18 10:43:30
216
原创 ARM笔记
ARM基础ARM处理器工作状态用户模式User非特权模式,大部分任务执行在这种模式快速中断模式FIQ当一个高优先级中断产生时将进入这种模式外部中断模式IRQ当一个低优先级中断产生时将会进入这种模式管理模式SVC当复位或软中断指令执行时将回进入这种模式中止模式ABT当存取异常时将会进入这种模式未定义指令模式UND当执行未定义指令时会进入这种模式系统模式SYS使用和Use...
2020-04-16 19:20:07
1081
1
原创 C++无名对象
程序说明下面的程序都基于这样的一个test类和fun函数:class test{public: test(int n):num(n) { cout << "构造函数的调用" << endl; } test(test& p) { num = p.num; cout << "拷贝的调用" << endl; } v...
2020-03-13 18:21:23
2067
3
原创 C++拷贝构造函数
拷贝构造函数拷贝构造实际上也是构造函数的一种。当你创建了拷贝构造函数的之后,系统就不再提供默认的构造函数了。作用:用一个已经存在的对象去初始化另一个对象。赋值并不会调用拷贝构造函数。class test{public: test() { cout << "构造函数的调用" << endl; } test(test& p) { cout...
2020-03-12 22:00:37
234
原创 C语言进阶C++笔记
基础知识C++特点完全兼容C语言语法有自己独立的语法和存储结构能够更好的体现面向对象的特征使用使用时与C语言的区别源文件后缀名为.cpp在Linux中编译连接C++程序 g++ xxxx.cpp引用基本概念定义:是一个变量的别名,不占用内存空间;只能作为一个变量的附属存在。格式:存储类型& 引用名 = 变量名;&的含义取决于其所在到的位置当&am...
2020-03-10 21:45:50
518
1
原创 笔记 仿函数、内建函数对象、谓词
仿函数:又叫函数对象,是在将一个类的()符号重载之后,其使用方式同函数类似,所以叫做仿函数。仿函数使用特点:仿函数在使用时可以像普通函数那样调用,也可以有自己的参数、返回值函数对象超出普通函数的范畴,其可以有自己的状态。这里的状态是指函数对象作为一个类的实现,其可以有自己的属性。函数对象可以作为参数传递。注意,这里传递的是对象,而不是类名。所以,仿函数在使用时,使用的一定是对象,而不是直...
2020-01-03 22:10:46
115
1
原创 set容器排序和list容器排序区别以及更改排序规则
set容器排序和list容器排序区别1list容器由程序员指定是否排序,若要排序需调用sort方法set容器自动排序,容许元无法组织其排序2list容器排序更改默认排序需向sort方法传入一个指定排序规则的函数set容器排序更改默认排序规则是通过创建排序规则类,在类中重载()时指定排序规则,然后创建类时同时将排序类作为数据类型传入模板参数列表为什么set容器更改排序规则是创建...
2019-12-23 16:01:46
289
原创 C++ STL容器 迭代器失效的问题
vector容器迭代器失效情况当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时begin和end操作返回的迭代器都会失效。当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。d...
2019-12-03 16:01:59
371
原创 C语言 指针例程 《C和指针》例程6.3 注释
#include <stdio.h>#include <assert.h>#define TRUE 1#define FALSE 0int num = 0;int find_char(char **strings, char value){ assert(strings != NULL); while (*strings != NULL) { ...
2019-11-26 22:29:23
191
原创 C++ vector容器的swap方法(容器互换)
swap方法可以交换两容器的内容。int main(){ vector<int> v1; v1.push_back(10); v1.push_back(20); vector<int> v2; v2.push_back(30); //printVector是自己编写用于遍历输出vector容器的函数 printVector(v1); printVec...
2019-11-21 23:01:53
60340
6
原创 C++中类模板分文件编写出现问题的原因(涉及函数定义作用、编译过程等)
在一切之前,我们需要首先了解C++的编译过程C++编译链接全过程C++的编译过程分大致为预编译、编译、链接。预编译过程在预编译过程中,会进行一些最基本的操作。将会把#define宏定义进行替换。#define Max 100如程序中出现了上面的语句,则预编译结束后,程序中的所有 Max 都已经被替换成了100执行条件编译:#ifdef,#ifndef,#else,#eli...
2019-11-11 17:55:35
3276
16
原创 C++中多态实现的原理
多态是C++面向对象的三大特征之一。首先说一下多态的分类。多态分为静态多态和动态多态。函数重载就是属于静态多态。接下来说一下动态多态。先上一段代码:...
2019-10-22 15:22:13
161
原创 C++中菱形继承的基本概念及内存占用问题
先上代码:#include <iostream>using namespace std;class Base{public: int age = 10;};class Son1 : public Base{};class Son2 : public Base{};class Grandson : public Son1, public Son2{}...
2019-10-19 21:14:36
1119
原创 学习C++中递增运算符的函数重载遇到的问题及注意事项
递增运算符分为前置递增和后置递增。这两个分开来说吧。前置递增。需要创建一个名字叫做 人 的类,这个类中有一个 年龄 属性,且默认值为0,然后类外重载左移运算符方便打印输出。我们对人类的对象进行递增操作就是想让年龄增加。如下:#include <iostream>using namespace std;class Person{public: int age = 0;...
2019-10-16 19:30:21
1329
2
原创 C++中有关成员方法类内声明类外实现、类声明、友元遇到的问题
这个问题是我在学习友元的时候遇到的。学习了全局函数做友元和类做友元之后,自认为发现了一些规律,就像自己写一下成员函数做友元的代码,就仿照视频课程中的代码试了一下。代码如下:先上代码:#include <iostream>using namespace std;#include <string>class Building;class GoodGay{pu...
2019-10-15 11:31:25
1165
2
原创 C++中没有使用 引用 造成的问题
先上代码:#include <iostream>using namespace std;#include <string>class Person{public: int weight; Person(int weight) { //this指针指向 被调用的成员函数 所属的对象,即谁调用该函数,this指针指向谁 this->weight...
2019-10-13 19:09:28
280
原创 C++中浅拷贝与深拷贝的问题(面试常见的坑)
前提:局部变量、局部对象在栈区存放,且遵循先进后出的原则在堆区开辟空间存放数据需要程序员自己手动进行释放正文:先上代码:#include <iostream>using namespace std;#include <string>class Person{public: string p_Name; //用于保存对象名 int * p_Va...
2019-10-11 23:40:28
656
原创 C++中构造函数的注意事项
若我们不写构造函数,编译器会为我们添加默认的构造函数。该构造函数是一个无参的构造函数(所以一般把无参构造函数叫做默认构造函数),且该构造函数是空实现,即内部没有语句。若我们为其添加了构造函数,则编译器就不会再问我们提够默认的构造函数。所以,再我们为其添加了有参构造函数之后,就不能调用无参构造函数了,除非我们自行添加。调用无参构造函数的时候不可以加括号。因为若加上括号,编译器会认为其是一个返回...
2019-10-11 18:17:04
849
原创 C++通过指针修改对象的私有成员
先上代码#include <iostream>using namespace std;class test1{private: int val;public: int * changeTest(void) { return &val; } void showVal(void) { cout << val << endl;...
2019-10-09 21:13:26
1185
1
epoll、线程池实现在线电子词典
2020-11-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人