硬链接 软链接 符号链接

链接

简单来说是文件共享的方式。

硬链接

具有同样的索引节点和文件属性,只有链接数=0的时候,才会用磁盘删除内容。

  • 不允许给目录创建硬链接。

  • 不可以给不同文件系统的文件间建立连接。因为 inode节点 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了。

软链接
符号链接

软链接也叫做符号链接。没有文件系统限制。软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

  • 软链接的链接数目不会增加;

  • 可以给目录增加链接。

git svn常用操作

git

1
2
3
4
5
git add xxx 											// git添加文件

git commit -m "add syslog && ipaddress" // git提交本地

git push // git提交远端

svn

1
svn merge -r HEAD:12098 .        // svn回退到某个版本

  • 步进电机工作原理本质:靠励磁绕组产生的旋转合磁场带动转子做同步运动。由于励磁绕组通电之后产生的磁通量正比于电流大小,所以只要控制通过流过各个绕组的电流大小和方向就可以控制步进电机各个绕组产生的合磁场大小和方向。

  • 相数:是指电机内部的线圈组数,如4相就是有ABCD四组线圈。

  • 拍数:是指完成一个循环的通电次数。例如按照ABCD顺序完成一个循环,就称为单4拍。相邻的两个线圈也可以同时通电,例如可以按照AB-BC-CD-DA方式通电,这种就称为双4拍。注意,对同一个电机来说,单四拍与双四拍每拍转动的角度是相同的。还有一种方式是单个线圈与双个线圈轮流通电,就是A-AB-B-BC-C-CD-D-DA,这样就是四相八拍,这种方式工作时每拍转动的角度是4拍的一半。

  • 励磁方式:分为全步励磁和半步励磁,其中全步励磁又有一相励磁(在没每一瞬间步进电机只有一个线圈导通,步进电机旋转1.8度)和二相励磁(在每一瞬间,步进电机有两个线圈同时导通1.8度);半步励磁又称一二相励磁(线圈交替导通)。

  • 步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子齿数J*运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步)。

  • 细分:通过等角度有规律的插入大小相等的电流合成向量,从而减小合成磁势的步距角。力矩越大,步进角越大。正弦细分驱动的本质实际上就是通过绕组A和绕组B的电流分别按照正,余弦规律变化,使得合成电流矢量圆周均匀旋转。

  • 升降速控制:运动速度根据运动参数当中的细分数和步数做选择。细分数约大平均运动速度越慢,反之越快。比如细分1024,相同的步数速度则会很慢。

  • 力矩速率关系:当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。

  • 空载启动频率:即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。

  • 合成电流:以两相电机为例,如果控制绕组的电流按照正余弦变化,那么绕组合成电流矢量或者磁场矢量将以恒定大小,均匀角度做圆周运动。使得力矩恒定,步距角均匀。

    image-20240328203237016

SPWM 脉冲宽度调制技术

PWM

目前一般采用脉冲宽度调制(PWM)技术来精确控制绕组电流的大小。主要是因为冲量相等而形状不同的窄脉冲加在具有惯性的环 节上,效果基本相同。步进电机的绕组由于电流不会突变,具有明显的惯性 环节,因此可以用 PWM 技术来控制电机绕组的电流大小。

如图所示。周期脉冲 信号的导通阶段对绕组进行充电,截止阶段绕组通过续流回路 进行放电。当脉冲的频率和宽度达到一定值时,绕组的电流将基本是一个恒定值, 并带有微小的纹波信号。当脉冲宽度改变时,绕组的电流也将发生变化。所以 PWM 可用来精确控制绕组电流的大小。

image-20240328203617119

即pulse width modulation,脉冲宽度调制,实际上就是周期的矩形波,然后每个周期的占空比都可以自己设置就叫做调制。

相比SPWM,多加了一个S,即sin,正弦脉宽调制。还是这个周期的矩形波,但不同的是占空比不是固定的,而是按照正弦规律变化的。

