杂记
cft56200_ln
格拉德韦尔在《异数》:并非天资超人一等,而是付出了持续不断的努力。只要经过1万小时的锤炼,任何人都能从平凡变成超凡”。要成为某个领域的专家,需要10000小时:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。
展开
-
gdb使用
gdb的使用 普通的使用方式原创 2022-12-30 16:35:27 · 162 阅读 · 0 评论 -
top命令获取 线程cpu占用率
通过top命令获取 线程 cpu占用率原创 2022-12-30 16:14:19 · 574 阅读 · 0 评论 -
ubuntu 解压deb
ar -x libstdc++6_4.7.2-5_i386.deb这种压缩包是两层压缩,外面是xz压缩方式,里层是tar压缩方式:$xz -d ***.tar.xz$tar -xvf ***.tartar -zxvf data.tar.gz原创 2021-11-05 14:44:06 · 1073 阅读 · 0 评论 -
多线程程序设计的常见坑
i++大致分为三个步骤:1、从内存读出i的值到寄存器2、操作寄存器加13、将寄存器值写到i内存多个线程去操作同一个全局变量的时候,可能某个线程在第二步的时候切换到另一个线程,这样就导致少加了。比如线程A 在i=1 的时候在第二步,这个时候寄存器加1值为2,在这个时候切换到线程B ,由于线程A还没有把2写到i里面,使用B读出来还是1,自增写到i里面,i为2,在切换到线程A,线程A将寄存器里面的2写到i,这样就少加了一次。...原创 2021-08-03 14:24:42 · 90 阅读 · 0 评论 -
多线程程序设计的常见坑
i++大致分为三个步骤:1、从内存读出i的值到寄存器2、操作寄存器加13、将寄存器值写到i内存多个线程去操作同一个全局变量的时候,可能某个线程在第二步的时候切换到另一个线程,这样就导致少加了。比如线程A 在i=1 的时候在第二步,这个时候寄存器加1值为2,在这个时候切换到线程B ,由于线程A还没有把2写到i里面,使用B读出来还是1,自增写到i里面,i为2,在切换到线程A,线程A将寄存器里面的2写到i,这样就少加了一次。...原创 2021-06-02 18:04:18 · 120 阅读 · 0 评论 -
LINUX 进程间通信原理
https://www.zhihu.com/question/23995948/answer/136236554semaphore和mutex的区别?https://www.zhihu.com/question/47704079原创 2021-04-27 10:45:12 · 71 阅读 · 0 评论 -
擦除nodic nRF52系列芯片flash命令
&'C:\Program Files\Nordic Semiconductor\nrf-command-line-tools\bin\nrfjprog.exe' --eraseall&'C:\Program Files\Nordic Semiconductor\nrf-command-line-tools\bin\nrfjprog.exe' --recover原创 2021-03-16 16:11:38 · 652 阅读 · 0 评论 -
nordics SDK下载地址
https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK/Download原创 2021-03-16 15:32:47 · 467 阅读 · 0 评论 -
MDK5.29,5.30,5.31,5.32,5.33和各种pack软件包镜像下载(2021-02-18)
https://blog.csdn.net/Simon223/article/details/105090189/转载 2021-03-10 15:20:14 · 400 阅读 · 0 评论 -
linux 32位与64位 内核态与用户态 内存区别
- 内存管理信息在 task_struct 的 mm_struct 中- task_size 指定用户态虚拟地址大小- 32 位系统:3G 用户态, 1G 内核态- 64 位系统(只利用 48 bit 地址): 128T 用户态; 128T 内核态- 用户态地址空间布局和管理- mm_struct 中有映射页的统计信息(总页数, 锁定页数, 数据/代码/栈映射页数等)以及各区域地址- 有 vm_area_struct 描述各个区域(代码/数据/栈等)的属性(包含起...原创 2021-03-09 09:40:03 · 1315 阅读 · 0 评论 -
多线程
线程:https://time.geekbang.org/column/article/91289- 线程复制执行二进制指令- 多进程缺点: 创建进程占用资源多; 进程间通信需拷贝内存, 不能共享- 线程相关操作- pthread_exit(A), A 是线程退出的返回值- pthread_attr_t 线程属性, 用辅助函数初始化并设置值; 用完需要销毁- pthread_create 创建线程, 四个参数(线程对象, 属性, 运行函数, 运行参数)- ...原创 2021-02-24 14:02:40 · 62 阅读 · 0 评论 -
ps -ef 命令解析
$ ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Jan29 ? 00:00:36 /sbin/initroot 2 0 0 Jan29 ? 00:00:01 [kthreadd]root 3 2 0 Jan29 ? 00:01:51 [ksoftirqd/0]root 5.原创 2021-02-24 11:05:58 · 1351 阅读 · 0 评论 -
程序可执行文件格式ELF
可执行文件,是 ELF 的第二种格式.text:放编译好的二进制可执行代码 .data:已经初始化好的全局变量 .rodata:只读数据,例如字符串常量、const 的变量 .bss:未初始化全局变量,运行时会置 0 .symtab:符号表,记录的则是函数和变量 .strtab:字符串表、字符串常量和变量名...原创 2021-02-23 17:38:47 · 313 阅读 · 0 评论 -
linux 系统调用
- glibc 将系统调用封装成更友好的接口- 本节解析 glibc 函数如何调用到内核的 open---- 用户进程调用 open 函数- glibc 的 syscal.list 列出 glibc 函数对应的系统调用- glibc 的脚本 make_syscall.sh 根据 syscal.list 生成对应的宏定义(函数映射到系统调用)- glibc 的 syscal-template.S 使用这些宏, 定义了系统调用的调用方式(也是通过宏)- 其中会调...原创 2021-02-23 15:11:43 · 98 阅读 · 0 评论 -
常用的linux命令行
Linux 运行程序的第二种方式,后台运行。 这个时候,我们往往使用nohup命令。这个命令的意思是 no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序还要在。 最终命令的一般形式为nohup command >out.file 2>&1 &。这里面,“1”表示文件描述符 1,表示标准输出,“2”表示文件描述符 2,意思是标准错误输出,“2>&1”表示标准输出和错误输出合并了。合并到哪里去呢?到 out...原创 2021-02-20 11:21:44 · 103 阅读 · 0 评论 -
linux内核下载网址
https://www.kernel.org/原创 2021-02-20 10:58:29 · 101 阅读 · 0 评论 -
Linux 一切皆文件
启动一个进程,需要一个程序文件,这是一个二进制文件。 启动的时候,要加载一些配置文件,例如 yml、properties 等,这是文本文件; 启动之后会打印一些日志,如果写到硬盘上,也是文本文件。 但是如果我想把日志打印到交互控制台上,在命令行上唰唰地打印出来,这其实也是一个文件,是标准输出 stdout 文件。 这个进程的输出可以作为另一个进程的输入,这种方式称为管道,管道也是一个文件。 进程可以通过网络和其他进程进行通信,建立的 Socket,也是一个文件。 进程需要访问外部设备,设备...原创 2021-02-20 10:44:31 · 78 阅读 · 0 评论 -
linux常用系统调用脑图
Linux 就是这样想的。当父进程调用 fork 创建进程的时候,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。按理说,如果不进行特殊的处理,父进程和子进程都按相同的程序代码进行下去,这样就没有意义了。 所以,我们往往会这样处理:对于 fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号。这样首先在返回值这里就有了一个区分,然后通过 if-else 语句判断,如果是父...原创 2021-02-20 10:42:14 · 99 阅读 · 0 评论 -
什么是Glibc
Glibc其实就是一个中介Glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库。Glibc 为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。每个特定的系统调用对应了至少一个 Glibc 封装的库函数,比如说,系统提供的打开文件系统调用 sys_open 对应的是 Glibc 中的 open 函数。有时候,Glibc 一个单独的 API 可能调用多个系统调用...原创 2021-02-20 10:39:33 · 4034 阅读 · 2 评论 -
关于SIM和eSIM,看这一篇就够啦!
关于SIM和eSIM,看这一篇就够啦!https://cloud.tencent.com/developer/article/1467944转载 2021-01-12 17:46:07 · 1116 阅读 · 0 评论 -
内存池
https://blog.csdn.net/u010183728/article/details/81531392转载 2020-10-15 13:10:01 · 64 阅读 · 0 评论 -
linux sleep函数坑你点儿没关系,但是真的坑死你
linux系统编程,大家使用延时函数,最常用的是sleep,BUT。。。。。。。。。。因为sleep()运行是程序捕获到一个信号,那么这个信号就会中断sleep,去执行信号所指内容,等处理好信号之后,程序会直接跳到sleep的下一行执行,那么即使sleep秒数没有数完,也照样结束。这就是造成sleep失效的原因。那么根据这个特性,我提供一种不太精确的解决方法,就是将sleep放到一个循环中去。每次循环延时1秒,因此要延时的秒数约等于循环的次数。在延时精度要求不高的情况下我认为这个方法是可行的,也希望原创 2020-09-09 09:39:21 · 4457 阅读 · 1 评论 -
linux 查看CPU频率
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq 198000cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 528000cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq 198000原创 2020-07-28 11:23:34 · 2353 阅读 · 0 评论 -
Ethernet 3c59x module not installed on CentOS 7.2.151
1、判断是否有3c59x驱动#执行如下命令判断是否有3c59x驱动modprobe -v 3c59x#响应如下modprobe: FATAL: Module 3c59x not found#执行如下命令,如任何响应lsmod | grep -i 3c2、执行ifconfig,只有两个网卡em1,lo3、解决方法 centos安装 驱动sudo rpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org..原创 2020-06-29 15:23:58 · 500 阅读 · 0 评论 -
内核 Linux中双向链表的经典实现
1. Linux中双向链表介绍Linux双向链表的定义主要涉及到两个文件:include/linux/types.hinclude/linux/list.hLinux中双向链表的使用思想它是将双向链表节点嵌套在其它的结构体中;在遍历链表的时候,根据双链表节点的指针获取"它所在结构体的指针",从而再获取数据。我举个例子来说明,可能比较容易理解。假设存在一个社区中有很多人,每个人都有姓名和年龄。通过双向链表将人进行关联的模型图如下:person代表人,它有name和age属性。为了通过转载 2020-06-28 09:42:42 · 221 阅读 · 0 评论 -
内核 宏定义 container_of
container_of1.1 container_of介绍定义:container_of在linux内核的include/linux/kernel.h中定义。#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,membe原创 2020-06-24 17:34:11 · 147 阅读 · 0 评论 -
内核 宏定义 offsetof
1. offsetof1.1 offsetof介绍定义:offsetof在linux内核的include/linux/stddef.h中定义。#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)说明:获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。(01) ( (TYPE *)0 ) 将零转型为TYPE类型指针,即TYPE类型的指针的地址是0。(02) ((TYPE *)原创 2020-06-24 17:19:40 · 271 阅读 · 0 评论 -
内核双向链表笔记
遇到一个这个样的定义static list_create( table_done_list );,居然没有声明table_done_list 这个变量跟踪代码#define list_create(name) \ struct list name = list_init(name) 可以看到list_create是一个宏定义 list_init也是一个宏定义#define list_init(name) { NULL, NULL, 0 }其实替换下来就是static l...原创 2020-06-24 16:53:57 · 123 阅读 · 0 评论 -
SIM800C 介绍
1、简介SIM800C是一款四频GSM/GPRS模块,为城堡孔封装。其性能稳定,外观小巧,性价比高,能满足客户的多种需求。SIM800C工作频率为GSM/GPRS850/900/1800/1900MHz,可以低功耗实现语音、SMS和数据信息的传输。SIM800C尺寸为17.6*15.7*2.3mm,能适用于各种紧凑型产品设计需求。2、模块配置表 模块配置 SIM800C BT (蓝牙) (需要软件版本支持) FLASH SIM800..原创 2020-06-17 15:52:16 · 33874 阅读 · 0 评论 -
.\Output\Rename.axf: error: L6050U: The code size of this image (43104 bytes) exceeds the maximum al
使用keil5编译的时候报错如下.\Output\Rename.axf: error: L6050U: The code size of this image (43104 bytes) exceeds the maximum allowed for this version of the linker问题原因,keil5没有注册,注册方法https://blog.csdn.net/qq_22329595/article/details/83054499...原创 2020-06-08 14:20:56 · 4417 阅读 · 0 评论 -
什么是拥塞窗口?和发送窗口有什么关系呢?
拥塞窗口 cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。我们在前面提到过发送窗口swnd和接收窗口rwnd是约等于的关系,那么由于入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。拥塞窗口cwnd变化的规则: 只要网络中没有出现拥塞,cwnd就会增大; 但网络中出现了拥塞,cwnd就减少; ...转载 2020-06-05 08:37:34 · 9401 阅读 · 3 评论 -
窗口大小由哪一方决定?
TCP 头里有一个字段叫Window,也就是窗口大小。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。所以,通常窗口的大小是由接收方的决定的。发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。...转载 2020-06-05 08:37:44 · 2007 阅读 · 0 评论 -
为什么挥手需要四次?
四次挥手双方发FIN包的过程,就能理解为什么需要四次了。 关闭连接时,客户端向服务端发送FIN时,仅仅表示客户端不再发送数据了但是还能接收数据。 服务器收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN报文给客户端来表示同意现在关闭连接。 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN一般都会分开发送,从而比三次握手导致多了一次。...原创 2020-06-04 13:31:27 · 1173 阅读 · 0 评论 -
为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。
三次握手才可以阻止历史重复连接的初始化(主要原因) 三次握手才可以同步双方的初始序列号,MSS,窗口大小等 三次握手才可以避免资源浪费原创 2020-06-04 13:28:07 · 405 阅读 · 0 评论 -
近代物理简介 想看懂三体,星级穿越,文章链接如下
下载链接:原创 2020-06-03 14:31:18 · 143 阅读 · 0 评论 -
C语言 printf 变色的打印 依次打印 文件名称 函数名称 行号 方便调试程序
printf 变色的打印时间函数static star_s64 segment_get_current_time(void){ star_os_timeval_t tv; star_os_timezone_t tz; star_os_gettimeofday(&tv,&tz); return (((long long)(tv.t...原创 2020-04-17 16:18:42 · 242 阅读 · 0 评论 -
解决docker每次都需要输入sudo的权限问题
每次在使用docker命令的时候,都要添加sudo权限,否则就会报Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json...原创 2020-02-26 10:42:56 · 3141 阅读 · 0 评论 -
更新Ubuntu centOS 镜像源地址为阿里云的镜像地址方法 更新仓库的方法以autoconf为例
①浏览器输入http://mirrors.aliyun.com/进入https://developer.aliyun.com/mirror/② 点击epel③查看配置方法epel(RHEL 6) wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo④进入/etc/y...原创 2020-02-11 10:34:02 · 497 阅读 · 0 评论 -
C语言 大写转小写
#include <stdio.h>#include <string.h>static int gds_str_to_lowercase(char *str,int str_len){ char *p = NULL; int i = 0; if(NULL == str) { printf("str b...原创 2019-11-21 10:32:23 · 590 阅读 · 0 评论 -
从浏览器中导出https证书
第一种方法开始运行中输入certmgr.msc,选择证书右击导出即可。第二步找到目录第三步 导出第四步第五步保存就ok了。第二种方法 以百度为例剩下的和第一种方法相同 ...原创 2018-08-13 10:35:18 · 12209 阅读 · 0 评论