- 博客(29)
- 收藏
- 关注
原创 socket网络编程
如果连接没有断开,接收端接收不到数据,接收数据的函数会阻塞等待数据到达,数据到达后函数解除阻塞,开始接收数据,当发送端断开连接,接收端无法接收到任何数据,但是这时候就不会阻塞了,函数直接返回0。,当没有新的客户端连接请求的时候,该函数阻塞;当检测到有新的客户端连接请求时,阻塞解除,新连接就建立了,得到的返回值也是一个文件描述符,传输,这样主机不管是大端还是小端,从网络中获取的数据都是大端的,之后按照自己的模式做转换即可。为了保证数据传输的字节序,规定。
2024-08-22 15:16:52 1026
原创 通信协议+知识点总结
采用非破坏性位仲裁机制,即对各个消息的标识符(即ID号)进行逐位仲裁(比较),如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态。每次发送数据前,节点都会监听总线的状态,如果总线状态为空闲时,它就会立即向总线上发送自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,应称为数据包(数据帧),也叫做。为防止突发错误而设定,CAN协议中规定,当相同极性的电平持续五位时,则添加一个极性相反的位。
2024-06-27 21:16:41 1017
原创 Linux笔记
挂在实现了文件系统与硬盘物理结构的隔离如上图所示,硬盘SDA1划分了两个区域,其中2区挂载在根目录下,而属于2区根目录下的boot挂载在1区,对boot的操作变成了对1区的操作。同样的,若此时有一名用户想独自使用一块硬盘存放自己的信息,它只需要将硬盘SDA2挂载在home下。从系统层面上来看,操作此用户与其它用户无异。
2024-06-27 21:13:08 581
原创 buildroot添加ssh功能
在制作了自己的buildroot生成的根文件系统之后,是没有ssh服务的,需要自行添加。重新编译,还不能通过电脑连接,还需配置并打开ssh服务。原因是/var/empty没有对应的用户权限。修改PermitRootLogin为yes。再次启动sshd,连接成功。
2024-05-10 15:46:54 576
原创 Saving Environment to FAT... Card did not respond to voltage select!
mmc 1:1说明使用的是EMMC的第1分区,也就是说我想使用SD卡,但在后续板级初始化时,系统会更改MMC,而默认使用的是EMMC,所以需要将其更改SD卡。因为板子是自己设计的,只留了SD卡,没有EMMC,所以刚开始以为是虚焊等硬件问题,但进一步分析,既然都到这一步了,SD卡肯定是能正常使用的。发现它确实被默认配置为EMMC启动,所以这里将1改为0,重新编译,orangepi和自己设计的板子均正常运行。查看源码发现这与环境变量有关(读不到MAC地址),进一步坐实了MMC的问题。
2024-05-08 14:39:07 623
原创 xv6中的fork()和exec()
在明白了xv6调度器的工作原理后,我们知道进程在运行时会被定时器打断,流程类似于yield()->sched()->swtch()->scheduler()->swtch()->sched()->yield()。但对于一个还没有运行的进程,这样的流程显然是不行的,它需要一个初始化的程序,这个程序就是forkret(),forkret()会在allocproc()函数里被调用。这里部分的结构体变量是直接复制父进程的,包括sz,tf,ofile,cwd等,而改变的有parent,pid,context等。
2024-01-24 15:58:41 1335
原创 Traps and system calls
trap类型分为三类:interrupts、exception、system calltrap处理方式分为三类:user trap、kernel trap、system call。
2024-01-20 14:55:49 845
原创 Interrupts and device drivers
驱动程序的中断处理程序,作为底部的一半,计算出哪个操作已经完成,如果合适的话,唤醒一个等待的进程,并告诉硬件开始任何等待的下一个操作。bottom half是控制台驱动的下半部,由中断执行,一有数据接收到就把数据存进buffer,解除top half阻塞,为top half提供数据,作为生产者。在有键盘字符输入时,它会触发中断,将我们输入的字符在控制台里回显,同时把字符存在buffer缓冲区里,直到回车才会解除shell进程的阻塞,进而处理输入的指令。在"$ "打印完之后,就是控制台的输入部分了。
2024-01-20 14:09:54 903
原创 Locking
原子”是物质的最小组成,即原子是不可分割的。虽然到现在科学家已经发现在原子内部有更小的成分,但是在广义上原子仍然保持“不可分割”的语义。那么在芯片中的原子性是什么呢?它延续了“不可分割”这个含义,表示该系列指令的执行是不可分割的,完成的操作不会被其它外部事件打断,我们就说这系列指令遵循原子性。
2024-01-20 14:09:18 910
原创 File system
xv6构建的文件系统十分小巧并且功能齐全,虽然与现在的主流文件系统(FAT32、EXT4…)仍有差距,但文件系统实现的思想都大同小异,所以xv6的文件系统值得我们学习。文件系统使用分层的思想:每一层分别实现某一功能;下一层为上一层提供。文件系统在磁盘的组织形式也很简单。文件系统按照下图将各部分写入磁盘后,之后的读写都要按照下图的格式来进行。
2024-01-20 14:06:12 947
原创 6.S081 Locks
看到这一段代码,多核会出现这样一种情况:两个进程同时运行到r = kmem[i].freelist,其中一个获得锁进入了if( r ) ,而另外一个再获得锁时,也可以进入if( r ) 里面,但此时该页已经被引用过了,所以出现了我们上面看到的bug。但是就像实验所说,kalloc()的实现更复杂了,因为它需要在内存不够的时候(freelist为空),去别的核心的freelist中去“偷”内存块,放入自己的freelist里为己所用。所以在这里是会出现自旋的,我们的锁也是在这里应用。
2023-12-05 14:58:54 904
原创 6.S081 Copy-on-Write Fork for xv6
但它的整个过程都是在内核态进行的,也就是说,它使用的是内核页表,而内核对用户区的权限是很高的(可读可写,见kvminit())。但是我们还是避免不了在exec()前进行一些其他操作,比如它会调用父进程的函数,dup()也需要父进程里的文件信息,甚至有的fork()后面就不会跟exec()为了保证两个进程的隔离性,我们必须要把两个进程的权限都设为不可写,换句话说,出现的原因是我们还没有修改内存释放相关的代码,用的kfree()还是以前直接复制情况的代码,我们还没有进程结束,那么在哪里会调用kfree()呢?
2023-11-27 20:55:28 944
原创 Makefile中的include
首先看下面这段makefile第一次make:第2次make:分析整个执行过程:所以第一次make的执行过程就变成:执行all目标扩展all里面可以使用变量Ainclude包含的也可以是makefile,因为是原地替换,如果include的位置在all前面的话,执行的就是其他目标而非all目标-include-include与include唯一的不同:不报警告
2023-07-15 22:55:07 518 1
原创 imx6ull移植Qt
buildroot在编译过程中要保证联网,因为它会从服务器上下载所需的东西。因为很多服务器部署在国外,所以有时构建过程会特别漫长,如果下载速度过慢,可以选择离线下载对应压缩包的方法。如果遇到上图的情况,可以先暂停make,首先进入压缩包的网址,下载好后将压缩包放到buildroot/dl/目录下的对应文件里(不用解压),之后再重新make,buildroot会在dl目录下找到对应的压缩包并解压(解压后的源码会放到buildroot/output/build下),之后重复操作即可。
2023-03-05 21:29:36 540
原创 Qt远程连接MySQL
在应用程序和数据库之间有一个驱动程序ODBC,不同DBMS(数据库管理系统,如MySQL,Oracle…)的驱动,并将其交给ODBC管理,而应用程序只需调用ODBC提供的接口,就能实现对数据库进行增删改查的操作。
2023-01-11 22:08:21 901
原创 IAP实验笔记
ISP和IAPISP:在系统编程。通过芯片上已经固化好的bootloader,从串口将代码写入内部的flash。这块bootloader位于系统存储区,置位boot引脚来选择系统存储器为启动区域。IAP:在应用编程。用户根据自己需要将flash分成两个区域,一块用作bootloader,一块是我们正常运行的程序(app),而bootloader的作用和上面ISP的一样,将app代码引导至flash中。IAP过程stm32正常运行流程从图中可以看到,在0x08000000处存放着程序的中断向
2022-04-12 22:11:03 5823 2
原创 PID算法理解
在整个控制系统中,pid算法的作用就是稳准快地到达我们需要的目标值,我们通过举例,对一个简单的温度控制系统来定量分析位式控制算法在介绍pid控制算法之前,我们先来看一下最简单的位式控制算法位式控制算法特点:只能输出低电平和高电平,即开和关两种状态在温度控制系统中,如果我的目标温度值设置的是100°c,而通过温度传感器得到的当前温度是70°c,那么我的开关闭合,进行加热;反之,温度超过100°c,开关断开或者启动其他制冷装置,进行降温。这样的一个带有反馈装置的温度控制系统其实已经能满足我们的需求
2022-02-09 13:02:42 1325
原创 github部署项目
github部署项目创建仓库创建一个仓库用来管理我们需要用的项目创建完后我们记下之后需要用到的ssh,之后需要这个与本地仓库关联将文件部署到github创建一个文件夹用来存储即将克隆的文件(此处创建F:\桌面\test)在test文件夹内Git Bash,输入:git clone 上面的ssh例如我的就是:git clone git@github.com:cpy12138/stm32.git可以看到远程仓库被我们克隆到了本地里面有一个.git隐藏文件,这就是我们刚刚从githu
2020-12-11 16:26:11 347
原创 FreeRTOS双时基
FreeRTOS双时基:FreeRTOS时钟HAL库时钟在FreeRTOS中采用双时钟,操作系统的时钟又一个时钟源提供(cubemx必须为内核时钟systick),HAL库的时钟由另一个时钟源提供为什么需要两个时钟源在没有操作系统的情况下,我们在用函数delay进行延时操作时,假设使用systick作为时钟源进行精准延时,我们就需要把systick中断的优先级设置成最高.如果不是最高,那么其他优先级比systick高的中断就会抢占.有了FreeRTOS操作系统,因为我们需要实时性,systi
2020-10-28 15:28:54 456
原创 简易示波器制作
从零开始示波器准备用stm32自带的内部adc操作原理:1.adc采集数据2.刷新屏幕3.循环注意:lcd屏幕刷新速度远比adc采集数据速度慢很多大体思路准备上最近刚学的FreeRTOS,分为这三个任务:1.刷新屏幕2.采集数据3.数据处理新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown
2020-08-19 12:37:12 4225 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人