
work
HeroKern
欢迎关注嵌入式开发公众号,定期更新技术文章。
-
转载 likely(x)与unlikely(x)函数,即__builtin_expect的使用
likely(x)与unlikely(x)函数,即__builtin_expect的使用 转载自:http://velep.com/archives/795.html 本文讲的likely()和unlikely()两个宏,在linux内核代码和一些应用中可常见到它们的身影。实质上,这两个宏是关于GCC编译器内置宏__builtin_expect的使用。顾名思义,likely()指“很有可能”之意,...2020-09-01 11:12:17149
0
-
转载 Linux中断 - IRQ Domain介绍
Linux中断 - IRQ Domain介绍 一、概述在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断:1、IRQ number。CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。2、HW interrupt ID。对于interrupt controller而言,它收集了多个外设的interrupt...2020-09-01 11:07:34214
0
-
转载 __attribute__特性
一、介绍GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。__attribute...2020-08-19 16:52:00195
0
-
转载 以太网PHY寄存器分析
以太网PHY寄存器分析 11、以太网PHY标准寄存器分析 21.1 Control Register 21.2 Status register 51.3 PHY Identifier Register &...2020-07-17 10:04:39980
0
-
转载 SerDes知识详解
一、SERDES的作用1.1并行总线接口 在SerDes流行之前,芯片之间的互联通过系统同步或者源同步的并行接口传输数据,图1.1演示了系统和源同步并行接口。 随着接口频率的提高,在系统同步接口方式中,有几个因素限制了有效数据窗口宽度的继续增加。a)、时钟到达两个芯片的传播延时不相等(clock skew)b)、并行数据各个bit的传播延时不相等(data skew)c)...2020-07-16 17:58:40507
0
-
转载 PRBS介绍
转自:http://blog.sina.com.cn/s/blog_9fa828d10102y3dp.html之前一直在讲高速串行的协议,MAC,PHY,PMD层,PMA层吗,PCS层。。。看大家回答的数量也不是很多,弱弱的问一句大家都消化了吗?的确,讲到各个层的功能,数据在芯片内部如何去运作协调这方面的确有点高深。其实坦白说哈,作为...2020-07-16 17:56:07316
0
-
转载 PCIe Switch高级功能及应用
PCI-E Switch芯片,估计不少人已经听说过这个东西了。但是估计多数人对其基本功能知之甚少。PCI-E Switch作为最先进的生产力,已经被广泛应用在了传统存储系统,以及少量品牌/型号的服务器平台。 笔者作为拥有全球最领先PCI-E Switch产品的PMC-Sierra公司的系统架构师,想在这里为大家普及一下PCI-E Swi...2020-07-16 17:53:39591
0
-
转载 MAC/PHY与MII(GMII/SGMII/RGMII)
MAC(Media Access Control)即媒体访问控制子层协议。该部分有两个概念:MAC可以是一个硬件控制器 及 MAC通信以协议。该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。MAC硬件大约就是下面的样子:在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息并是否发生传输错误,如果没有错误,...2020-06-28 19:22:23429
1
-
转载 SMI(MDC/MDIO)总线接口介绍
1. MDIO接口SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。MDIO原本是为MII总线接口定义的,MII用于连接MAC和PHY,包含两种信号接口:1. ...2020-06-28 19:17:53463
0
-
转载 交换机的工作原理
原文链接:链接一、交换机的工作原理 当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据...2020-06-01 16:43:06195
0
-
转载 路由器和交换机的区别?
(1)外形上交换机通常端口比较多,路由器端口少体积小,(路由器一般都集成了交换机的功能,LAN口就是作为交换机的端口来使,WAN用于连接外网的端口。(2)工作层次不同交换机在数据链路层(实现数据帧的转发),而路由器在网络层(肩负着网络互连的作用)。(3)数据的转发对象不同交换机是根据MAC地址转发数据帧,而路由器是根据IP地址来转发数据报。IP地址决定最终数据要到达某一台主机,而MAC地址是决定下一跳将要交给哪一台设备(一般是交换机或者路由器),IP地址是软件实现的,可以描述2020-06-01 16:16:14235
0
-
原创 i2c总线驱动详解
I2c总线应用也是很广泛的,i2c总线经常挂载eeprom、温度传感器、湿度传感器等设备。I2c总线下可以挂载多个设备,识别设备采用一个地址,这个地址在一条i2c总线是独一无二的。I2c总线驱动与spi总线驱动框架是一致的,都是采用控制器、core、设备三层驱动。下面开始讲解i2c总线驱动流程。强烈建议读者看完本篇文章。首先看一下设备树文件,本次示例程序是一个i2c控制器下挂在eeprom设备...2019-04-14 20:08:23987
0
-
原创 spi总线之flash设备驱动
这篇文章分析挂在spi总线下的flash设备驱动程序,设备树信息如下所示。Spi设备驱动程序如下:看到没有,spi_driver驱动结构与platform_driver结构基本一致。我们来看看spi总线的匹配方式如何。Spi核心层定义与注册如下所示。注册方式与platform总线完全一致,看到初始化驱动的入口函数了吗,这也是在前文提到过的,是module_init的一种...2019-04-14 19:37:58382
0
-
原创 spi总线驱动详解
Spi总线在实际应用得比较多,所以这篇为文章讲解以实际应用为主,bus总线类型细节不做讲解,感兴趣的读者可以分析源码,研究内核源码我觉得是一件非常有趣的事情,同时也是一门艺术。Spi总线上可以挂flash、wifi网卡等常见设备。本文讲解以挂在flash作为实例。 Spi总线硬件电路如下图所示。一般有四根线– MOSI, MISO, SCK, SS;spi下可以挂在多个设备,S...2019-04-13 11:47:061727
0
-
原创 platform总线驱动程序
从这篇文章开始讲解驱动程序,Linux内核中有很多总线驱动,但都是由bus_type总线内管理,在/sys/bus目录下能够看到该内核定义了那些系统总线,常见的有platform、iic、spi、input等。内核中的总线与实际物理总线不一样,这里的总线是虚拟的,仅仅是一系列链表管理的对象,我们称这个管理链表为驱动总线。本文分析platform总线,这个总线在驱动结构中比较常用。平台定义与注册...2019-04-11 17:48:43295
0
-
原创 华容道算法之性能优化
上篇文章讲解了华容道算法基本算法知识,也是最简单的,效率也是最低的。这篇文章讲解高效率算法。从下篇文章开始主要分析linux 驱动代码以及嵌入式相关设计知识。本次编码采用棋子在棋盘中的位置编码,顺序是从左往右/从上到下。以横刀立马举例说明。正方形的应该是1(记得从0开始计算),横方块值是0x80 、竖方块是0x909、单个方格值是0x96000、空格是0x60000编程思路与上一篇文章一致,...2019-04-11 17:43:451360
0
-
原创 华容道算法基础版
今天来聊聊华容道算法具体实现方法,华容道算法我会通过链表和红黑树两种方法实现查找算法,程序体现出来的效率差别很大。本篇文章拿华容道横刀立马做分析,华容道游戏下图所示。游戏原理是每个方块每次只可以移动一个方格,如何将正方形移除到方块外部。拿到这个需求我们首先需要构建数学模型,该游戏设计到的方块数量较少,走法也比较少,那么可以采取穷举思想计算出最佳走法。图 1当方块每移动一步时,...2019-03-21 10:43:094422
0
-
原创 Linux平台PCIe驱动编写
以前文章分析了PCIe整个系统知识,包括如何扫描PCIE树,这篇文章讲解一下当拿到一个PCIe设备时如何编写驱动程序。编写驱动程序在应用程序中编写,同样可以在内核层编写驱动。从应用层编写驱动主要是使用pcilib库和/dev/mem接口,下面开始分析代码。根据pcie设备的厂家ID和设备ID初始化设备,并且返回访问设备指针描述符,pci_dev指针指向我们需要访问的设备。 ...2019-03-21 10:27:585715
9
-
转载 警告“未引用的形参/局部变量”的消除方法
如果我们编译以下代码:#include <stdio.h>int main(int argc, char** argv){ int n; int nRet = printf("Hello, world!"); return 0; }编译器一般会发出以下警告(VS2015):1>f:\mycode\cpptest\main.cpp(5...2019-05-28 16:55:594148
0
-
原创 CPU性能发展所遇到的瓶颈
通常一个处理器通常包含多个核心(Core),集成 Cache 子系统,内存子系统通过内部或外部总线与其通信。在经典CPU中一般有两个常用的组件:北桥(North Bridge)和南桥(SouthBridge)。它们是处理器和内存以及其他外设沟通的渠道。图1给出了处理器、内存、南北桥以及其他总线之间的关系。 从图一可以看到:1)处理器访问内存需要通过北桥。2)处理器访问所有的外设...2018-08-13 14:15:176649
0
-
原创 container_of实现原理详解
container_of在内核函数中经常使用,该函数的功能是根据一个结构体成员的指针,返回这个成员指针所在的结构体的首指针。举例说明如下:struct std{int a;short b;char c;int d;};Stuctstd test;Int *p = &test.d;container_of(p, Stuctst...2019-04-14 20:14:06945
0
-
原创 linux内核max函数实现
Linux内核函数中的max函数编写得非常优秀,让我忍不住要拿出来分析一番。传统定义max函数是#define max(X,Y) ((X) > (Y) ? (X) : (Y))。是不是觉得这样定义已经perfect了,那先看下面这个例子。int x = 1, y = 2;printf("max=%d/n", max(x++, y++));printf("x = %d, y = %...2019-04-14 20:19:281252
0
-
原创 am437x ubi文件系统制作问题解决方案
由于工作原因,需要用到这款芯片,但是官方提供的dameo是从文件系统中烧写U-boot,设备树,内核,文件系统等操作。这种方式很不方便生产,于是打算走最常规的思路,从u- boot中去烧写,于是需要制作Ubi文件系统镜像。制作流程如下:首先看一下mtd分区情况0: NAND.SPL 0x00040000 0x00000000 01: NAND...2019-07-17 17:53:37220
0
-
原创 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block
在制作根文件系统,在U-boot阶段通过nfs挂载文件系统后出现了该问题,这个问题网上已经有很多解答,但是没有一个是我需要的。我出错的现象如下:在此期间我尝试了很多种方法都没有得到解决,并且我在nfs服务器端查看Log发现有nfs mount迹象,这就很奇怪了,我通过抓包软件抓nfs的交互字段发现:Accept State: remote can't support version ...2019-07-18 17:28:37381
0
-
原创 qmake 添加额外参数 分开编译
qmake添加传参,生成不同的Makefile,可用于不同场景。使用方法如下:传一个参数:arm-qmake "TARGET = ax03" ax03.pro传两个参数:arm-qmake "TARGET=xinetd" "DEFINES +=GUARD" ax03.pro这样很方便时候嵌入式开发,arm-qmake是自定义嵌入式qmake的软链接,为了区分x86的qma...2019-07-11 11:30:46747
0
-
原创 dtc工具下载
下载链接:https://mirrors.edge.kernel.org/pub/software/utils/dtc/2019-05-28 17:16:011015
0
-
原创 g++编译线程失败
源代码test.cpp:编译结果如下:用g++编译会出现上述错误,如果将文件名改成test.c,同时使用gcc编译,那么就能够正常编译通过,最后查找原因是C++禁止将void指针随意赋值给其他指针,因为定义函数时,程序没有定义函数指针的类型,那么默认就是void *型,注意代码中函数名前的void *,这个是该函数返回一个void *的指针,属于指针函数,这里一定要区别。那么我们可...2019-05-28 17:05:36350
1
-
原创 spi ioctl无效参数解决
方法一:struct spi_ioc_transfer tr; /* 这种写法一定要赋初值 */ memset(&tr,0,sizeof(struct spi_ioc_transfer)); tr.tx_buf = (unsigned long)tx; tr.rx_buf = (unsigned long)rx; tr.len = sizeo...2019-05-24 15:14:261889
1
-
原创 udp recvfrom返回-1 Invalid argument
UDP的sendto对应着recvfrom,一发一收.如果sendto的数据大于MTU,则会在IP层分片发送,到达目标后由IP层重组,再从recvfrom一次性返回.如果使用IP层分片重组则存在乱序,丢包,重包的问题.调用一次sendto,只要数据长度小于MTU都会以一个独立的UDP包发送.recvfrom的接收大小必须大于或等于sendto时的是数据大小.更正确的说法应该是UDP的包单位是以IP...2019-05-24 14:00:19843
0
-
原创 linux环境代码不能发送UDP广播包
执行该命令:route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1eth0是网络设备名称2019-05-24 13:57:531225
4
-
原创 人工智能之字符识别
1 概述上篇文章讲解了PCA主成分分析,这篇文章使用该训练模型实现验证码识别,同时作者也会提供全部源代码。希望能够帮助到大家。2 图像原理在计算机图形学里,位图就是一个像素的矩阵,矩阵中的每一个点都是各种颜色的点,最后总体上来看就是一副图像。如何显示每一个像素的具体颜色,有很多种颜色空间,最常见的就是RGB,每一个像素含有三个分量——R,G,B,分别代表红、绿和蓝三种颜色,三个分量的值的具体...2019-01-15 17:51:3211002
0
-
原创 centos7开机不进入图形界面
CentOS7开机不进入图形界面设置和cent6系列不同的是,不再是直接改文件中的5就可以了。systemctl get-default //获取当前的默认targetsystemctl set-default multi-user.target设置当前的target,可选值有graphical.target,multi-user.target,multi_user.target...2018-11-11 14:13:226568
2
-
原创 CentOS7配置本地Yum源
这里需要注意,当电脑不能连接外界网络时候,需要用U盘拷贝镜像包,但是一个镜像包有8G左右,fat32格式只支持4GB,儿centos默认是不支持NTFS格式文件系统,这里可以将镜像包用软碟通提取里面iso文件,这里不能直接解压,软碟通的提取类似linux下的mount操作,提取完成后将该文件拷贝到centos某个目录,然后指定路径。 从CentOS7官网下载DVD中存在需要的大部分软件,所...2018-11-11 13:53:4813241
0
-
原创 U盘安装CentOS 7流程
准备工具1.准备8GU盘(启动盘制作完成后,U盘占用约4.02G,所以需要8G)2.最新版UltraISO(软碟通),一定要使用最新版的,因为老版本的软碟通制作出来的U盘启动盘有问题,例如9.3.6.2750这个版本。问题体现在哪呢?我简单说两点。第一点就是你用9.3.6.2750这个版本的软碟通打开镜像文件后会发现你无法看到镜像中应有的全部文件,你可以用压缩工具打开比较一下。第二点就是,...2018-11-11 13:30:011932
1
-
原创 从cpu角度理解PCIe续集
概述上篇文章剩下两个问题,上电扫描PCIe树和存储地址到PCIe地址的映射,本篇文章将对这两个问题做出解答。本文可能会针对某一款芯片做出详细流程解答,读者可以只关注整个流程,具体映射机制和寄存器参考芯片datasheet。上篇文章已经了解到如何访问配置空间,前256Bytes可以通过寄存器方式访问,后面的256B~4k必须通过映射才能访问,映射无非就是把配置空间映射到存储地址空间,或者把PCIe...2018-11-07 13:06:412576
3
-
原创 从cpu角度理解PCIe
概述为什么需要写这篇文章,当我阅读《深入浅出SSD》这篇书籍中PCIe章节时发现,本书籍的侧重点是放在PCIe控制器和PCIe协议上,从CPU角度理解PCIe知识偏少,本文对下面几个知识点做出一些补充。CPU访问外设寄存器与内存编址方式; CPU如何访问PCIe配置空间; CPU能够通过寄存器访问配置空间,为什么还需要映射PCIe配置空间; 如何扫描PCIe树并且为PCIe分配ID;...2018-10-24 10:34:536659
0
-
原创 浅谈CPU寻址内存机制
本文讲解的内容是Processor如何访问内存,TLB Cache和MMU的在Processor中扮演的角色。涉及的硬件平台是Xilinx Zynq-7000,dual-core ARM® Cortex-A9 MPCore,架构是armv7,下面分别对TLB、MMU、Processor如何访问cache和主存深入分析。在早期计算机系统中,程序员都是直接访问物理地址进行编程,当程序出现错误时,整...2018-10-07 10:49:573441
0
-
原创 Cache地址映射
理解Cache地址映射之前补充一些基础知识,Cache的地址映射和MMU(内存管理单元)和TLB Cache(转译查找缓存)中的映射是有区别的。Cache、TLB Cache、MMU在CPU中结构如图1所示,图1展现的是Cortex A9 Processor内部结构,采用的指令和数据总线分开的哈佛结构。CPU访问内部存储和外部存储,以及各种外设空间在硬件层面上看都是物理地址(硬件总线),然后为...2018-09-01 15:17:359752
0
-
原创 几行C代码剖析Cache参数
Cache的容量一般都很小,即使是最大的三级 Cache(L3)也只有20MB ~30MB。cache加快了CPU对内存的读写速率,CPU第一次执行需要将数据时候需要从主存-->L3 Cache--->L2 Cache -->L1 Cache传递到CPU的计算单元。cache分成多个组,每个组分成多个行,linesize是cache的基本单位,从主存向cache迁移数据都是按照l...2018-08-20 16:31:341350
0
-
原创 深入浅出cache写策略
随着计算机行业的飞速发展,CPU的速度和内存的大小都发生了翻天覆地的变化,在处理器速度不断增加的形势下,处理器处理数据的能力也得到大大提升。数据是存储在内存中的,内存吞吐率虽然得到很大的提升,但是相对于处理器来讲,仍然非常慢。处理器要从内存中直接读取数据都要花大概几百个时钟周期,在这几百个时钟周期内,处理器除了等待什么也不能做。在这种环境下,才提出了Cache的概念。计算机中常见的存储介质如图1所...2018-08-20 16:25:477630
0