0%

前排提示

因为Ubuntu再安装时,根分区是没有使用LVM进行磁盘管理的,所以如果想扩展根分区,我们不得不使用另外一种暴力的方法。简单来说就是利用fdisk删除原来的根分区再基于原来的起始块号重新建立一个根分区。从而达到扩展根分区的目的。

步骤

0、我在创建虚拟机的时候,硬盘只分配了50G,我的虚拟机基本配置如下:

1、首先使用df和lsblk查看我分区情况:

阅读全文 »

前言

ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。

导航

图24 通用定时器框图:

ADCFramework

图片截取自STM32 F1XX中文参考手册。还是以框图为中心,来叙述我对ADC的理解。

ACD实现细节

阅读全文 »

前言

前面已经分析了XV6的启动流程以及内存管理,接下来,我们探究进程调度的实现。与其说进程调度,我觉得可以顺应内存的虚拟化的叫法,将进程调度称为“CPU的虚拟化”更加贴切。

首先明确目前XV6的cpu的状态如下:关中断 & 进入了保护模式 & 安装了包括【内核&用户】【代码&数据】段描述符 & BSP分配了一个4K的内核栈 & 开启了以kmap为基础的粒度为4K的内核分页。

Onix相关链接:

XV6-x86的github链接:

阅读全文 »

前言

Onix是一款相对于XV6来说功能更为健全的单核OS,由于功能更加完善,Onix也更加复杂。代码阅读起来会比较绕。

XV6是一款简单易读的多核操作系统,但其功能相对Onix来说更为简陋,比如Onix对物理内存的管理采用了位图、内核内存和进程相关的内存进行了分开管理,页目录使用单独的内核内存,没有和页表、页框混用等。而XV6显得非常简陋。尽管XV6的实验可以弥补部分缺陷。

Onix操作系统也实现了bootloader,对于将OS加载到内存的操作,Onix是采用汇编进行内核加载,并且在加载内核前,还会进行一个内存探测的操作,所以Onix的bootloader稍微有些复杂。而XV6操作系统的启动操作写的非常简洁,加载内核的操作采用的是C语言的形式,非常利于阅读学习,但是XV6不会进行内存探测。为求方便,本文主要叙述XV6的启动流程。

Onix相关链接:

XV6-x86的github链接:

阅读全文 »

前言

前一章我们介绍了XV6的启动流程,在本章,我们就要开始介绍类Unix操作系统最重要的一部分——内存管理模块。

本文以XV6里面的内存管理为主,后面会提炼Onix中内存管理比较好的部分,来对XV6进行一个补充。

Onix相关链接:

XV6-x86的github链接:

阅读全文 »

前言

支持一对多(一主多从)、多对多传输(多主多从),只支持半双工,一般有两根数据线:SCL(Serial Clock Line)、SDA(Serial Data Line)

I2C有两种实现方式:一种是GPIO软件模拟,另一种是直接使用I2C硬件。

I2C软件实现

软件实现I2C的好处就是我们可以任意的选取GPIO口作为SDA、SCL线。

硬件电路的设计

硬件连接图如下:

阅读全文 »

前言

本节主要讲解STM32利用通用定时器,利用CCR和CNT寄存器,输出指定占空比和频率的PWM波形。其功能的应用有:实现LED呼吸灯的效果、控制步进电机、控制直流电机转速等。

导航

图98 通用定时器框图:

nevigate

图片引自STM32 F1XX系列的中文参考手册。在通用定时器章节的定时器架构图中,本章讲解的定时器输出功能位于右下角的红色矩形中。

定时器实现PWM输出的实现细节

阅读全文 »

前言

本节主要讲解STM32利用通用定时器,在输入引脚出现指定电平跳变时,将CNT的值锁存到CCR寄存器当中,从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有:波形采样。

导航

图98 通用定时器框图:

nevigate

图片引自STM32 F1XX系列的中文参考手册。在通用定时器章节的定时器架构图中,本章讲解的定时器输入捕获功能位于左下角的红色矩形中。

定时器输入捕获的实现细节

阅读全文 »