- 博客(105)
- 收藏
- 关注
原创 Peripheral Drivers in ESP-IDF(4)——UART(1)
ESP-IDF使用uart_obj_t结构体来抽象一个UART设备中可能拥有的所有属性,以及数据缓冲区和一些读写数据时应该记录的信息,这个结构体拥有的域比较繁杂,具体的字段我们在驱动中遇到时再展开解释/*!< UART 端口号 (0, 1, 2) *//*!< UART 事件队列大小 *//*!< UART 中断处理程序句柄 *//*!< UART 模式 (UART / RS485 / IRDA) *//*!< RS485 碰撞检测标志 *//*!< UART RX 超时检测标志 *//*!
2025-03-18 14:22:05
864
原创 Peripheral Drivers in ESP-IDF(3)——WatchDog Timer
本文介绍了ESP32系列MCU中看门狗定时器相关的内容,以及在ESP-IDF中对看门狗的软件抽象以及封装。具体来说,IDF中利用硬件上的两个定时器组中的看门狗定时器,分别作为了任务看门狗(MWDT0)和中断看门狗(MWDT1),并分别通过监视FreeRTOS中的两大基本机制——IDLE TASK和tick中断,实现了对非法超时情况的监视与警告。
2025-02-11 15:16:14
734
原创 Peripheral Drivers in ESP-IDF(2)——GP Timer
这篇博客是ESP-IDF外设驱动系列的第二篇,这篇博客的研究对象是ESP32系列MCU中的定时器组,涉及到的和之前的思路类似,首先,随后深入研究定时器外设的使用方法和其驱动结构组织。
2025-01-20 16:03:53
833
原创 Peripheral Drivers in ESP-IDF(1)——GPIO
GPIO作为最基本的外设,它的构造和使用还是相对简单的,大部分情况下只需要写入对应管脚的配置寄存器即可改变对应GPIO管脚的属性。然而,GPIO的使用经常会和一些其他组件关联起来,例如GPIO交换矩阵IO多路复用器中断交换矩阵等。本篇博文对有关GPIO的一些基本操作进行了简要的介绍,并对有关GPIO的中断处理程序的基本工作流程做了较为详细的介绍。
2025-01-07 11:49:43
1014
原创 6.S081——CPU调度部分(Xv6中的进程的状态转换)——xv6源码完全解析系列(11)
好了,我们终于可以总结一下进程的各个状态,以及它们的具体含义和转换方式啦,这就当作一个完美的收官吧,Xv6内核中进程相关的状态及其转换关系如下图所示:哎呀,从没想过这篇博客会写这么长,不过这篇文章算是将Xv6中与进程有关的内容彻底收了个尾,也算是可以安心地进入Xv6中最复杂和体量庞大的文件系统了!
2024-06-18 11:11:27
1832
9
原创 2024届秋招小记
但我回顾过去的求学和生活经历,好像那些岁月静好的日子只是点缀,反而那些经历过的一个个挫折,一些伤心和痛苦的经历,一个个解过的bug才是构成我所有认知和个体的“骨架”。企业会收到很多优质的简历,但却无法分清这里有哪些人是真心想来的,只能不断地反复决策,等前面的人放弃了机会再联系排位靠后的人,整个招聘流程变得非常漫长和缓慢,尽管这样的情况一直存在,但海投一定会让事情变糟很多倍。这些留言和问题我都看到了,有关于Xv6系统的博客依然会更新下去,包括繁复冗长的文件系统的代码,我都会写下去的(又开新坑…
2023-10-21 01:53:03
1084
5
转载 Embedded Linux Development——Note (2)——字符设备驱动的开发流程
这篇文章是我学习Linux设备驱动开发的笔记,是在阅读正点原子的教程中的摘要,所以版权将会被标记为转载。我们首先梳理一下开发一款字符设备驱动程序的流程,然后在此基础上分析一下最简单的设备驱动程序LED的开发流程。最后作为补充,再加入一些关于新版驱动程序编写的流程。吐槽一下,正点原子的教程,逻辑太乱了,看的时候绕来绕去。假设我们我们已经有了一个字符设备驱动模块,驱动编译完成之后的模块后缀是.ko,有两种方法可以加载驱动模块:insmod和modprobe,它们的基本用法如下:insmod和rmmod是配对的
2023-08-05 16:42:27
678
原创 6.S081——CPU调度部分(CPU的复用和调度)——xv6源码完全解析系列(10)
终于到这里了,我们在之前阅读很多地方的内核代码时,总是习惯性地绕开CPU调度的部分(比如yield函数)。现在我们总算可以深入进去一探究竟了,这次总算是将整个操作系统中的一块重要拼图拼上去了。有操作系统相关基础概念的人应该知道,操作系统的其中一个重要功能是虚拟化(Virtulization)。这是OSTEP(Operating System : Three Easy Pieces,中译名:操作系统导论)提出的操作系统三大主题之一,另外两个是并发(Concurrency)和持久性(Consistency)。虚
2023-07-11 17:04:40
2641
20
原创 6.S081——并发与锁部分(自旋锁的实现)——xv6源码完全解析系列(9)
这段代码还会调用__sync_lock_release函数来原子地对锁进行释放,其实就是将锁的被占用标志原子地置为0。所以逻辑还是比较简单的,在阅读上述代码时,请多注意这些原子访存指令和内存屏障指令,它们是构成锁机制的核心。
2023-07-02 19:12:58
1156
3
原创 6.S081——设备中断与驱动部分(串口驱动与Console)——xv6源码完全解析系列(8)
真的是很复杂的流程啊,想必看到这里人都懵逼了吧,其实我也开始混乱了…console、键盘、屏幕、shell、串口,它们是怎么交互和连接的,现在是有点太过于拘泥于细节而失去了全局观了。下面我就画出整个连接关系的全貌,作为这两篇博客的总结。在上图中,循着任何一种颜色的线条都可以将流程顺利捋顺,这就是对整个部分的总结。console的定位就是一个软件抽象出来的设备体,它专门用来缓存用户输入的字符,并对其中输入的特殊字符和组合键进行预处理,使得串口可以正常打印,shell可以正常解析。
2023-06-26 23:38:10
1131
2
原创 6.S081——陷阱部分(内核陷阱与时钟中断)——xv6源码完全解析系列(6)
在上一篇博客中,我们通过系统调用这个重要的机制了解了Xv6操作系统中。这篇博客则准备研究一下,在研究内核陷阱流程中一个麻烦的家伙是定时器中断,首先它是一种由CLINT转发而来的本地中断,定时器终端往往会导致CPU的调度,进而将陷阱的处理流程变得错综复杂,这篇博客并不打算深入研究调度过程,这部分内容我们放在后面阅读对应源码时仔细研究。上次我们在阅读。
2023-06-01 21:14:02
2156
原创 6.S081——补充材料——RISC-V架构中的异常与中断详解
在RISC-V标准中,将异常(exception)定义为当前CPU运行时遇到的与指令有关的不寻常情况,而使用中断(interrupt)定义为因为外部异步信号而引起的让控制流脱离当前CPU的事件。而陷阱(trap)表示的则是,由异常或者中断引起的控制权转移到陷阱处理程序的过程。其实Xv6的定义和RISC-V的定义是相互兼容的,我们说在Xv6中有三种方式会触发陷阱:系统调用、中断和程序异常,其实系统调用中的ecall指令和程序执行中的异常都属于RISC-V标准中定义的异常情况,而。
2023-05-30 23:56:35
8364
11
原创 6.S081——陷阱部分(一文读懂xv6系统调用)——xv6源码完全解析系列(5)
在动笔写下这篇博客时,我只是想把Xv6的系统调用过程一点点弄清楚梳理下来,在这个过程中我查阅了许多RISC-V规范和相关书籍,并一直参阅Xv6 Book。结果没想到弄清一个小小的write系统调用,我竟然写了1.2万字,才将这过程中每一行代码研究清楚。即便如此,这个过程中还是有一些残留的问题,比如开关中断的时机(intr_on,intr_off),以及为什么要在usertrap中再保留一份epc的值,这些要完全搞明白需要后面中断、调度的相关知识。
2023-05-03 17:12:03
3938
16
原创 6.S081——Lab3——page table
至此,就完成了6.S081 Fall 2021的第三个实验,有关虚拟内存和页表机制的实验内容。总的来说实验难度都没有很大,在指导书的帮助下可以很快完成。但是对于内核代码的研究却远远没有结束,接下来的实验内容涉及到操作系统中最重要的一个部分,那就是终端和陷阱机制的实现。已经迫不及待去扒一下对应的源码了…哈哈。
2023-04-19 14:18:14
2668
4
原创 6.S081——虚拟内存部分——xv6源码完全解析系列(3)
没想到vm.c这份代码文件还没有读完,不过剩下的也就。这篇博客就将整个虚拟内存部分的代码收个尾,然后。
2023-04-10 12:29:18
2121
7
原创 6.S081——虚拟内存部分——xv6源码完全解析系列(2)
上一篇博客中,我们详细分析了xv6内核代码中有关虚拟内存的部分,主要剖析了vm.c这个文件中的三个全局变量和6个函数,这篇博客。接着剖析和阅读接下来的源码,同样
2023-04-06 13:04:19
3227
原创 6.S081——Lab2——system calls
本实验的目的是在xv6中实现系统调用,这个过程中涉及到一些xv6中系统调用的基本机制,如系统调用号、如何从用户态向内核传参数、如何将结果从内核空间再传回用户空间(copyout)等。但要更加深入的理解系统调用的全过程,还需要在后面。argraw的逻辑非常简单,就是从对应的trapframe中返回a0-a7寄存器,因为根据RISC-V的calling convention,头几个寄存器是。,上一个实验更多的是使用已有的设施去实现一些功能各异的程序,这需要我们对系统调用的过程有更加深入的理解。
2023-03-26 13:05:09
1616
1
原创 6.S081——Lab1——Xv6 and Unix utilities
这就是6.S081的第一个实验,主要考察的就是系统编程,其实其中后三个任务还是有一定难度的。不过经过编写这些代码,多少还是对系统调用有了更深的认识,这是很大的收获。其实在做xv6的实验时,更大的收获不是解决实验内容本身,这些实验内容只是xv6的很小一部分功能,要在解决问题的同时和内核代码一起玩耍,调试并阅读源码,这才是学习这门课的精华所在。
2023-03-23 23:45:56
1644
2
转载 Embedded Linux Development——Note (1)——嵌入式开发环境的搭建
这个系列博客记录在嵌入式Linux开发过程中,内容参考了的教程。首
2022-12-31 11:42:19
455
原创 LeetCode——Weekly Contest 321
这段时间经历了组会、开题、回家等等,这才发现周赛已经打到325场了,而我还没有写完321场的题解记录,真是汗颜啊。
2022-12-20 11:23:09
456
原创 Reading Note(10)——AutoBridge
这篇论文是FPGA 2021年的best paper award,主要解决的是在HLS编译过程中优化布局和布线,最终达到整个multi-die的FPGA板上的大规模HLS设计时钟频率尽可能提升的目的,这篇工作在当前chiplet工艺铺展开来的当下更加有现实意义,通过这篇文章学习一下如何对Multi-Die场景下的模块进行建模。这部分首先肯定了HLS作为工具链的高效性和实用性,但是也指出HLS工具目前的一个问题在于HLS和RTL级代码之间可以达成的性能差距很大。
2022-12-05 13:04:02
748
2
原创 Reading Note(8) ——GNN for DSE Optimization
这部分作为全文的摘要, 和上一篇AutoDSE一样,提出了当前开发FPGA加速器的主要难点在于FPGA的开发门槛太高。另一方面虽然HLS的诞生在一定程度上缓解了这个问题,但是它在很多层次上涉及到HLS参数的选择,这个解决空间是非常大的,这个选择非常依赖于设计者的经验。另一方面,从HLS工具获得结果反馈耗时也非常大,一般在几分钟到数小时。这篇工作针对这种情况开发了DSE-GNN框架,主要方法是通过GNN来拟合HLS模型来使得它可以应用于非常广泛的应用场景,从而使得设计者在毫秒级就可以得到。
2022-11-21 11:40:33
951
原创 Let‘s Talk About HeteroCL(1)—— Reading Paper
摘要部分指出了当前应用需要部署在异构系统上的切实需求,但是由FPGA构成的异构系统往往面临着使用门槛高,使用不方便的现状,只有拥有丰富硬件知识和设计经验的程序员才可以自如地使用FPGA来进行异构计算加速。HeteroCL就是来解决这一问题的,HeteroCL由基于python的DSL和面向FPGA的编译流组成。除此之外,HeteroCL提供了一个非常干净的抽象层,可以将算法描述和计算调度、数据类型、访存结构三者解耦开来。
2022-10-23 13:18:58
632
原创 LeetCode——Weekly Contest 314
LeetCode周赛第314场记录周赛第一题,根据题意写出代码即可。首先根据logs计算出每项工作的实际用时,然后根据用时长短对员工的ID号进行排序即可。给出完整代码如下:2433. 找出前缀异或的原始数组这道题也很简单,主要就是考察异或运算的性质。本题考察的实际上就是性质2,我们只需要将pref的相邻两个数字两两异或就可以解密出原有数组arr,以下是完整代码:2434. 使用机器人打印字典序最小的字符串(模拟栈+贪心)这道题很容易在比赛时卡住,从题面的描述上可以很快地反应出对机器人的两种操作
2022-10-11 18:18:39
472
1
原创 LeetCode41——First Missing Positive——hashing in place & swap
这道题让我们找出一个数组中的缺失的第一个元素,也就是最小的一个正数,题面如下:其实如果只实现这个功能的话并不难,难点在于题目中对算法的时间和空间复杂度同时做出了约束,即时间复杂度是O(n)O(n)O(n),与此同时空间复杂度是O(1)O(1)O(1)。在完成这道题之前,有一个点非常重要的观察就是:对于长度为N的数组nums,其最小缺失的正数只会位于区间[1,N+1][1, N + 1][1,N+1]内,也就是说,长度为N的数组最多只会占用[1,N][1,N][1,N]这N个正整数,从而使缺失的第一个正
2022-06-28 21:18:04
276
原创 Advanced Computer Network Review(5)——COPE
本文参考资料来自:1.论文原文《XORs in The Air: Practical Wireless Network Coding》(SIGCOMM’06)2.课程演示文稿根据复习提纲,对于COPE应该弄懂以下几个问题:1.理解butterfly网络2.理解COPE的编码算法3.理解COPE的一个实例全文的一个核心是利用了异或(XOR)运算的一个特点,即a⊕b⊕b=aa \oplus b \oplus b = aa⊕b⊕b=a,即原始值经过两次异或某一个相数值后会变成原来的值,这是本文使用的
2022-06-12 00:36:58
953
2
原创 Advanced Computer Network Review(4)——Congestion Control of MPTCP
这篇文章对有关MPTCP的拥塞控制进行理解和梳理,参考资料来自:《Design, implementation and evaluation of congestion control for multipath TCP》(NSDI’11)和老师上课时的PPT。复习提纲中要理解的问题是:1.MPTCP拥塞控制的目标2.理解EWTCP和Coupled3.可以判断EWTCP和Coupled各自获取的带宽一、MPTCP拥塞控制的目标这部分是自己的理解和总结,从论文中来看,MPTCP拥塞控制的目标有两个:
2022-06-08 21:47:17
1909
9
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人