SPWM一般由三角波(载波)和正弦波(调制波)比较而成,硬件生成方法是将三角波和正弦波加入比较器得到,软件是通过定时器或Epwm模块,按照中央计数模式生成三角波,经CCR比较模块动作产生对于高电平,即SPWM。

升降频控制技术

步进电机从静止启动时,由于惯性和摩擦力矩的作用,如果转动频率突变太 大可能会丢步甚至堵转;当步进电机在高速运转时如果突然停下来,则可能会过 冲,这些情况都会导致运动不平稳以及定位精度不高。所以引出了升降频控制技术。

由于步进电机升速过程当中输出力矩明显减少,因而步进电机的升速曲线的 设计尤为重要。步进电机的升速过程一般由突变频率和加速曲线过程。

实际上步进电机转动频率不是连续变化的而是离散的,因而升速曲线一般 是指运行频率与脉冲数的关系曲线。由于步进电机降速过程中输出力矩增大,因而对降速曲线的要求比升速曲线 低得多,只要保证不因为惯性而过冲超步即可

image-20240328204102555

SPWM 软件生成

利用单片机来生成PWM,然后让占空比按照正弦规律变化。

步骤
  • 生成载波,比如要生成一个10KHZ的三角波,将计数器设置加减计数、周期设为1/10K

  • 生成正弦波,用软件生成正弦表即可,

  • 将正弦波和三角波比较。设置计数值到达的时候进行比较,改变比较值,用查表法获得,用于下一个周期比较。调制度m = 正弦表最大值/三角波计数最大值。 如正弦表最大值4200,三角波最大计数值8400,m=4200/8400=0.5,此时spwm最大占空比为50%,设置m=1,spwm最大占空比为100%。

    image-20240325084615541

    要注意因为是单极性调制,spwm和三角载波都是大于0的。在单相全桥逆变电路中,开关管交替导通时输出电压Ud自然会倒过来为负,Ud经过滤波就是一个正弦波。

定时器相关

一般电机控制都是边沿对齐模式,FOC电机一般使用中心对齐模式。

边沿对齐模式 –> 在递增计数模式下,计数器从0递增到ARR值,然后重新从0开始计数并产生计数器上溢事件。

DSP控制三相步进电机时,为什么会用一对互补的PWM波形来控制?

对于某种特定的电机来说,每一相位都有高位的MOS和低位的MOS,要驱动这两个MOS还不能同时开和同时关,必须上开下关或者下开上关,所以要用互补的PWM来控制。如果是用专门的MOS驱动芯片驱动的话,是可以用一路PWM的。

syslog.conf介绍

syslog采用可配置的、统一的系统登记程序,随时从系统各处接受log请求,然后根据**/etc/syslog.conf**中的预先设定把log信息写入相应文件中、邮寄给特 定用户或者直接以消息的方式发往控制台。ps:不同平台下的文件不一定相同,可以在etc下grep /var/log/messages等来查看文件名。

具体示例

*.err;kern.debug;daemon.notice;mail.crit [TAB] /var/adm/messages

这行中的“action”就是我们常关心的那个/var/adm/messages文件,输出到它的信息源头“selector”是:

*.err – 所有的一般错误信息;

kern.debug – 核心产生的调试信息;

daemon.notice – 守护进程的注意信息;

mail.crit – 邮件系统的关键警告信息

IP地址类型

每个IP地址包括两个标识ID,网络ID和主机ID,根据网络ID的不同分为A,B,C,D,E,类地址。

其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。

A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是O,B类地址的前两位总是10,C类地址的前三位总是110。

A类

一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。

⑴ A类地址第1字节为网络地址,其它3个字节为主机地址。

⑵ A类地址范围:1.0.0.1—126.255.255.254

⑶ A类地址中的私有地址和保留地址:

​ ① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)

​ ② 127.X.X.X是保留地址,用做循环测试用的

B类

一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。

⑴ B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。

⑵ B类地址范围:128.0.0.1—191.255.255.254。

⑶ B类地址的私有地址和保留地址

