linux进程的内存与ELF文件 提到进程的内存就是虚拟内存。1G的内核区域、3G的用户区域,提到进程的内存就是下面这个图,都可以用它进行分析。虚拟内存是为了实现多任务,所以操作系统才引入了它。new是一个关键字,他运行时先创建一个类,底层再调用malloc函数申请相应大小的内存,而malloc是一个函数,申请内存时需要我们告诉其需要内存的大小,malloc底层调用的是brk系统调用。malloc其实是系统给分配的一个虚拟内存。申请内存不释放内存会导致内存泄漏,解决内存泄漏可以先判断内存泄漏是什么引起了,是内存池还是非内存池导致的,后面可以
linux内存机制原理---分页、分段底层原理 自我总结:分段+分页+虚拟内存=现代操作系统的内存管理机制。一、linux的内存分布内核与高速缓冲区占用了前1MB内存,后面15MB属于主存,可以由用户自由分配。四种地址:虚拟地址、线性地址、逻辑地址、物理地址。虚拟地址:虚拟地址中具体地址是逻辑地址,每个进程分配的空间。逻辑地址:程序员可以看到的地址,linux操作系统分配给每个进程的独立地址,每个进程认为自己的空间都有连续的64MB。线性地址:总线地址CPU采用分段的机制(线性地址=逻辑地址+段基地址)。物理地址:CPU总线的
正点原子esp8266+mini(rct)板/c8t6上onenet云服务器 提供一个wifi上云的代码,可以直接使用正点原子的esp8266wifi模块上onenet云平台,代码需要修改的地方我会指出来,并且上传数据的代码也会标明。具体操作可以加我qq2947993454,帮助你解决问题。下面都是需要添加和修改的文件源码。main函数中只需要采集完后添加这两行就可以成功上传了。OneNet_SendData();ESP8266_Clear();一、修改uasrt.h/.c文件重新配置uart1并且配置好uart2用来控制wifi,修改后printf函数就不
UART串口通信常用协议对比——rs232、485的区别 一、RS232:uart常用的一个协议,uart其实只是一个设备,而协议则是规定在传输时他的传输规则,232协议简单常用的一种协议,接受端和发送端的rxd与txd相连,这样就可以完成传输。因为每端都有rxd、txd所以他是全双工通信,但是他的有效传输距离较短。必须使用特定设备才可以与uart相连传输。只能一对一的进行通信。二、RS485:RS-485的数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B。是半双工通信,但是解决了re232通信距离短的问题
四针OLED驱动代码——IIC驱动 在使用IIC驱动四针OLED时只需要添加以下几部分代码即可,之后就可以快乐的使用OLED显示数据了。一、oled.c#include "oled.h"#include "stdlib.h"#include "oledfont.h" #include "delay.h"void IIC_Start1(){ OLED_SCLK_Set() ; OLED_SDIN_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr();}/************
嵌入式软件面试高频基础——C语言 一、构造函数与析构函数用法与区别构造函数:是一种特殊的方法,一个类也可以有很多构造函数,可以根据其参数不同或者参数类型不同来区分,也就是重载。可以为对象成员赋初始值。常常与new运算符一起使用在创建对象的语句中。析构函数:对象所在的函数已调用完后,系统自动调用析构函数。进行清理善后工作。二、内联函数和宏定义区别1、内联函数和普通函数相比可以加快程序的运行速度,因为不需要进行函数切换,在编译时内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换,在预处理阶段被换到主函数中。2、内联函
USB学习笔记——USB通信过程与枚举过程 在网上看到一篇文章就是讲这个的,仔细阅读后获得了很多感触,整理总结如下。一、USB接口在USB的集线器端D-,D+都接了下拉电阻,而USB设备端的D-,D+接了上拉电阻,所以当USB设备插入时可以根据集线器端D-,D+上的电压变化来判断是否有USB设备接入。检测到有设备接入后,可以根据D-,D+来判断USB设备的工作模式,是低速还是全速或者高速。所以D-,D+这两根线很重要。二、 USB数据传输过程主机与USB设备相互传输数据具体过程如下:1、客户软件首先将传输的数据放入缓冲
结构体大小计算以及sizeof与strlen的区别 内存对齐这个知识点面试问的几率特别高,赶紧学一下吧,书到用时方恨少!!!一、结构体求大小这里主要还是联合体求大小,应为结构体大小在前面已经记录过了,本质还是内存对齐。联合体如何求占用内存大小:1.找到占用字节最多的成员; 2.union的字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员。typedef union { long i; int k[5]; char c;}D其中占用字节最大的数据类型是long,但是这里还有整型的数
linux中有名管道与匿名管道的实现 一、匿名管道多用于父进程与子进程之间的通信,用到的频率很高,挺重要的。定义一个大小为2的数组、使用pipe函数将其变为匿名管道的两端,fd[0]:代表读端、fd[1]:代表写端。子进程和父进程根据功能分别关闭读或写端。当然是使用read和write函数来对管道的数据进行读写,下面这个函数的功能就是父进程给子进程传输hello world,子进程读后把字符串发送到标准输出上。如下图可以看到结果是正确的。使用完都关掉、养成好习惯。int pipe(int filedes[2]);..
linux多线程——互斥量实现同步 静态初始化互斥量,也可以调用函数动态初始化。使用到的函数有pthread_mutex_lock,给资源上锁,和mutex_unlock,给资源解锁,可以实现同步访问,避免竞争。#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<pthread.h>pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;void *func(voi.
linux多线程——基础知识+实现 在Linux中利用C语言实现多线程。利用函数pthread_create()、pthread_exit()、pthread_join()。一、pthread_create()#include <pthread.h>int pthread_create( pthread_t *restrict tidp, //新创建的线程指向的内存单元。 const pthread_attr_t *restrict attr,
虚拟内存与写时复制 一、什么是虚拟内存:之前记录了虚拟内存如何映射到物理内存的方式(内存管理方式):分段和分页。但是这两个策略都有相同的目标,就是同时将多个进程保存在内存中,以便允许多道程序。然而,这些策略都倾向于要求每个进程在执行之前应完全处于内存中。而虚拟内存技术则可以允许内存不必完全处于内存,就是执行的指令应处于物理内存中。二、虚拟内存的优点:运行的程序可以远大于物理地址,使我们不必担忧内存容量的限制,它实现的原理就是局部性原理。给每个进程都分配一个4G的看似连续的虚拟内存空间。方便内存共享,文件共享