- 博客(68)
- 资源 (5)
- 收藏
- 关注
原创 linux进程的内存与ELF文件
提到进程的内存就是虚拟内存。1G的内核区域、3G的用户区域,提到进程的内存就是下面这个图,都可以用它进行分析。虚拟内存是为了实现多任务,所以操作系统才引入了它。new是一个关键字,他运行时先创建一个类,底层再调用malloc函数申请相应大小的内存,而malloc是一个函数,申请内存时需要我们告诉其需要内存的大小,malloc底层调用的是brk系统调用。malloc其实是系统给分配的一个虚拟内存。申请内存不释放内存会导致内存泄漏,解决内存泄漏可以先判断内存泄漏是什么引起了,是内存池还是非内存池导致的,后面可以
2022-05-08 18:51:51
1409
1
原创 linux内存机制原理---分页、分段底层原理
自我总结:分段+分页+虚拟内存=现代操作系统的内存管理机制。一、linux的内存分布内核与高速缓冲区占用了前1MB内存,后面15MB属于主存,可以由用户自由分配。四种地址:虚拟地址、线性地址、逻辑地址、物理地址。虚拟地址:虚拟地址中具体地址是逻辑地址,每个进程分配的空间。逻辑地址:程序员可以看到的地址,linux操作系统分配给每个进程的独立地址,每个进程认为自己的空间都有连续的64MB。线性地址:总线地址CPU采用分段的机制(线性地址=逻辑地址+段基地址)。物理地址:CPU总线的
2022-05-06 13:11:09
921
1
原创 正点原子esp8266+mini(rct)板/c8t6上onenet云服务器
提供一个wifi上云的代码,可以直接使用正点原子的esp8266wifi模块上onenet云平台,代码需要修改的地方我会指出来,并且上传数据的代码也会标明。具体操作可以加我qq2947993454,帮助你解决问题。下面都是需要添加和修改的文件源码。main函数中只需要采集完后添加这两行就可以成功上传了。OneNet_SendData();ESP8266_Clear();一、修改uasrt.h/.c文件重新配置uart1并且配置好uart2用来控制wifi,修改后printf函数就不
2022-05-02 16:53:25
1823
3
原创 UART串口通信常用协议对比——rs232、485的区别
一、RS232:uart常用的一个协议,uart其实只是一个设备,而协议则是规定在传输时他的传输规则,232协议简单常用的一种协议,接受端和发送端的rxd与txd相连,这样就可以完成传输。因为每端都有rxd、txd所以他是全双工通信,但是他的有效传输距离较短。必须使用特定设备才可以与uart相连传输。只能一对一的进行通信。二、RS485:RS-485的数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B。是半双工通信,但是解决了re232通信距离短的问题
2022-04-28 14:33:13
4122
原创 四针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();}/************
2022-04-27 16:38:40
5672
7
原创 嵌入式软件面试高频基础——C语言
一、构造函数与析构函数用法与区别构造函数:是一种特殊的方法,一个类也可以有很多构造函数,可以根据其参数不同或者参数类型不同来区分,也就是重载。可以为对象成员赋初始值。常常与new运算符一起使用在创建对象的语句中。析构函数:对象所在的函数已调用完后,系统自动调用析构函数。进行清理善后工作。二、内联函数和宏定义区别1、内联函数和普通函数相比可以加快程序的运行速度,因为不需要进行函数切换,在编译时内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的替换,在预处理阶段被换到主函数中。2、内联函
2022-04-26 23:15:31
2043
4
原创 USB学习笔记——USB通信过程与枚举过程
在网上看到一篇文章就是讲这个的,仔细阅读后获得了很多感触,整理总结如下。一、USB接口在USB的集线器端D-,D+都接了下拉电阻,而USB设备端的D-,D+接了上拉电阻,所以当USB设备插入时可以根据集线器端D-,D+上的电压变化来判断是否有USB设备接入。检测到有设备接入后,可以根据D-,D+来判断USB设备的工作模式,是低速还是全速或者高速。所以D-,D+这两根线很重要。二、 USB数据传输过程主机与USB设备相互传输数据具体过程如下:1、客户软件首先将传输的数据放入缓冲
2022-04-10 22:11:58
4187
原创 结构体大小计算以及sizeof与strlen的区别
内存对齐这个知识点面试问的几率特别高,赶紧学一下吧,书到用时方恨少!!!一、结构体求大小这里主要还是联合体求大小,应为结构体大小在前面已经记录过了,本质还是内存对齐。联合体如何求占用内存大小:1.找到占用字节最多的成员; 2.union的字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员。typedef union { long i; int k[5]; char c;}D其中占用字节最大的数据类型是long,但是这里还有整型的数
2022-03-29 23:19:35
755
2
原创 linux中有名管道与匿名管道的实现
一、匿名管道多用于父进程与子进程之间的通信,用到的频率很高,挺重要的。定义一个大小为2的数组、使用pipe函数将其变为匿名管道的两端,fd[0]:代表读端、fd[1]:代表写端。子进程和父进程根据功能分别关闭读或写端。当然是使用read和write函数来对管道的数据进行读写,下面这个函数的功能就是父进程给子进程传输hello world,子进程读后把字符串发送到标准输出上。如下图可以看到结果是正确的。使用完都关掉、养成好习惯。int pipe(int filedes[2]);..
2022-03-28 21:17:37
762
原创 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.
2022-03-26 23:50:36
842
原创 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,
2022-03-26 00:53:33
2253
原创 虚拟内存与写时复制
一、什么是虚拟内存:之前记录了虚拟内存如何映射到物理内存的方式(内存管理方式):分段和分页。但是这两个策略都有相同的目标,就是同时将多个进程保存在内存中,以便允许多道程序。然而,这些策略都倾向于要求每个进程在执行之前应完全处于内存中。而虚拟内存技术则可以允许内存不必完全处于内存,就是执行的指令应处于物理内存中。二、虚拟内存的优点:运行的程序可以远大于物理地址,使我们不必担忧内存容量的限制,它实现的原理就是局部性原理。给每个进程都分配一个4G的看似连续的虚拟内存空间。方便内存共享,文件共享
2022-03-25 14:57:27
540
原创 linux系统调用过程
在用户程序调用read、write等系统调用时,linux内核发生了哪些动作呢。下面以write为例:调用write系统调用,进入C库执行write函数,就是产生了一个int 0X80的一个中断,这样程序就会进入内核态,中断会根据_NR_name来判断执行那个内核函数,他其实就是int 0X80的一个参数。处理好现场后进入系统调用表:所以wirte函数,具体的功能就是,触发int80中断,进行系统调用,调用号是__NR_write(#define __NR_write 4),最终会调用数组sys_c
2022-03-25 14:06:58
3830
原创 UBOOT启动流程——向量表重定位、命令处理——学习笔记
一、向量表重定位relocate_vectors将重定位后uboot的首地址放入r0寄存器中,因为向量表肯定就是从这个地方开始存放的,再将r0中记录的地址写入到CP15的VBAR寄存器中,就是将新的向量表首地址写入到寄存器VBAR中,设置向量表偏移。二、board_init_rboard_init_f并没有初始化所有的外设,需要board_init_r函数完成后续操作。主要就是初始化一些外设和gd的成员变量。调用init_sequence_r函数集合完成一系列的初始化,(这里做什么初始化看手
2022-03-24 12:15:20
911
原创 简述指针和引用的区别与使用场景
引用:相当于给变量起了一个别名,但是他的内部实现还是依靠指针来完成的。指针:指针是一个变量,用于保存另一个变量的内存地址。需要使用*运算符将指针取消引用,以访问其指向的内存位置。差异:1、指针可以重新分配,但是引用不可以,引用的赋值只在初始化时完成。指针三心二意、引用从一至终。2、引用与其变量共用同一个内存地址,但是指针有自己的内存地址。3、指针可以为NULL,但是引用不可以。4、指针可以间接传值,而引用不可以。使用场景1、使用链表或者树等数据结构时使用指针。2、如果数据
2022-03-24 00:52:36
2310
原创 正点原子UBOOT启动流程——学习笔记
一、UBOOT入口uboot的入口在u-boot.lds文件里面决定了,ENTRY(_start),所以uboot的入口就是__start,后面紧接着就是中断向量表的地址。到__image_copy_start 为 0X87800000,而.text 的起始地址也是 0X87800000,vectors 段的起始 地址也是 0X87800000,说明整个 uboot 的起始地址就是 0X87800000。__start执行时跳转到reset,reset函数跳转到了 save_boot_par
2022-03-23 18:09:27
1869
原创 正点原子imx6ullUBOOT顶层Makefile学习笔记
跟据正点原子的linux开发板手册与视频学习了uboot的顶层makefile工作流程。一、准备阶段$(MAKE) -C subdir:调用subdir目录下的makefile文件,make支持递归调用。ifeq ("$(origin V)", "command line") KBUILD_VERBOSE = $(V)endififndef KBUILD_VERBOSE KBUILD_VERBOSE = 0endififeq ($(KBUILD_VERBOSE),1) q
2022-03-22 17:58:11
1836
原创 文件系统inode分析——inode.c bitmap.c super.c
一、bitmap.c1.1free_blockget_super 通过设备号找出超级块,获得里面的信息判断块号是不是在范围内然后读取块信息,就把高速缓冲区拿出来没用就释放掉逻辑块对应高速缓冲区计算当前块号,然后区清空逻辑块位图上面对应的bit逻辑块位图对应的块设为11.2new_blocknew_block 新建一个块的函数获得了一个超级块for循环的8指的是我们的逻辑块位图找到第一个为0的位的位数然后修改数据 修改标志啥的然后得到block块号然后我们需要给这个块申请高
2022-03-21 17:49:17
744
原创 ROM、RAM、FLASH、DDR、EMMC、SSD区别——学习笔记
ROM:只读存储器,内容写入后就不能更改了,制造成本比较低,常用于电脑中的开机启动如启动光盘bios,在系统装好的电脑上时,计算机将C盘目录下的操作系统文件读取至内存,然后通过cpu调用各种配件进行工作这时系统存放存储器为RAM。PROM:可编程程序只读存储器,但是只可以编写一次。EPROM:可抹除可编程只读存储器,可重复使用。EEPROM:电子式可抹除可编程只读存储器,类似于EPROM但是摸除的方式是使用高电场完成。RAM:随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器,可以
2022-03-20 21:18:47
8230
原创 linux文件系统工作流程解析——busybox学习笔记
uboot引导内核启动时给内核传递参数是通过tagglist,那么内核向文件系统是如何传递参数呢,是利用inittab,文件系统的运行流程如下:对应的代码如下,省略了很大一部分代码,主要是为了与上图对应: signal(SIGHUP, exec_signal); signal(SIGQUIT, exec_signal); signal(SIGUSR1, shutdown_signal); signal(SIGUSR2, shutdown_signal); signal(SIGI.
2022-03-16 16:14:03
1489
原创 堆和栈的区别——详解
一、程序内存划分基础补充一个程序所占用的内存主要分为一下几部分:栈、堆、文字常量区、代码区、全局区。1.1 栈区 一般由编译器自动分配和释放,存放函数的变量、局部变量等。执行函数时内部局部变量在栈上创建,函数执行完成后栈上所占用的资源自动释放。栈运算在处理器的指令集上,效率高,但分配容量有限。1.2 堆区可以人为动态分配,程序在调用malloc和new时根据需求申请,但也要人为的使用free或delete进行释放。使用起来灵活,但效率不高。如果不人为的释放容...
2022-03-13 22:05:28
7201
2
原创 linux文件系统概述
文件系统也叫应用程序,写应用程序的时候不仅要存在文件系统中,并且还要使用文件系统的其他很多功能。大多数的嵌入式公司就是在做文件系统,如:系统界面、系统的开机画面、系统的ROM、系统的功能、预装的软件等。一、文件系统包括的重要部分:1、 标准库:glibc OpenGL media Framework2、配置文件:/etc/init.d/rcs 想要开机运行什么软件 载入什么画面 执行命令都可以写入rcs中。sys/ 开机时需要挂载的设备节点3、设备节点:/dev/console 控制台节
2022-03-13 20:44:38
2177
原创 C语言生成可执行文件的过程——预处理、编译、汇编、链接。学习笔记
程序想要运行起来必须经过四个步骤:预处理、编译、汇编、链接。一、预处理将代码中的注释、宏定义、条件编译、包含头文件插入等。宏仅仅是文本替换,不会计算。二、编译编译是程序构建的核心部分,编译成功后生成汇编代码,编译就是对预处理后的文件进行词法分析、语法分析、语义分析以及优化。。。词法分析:将代码分割为一个个记号,记号通常是关键字、标识符、特殊符号等等。将他们最后放到对应表中。语法分析:将词法分析产生的符号进行解析,然后将其构成语法树。...
2022-03-12 20:13:53
3273
原创 UCOSiii源码分析——os_time.c
这里的内容看懂就好,源码可以不读。一、任务延时函数 OSTimeDly()调用此函数可延迟当前正在运行的任务的执行,直到指定数量的系统计时结束。当然,这直接等同于将当前任务延迟一段时间以过期。如果指定的延迟为0,则不会产生延迟。如果指定的延迟大于0,则会导致上下文切换。可以使用OSTimeDlyResume()唤醒。p_tcb加入TickList中。void OSTimeDly (OS_TICK dly, OS_OPT ...
2022-03-08 23:00:22
1305
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人