​ ① 172.16.0.0—172.31.255.255是私有地址

​ ② 169.254.X.X是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP。

C类

一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。

⑴ C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。

⑵ C类地址范围:192.0.0.1—223.255.255.254。

⑶ C类地址中的私有地址:192.168.X.X是私有地址。

D类

D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

⑴ D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。

⑵ D类地址范围:224.0.0.1—239.255.255.254

E类

以“11100”开始,为将来使用保留。

全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

⑴ E类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为11110。

⑵ E类地址范围:240.0.0.1—255.255.255.254

linux下时间处理

格林尼治时间

  • 所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1 日午夜(0点)。这是“UNIX纪元的起点”,Linux也不例外。Linux系统中所有的时间都以从那时起经过的秒数来衡量。

时间转换关系

image-20240301170335842

其中,虚线表示的三个函数localtime,mktime,strftime受到环境变量TZ的影响,如果定义了TZ,则使用其,如果没有,则使用协调统一时间UTC。

timespec结构体

1
2
3
4
5
6
7
struct timespec
{
...
time_t tv_sec; 秒数
long tv_nsec; 纳秒
...
};

time函数

1
2
3
4
#include <time.h>
time_t time(time_t *t);

//返回值:成功返回时间值;出错返回-1

调用time函数得到底层的时间值,它返回的是从格林尼治时间****开始至今的秒数

time函数还会把返回值写入t指针指向的位置

difftime函数

1
2
3
#include <time.h>

double difftime(time_t time1, time_t time0);

该函数用来计算两个time_t值之间的秒数并以double类型返回它

时钟接口函数(clock_gettime、clock_getres、clock_settime)

时钟通过clockid_t类型进行标识,下面给出了标准值

image-20240301171937859

clock_gettime函数
  • 该函数可用于获取指定时钟的时间,将获取的时钟时间存放在参数2中
  • 当时钟ID设置为CLOCK_REALTIME时,clock_gettime函数提供了与time函数类似的功能,不过在系统支持高精度时间值的情况下,clock_gettime可能比time函数得到更高精度的时间值
clock_getres函数
  • 该函数把参数把参数tsp指向的timespec结构初始化为与clock_id参数对应的时钟精度
  • 例如:如果精度为1毫秒,则timespec结构体的tv_sec字段就被设置为0,tv_nsec字段就被设置为1000000
clock_settime函数
  • 要对特定的时钟设置时间,可以调用clock_settime函数
  • 我们需要适当的特权来更改时钟值,但是有些时钟是不能修改的

几种类型usb控制器
OHCI(Open Host Controller Interface)

是支持USB1.1的标准,它不仅是针对USB,还支持一些其它接口,比如Apple的火线接口,与UHCI相比,OHCI的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对比较简单,主要用于非X86的USB。

UHCI(Universal Host Controller Interface)

是Intel主导的对USB1.0,1.1的接口标准,与OHCI不兼容,UHCI的软件驱动任务重,需要做的比较复杂,但可以使用较便宜的USB控制器,Inter和VIA使用UHCI,其余硬件提供商使用OHCI

EHCI(Enhanced Host Controller Interface)

是Intel主导的对USB2.0的接口标准,仅提供USB2.0的高速功能。

XHCI(eXtensible Host Controller Interface)

是最新最火的USB3.0的接口标准,它在速度、节能、虚拟化等方面都比前面3中有了较大的提高。xHCI 支持所有种类速度的USB设备(USB 3.0 SuperSpeed, USB 2.0 Low-, Full-, and High-speed, USB 1.1 Low- and Full-speed)。xHCI的目的是为了替换前面3中(UHCI/OHCI/EHCI)。

AHCI (Serial ATA Advanced Host Controller Interface),串行ATA高级主控接口,允许存储驱动程序启用高级串行ATA功能。AHCI通过包含一个PCI BAR(基址寄存器),来实现原生SATA功能。(ATA是存储设备的标准,AHCI是控制器的接口)

PCI 和 PCIE 比较

PCI将较于PCIE有两个大的区别。

  • PCI的数据是并行的,有32bit数据地址线,典型时钟133MHz,而PCIE的数据线是串行的,没有单独的时钟线(注意,100M参考时钟是给pcie控制器使用的),这样速率可以上GHz。
  • PCI是多点共联,通俗讲就是各个器件在物理上共同占用数据线,就会造成时钟频率上不去,延时增加等等,还需要考虑负载因素。而PCIE是point to point,一个口和一个口直接对接,所以负载小,频率高。如果很多设备想像PCI一样挂在一起给CPU用,加入switch即可。
PCIE && USB

PCIe,USB,以太网。都是串行总线。传输距离逐渐变远。PCIe 整个组网里网络报文的流动靠的是硬件驱动的。软件不参与报文的驱动流动。USB,需要软件来参与报文的驱动和流动。所以USB整个组网里还包括了软件部分。也就是USB软件协议栈。以太网 整个组网里也是,需要软件协议栈参与以太网组网里的报文流动。

PCIE是和USB都是高速总线,拓扑都是类似的树形结构,都是以CPU为ROOT,系统中外挂其他的外设作为树的终端节点,给CPU控制和使用,且二者在物理层,数据链路层,速率等各个方面都高度相似。但是USB的作用仅仅是数据的传输的数据线,PCIE想做的事情远远复杂于USB。

以arm体系架构为例, CPU之外的外设,想要干些什么?除了被CPU访问控制寄存器(被动IO访问),被CPU或DMA访问SRAM(被动MEM访问)之外,还希望能访问系统内存(主动MEM访问),上报中断(中断消息),流量控制和仲裁(多外设数据流的流量控制),cache一致性(cache等功能)。

可以看到,功能很多,方向也是多向的,不仅仅是CPU到设备,也可能是设备到DDR及其他设备。这一切PCIE都做进去了,比如你的设备可以通过message包上报中断,PCIE的RC会把中断以物理连线的方式给arm的GIC中断控制器。

反观USB呢?他的核心仅仅是数据传输,比如BULK transfer是U盘这种大数据传输;INTR transfer是给鼠标这种小数据传输;ISO transfer是给摄像头这种等时传输。数据的搬运通道而已,并不涉及计算体系架构。

PCH

Platform Controller Hub,是intel公司的集成南桥,具有ICH(负责连接PCI总线,是Intel南桥芯片系列名称)的全部功能,又具有原来MCH(内存控制中心,负责连接CPU,AGP总线和内存。相当于北桥芯片)。

从Intel5系列芯片组开始,已经看不到北桥芯片的踪影,几乎均和CPU集成。只剩下PCH的芯片用来支持外设。而PCH芯片部分虽然比与原来的南桥芯片功能上更为丰富,但性质大体相同,与CPU之间不需要交换太多数据,因此连接总线采用DMI技术。

image-20240229175828436

PCH内部框图
SMBUS

PCH提供系统管理总线SMBus主机控制器以及SMBus接口,主机控制器为处理器提供机制以启动与SMBus外围设备的通信。

DMI

直接媒体接口,是CPU和PCH之间芯片到芯片的连接。DMI2.0单通道单向传输速率到达5GT/s。

image-20240229175620009

图 典型的系统基于Intel®Core™i7处理器

简介

PCIe LTSSM ,全名为Link Training and Status State Machine,主要是用在PCIe中Physical Layer Link的初始化与设置,让device之间建立起沟通桥梁。整个LTSSM状态机总共有11个state,每个state又可以分为多个substates,所以整个状态机的跳转可以说是非常的错综且复杂且完善。

image-20240228141706297

训练顺序

Traning Sequences Order Sets主要有两种,分别为TS1和TS2,主要目的是为了建立Bitlock和S ymbol Lock和交换Physical Layer的参数。当Link运作在2.5 GT/s(Gen 1)或5 GT/s(Gen 2)时,TS1/TS2使用8b/10b编码,8 GT/s则使用128b/130b编码。

链路训练速率

主要为三个Data Rates,分别为2.5GT/s,5GT/s 和 8GT/s。每个link开始必须以2.5GT/s的速率开始initial。

在negotiation的过程中,LTSSM会决定PCIe Port的link number和lane number。

LTSSM简介
  • Detect:主要是为了检测对端是否有device存在,分为detect.quiet和detect.active状态。

    • Detect.Quiet: Quiet的状态下,Tx会处于Electrical Idle的状态,且起始会以2.5 GT/S的速度开始,也就是Gen1 Link Speed。

    • Detect.Active: 在这个state,会perform一个叫做Receiver Detection Sequence。Receiver Detection Sequence首先会让Transmitter处于一个稳定的电压状态,然后持续的对D+与D-增加电压直到符合V TX-RCV-DETECT,另一放面持续的去侦测Receiver的高阻抗,然后用充电的曲线(rate)来判断是否有device的存在。

  • Polling:通过传送TS Order Set,回应所接收到的TS Order Set,在这个阶段建立Bit block和Symbol Lock。分为polling.active,polling.compliance和polling.configuration状态。

    • Polling.Active: 在这个状态下,Transmitter会开始传送TS1 Order Set,并且将” Link Number “ & “ Lane number within Link “设置为0,而且所有传送的TS1中的Data Rate Identifier栏位必须将所有support的date rate设为1。
    • Polling.Compliance: 这个state主要透过示波器、封包产生器或位元错误率测试仪用来做interoperability testing,只有EE想要量测讯号才会需要进入此state,一般的link training是可以跳过这个状态的。
    • Polling.Configuration: 在上面有提到Polling.Active会传送Lane/Link number为PAD/PAD的TS1,Polling.Configuration则是传送Lane/Link number为PAD/PAD的TS2,所以Polling.Configuration的TS2有点像是TS1的Double Confirm 的概念。
  • configuration:主要任务是分配port上所有的lanes,且分组成个别独立的Links,主要是透过TS1,TS2中的Link Number & Lane number within Link来达成,区别于polling state,这里已经被填充为实际的值。

    image-20240228170627139

    • 配置.链接宽度.开始:

      • DownStream: 由于Downstream不知道现在port的连接如何,所以会以试探性的方式,在所传送出的TS1中的Link number栏位选择任意号码做为初始值,然后Lane number维持PAD。
      • UpStream: 传送TS1,且Link/Lane number栏位保持PAD,并且在收到一定数量和条件的TS1后,比DownStream较早进入Linkwidth.Accept。
    • 配置.链接宽度.接受:

      • DownStream: 当DownStream接收一定数量的TS1中,Link Number栏位符合Linkwidth.Start state所传出的号码,那就可以形成一个Link Group。
      • UpStream: 会根据在DownStream在Linkwidth.Start阶段所发出的Link Number中,选定一个号码作为此port的Link Number,因此会在传送TS1中将Link Number栏位填入这个号码,所以顾名思义,UpStream接受了(Accept)了这个Link Number。
    • 配置.Lanenum.等待:

      • DownStream: 由于在Linkwidth.Accept的阶段某些Lanes已经组成一个Link Group,因此DownStream会开始在这个阶段传送独立的Lane Number值到每个Lane上。
      • UpStream: 会根据接收到的Lane number,直接回传相同的号码或者不同( Lane Reversal ),这里spec有提到相同或不相同,都还是可以进入下一个state。
    • Configuration.Lanenum.Accept:

      • 当接收到TS1 Link/Lane number都与自己所传送的相符合,则会进入Configuration.Complete state。
    • 配置。完成:

      • 接续Lanenum.Accept state,Complete阶段会开始传送相同的Link/Lane number,只是与Lanenum.Accept的差异在于Complete传送的是TS2。
    • 配置.空闲:

      • 在这个state,双方会开始传送Idle Symbols,当接收到连续8个Idle Symbols后,则会进入L0。
0%