自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(157)
  • 资源 (3)
  • 收藏
  • 关注

原创 platform驱动的probe过程

probe()函数是什么时候被调用,设备和驱动是怎么联系起来的??1 总线注册阶段:内核启动初始化时,main.c文件中platform平台初始化的路径: kernel_init() -->do_basic_setup() -->driver_init() -->platform_bus_init(...

2022-03-22 16:00:06 2254

原创 DDR调试

Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Cloc

2022-03-22 15:56:46 1464

原创 NAND FLASH ECC校验原理与实现

由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠的进行坏区检测。 如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。 对数据的校...

2022-03-22 11:53:51 9343

原创 ARM 工作模式

为提高系统的稳定性,处理器会被分成多种工作模式,不同工作模式的权限不同。Cortex-M3 或 者 M4 内核的的芯片分为特权模式和非特权模式,特权模式下 CPU 完全控制芯片而非特权模式下不能操作某些特殊的寄存器。i.MX6U/ imx8 作为一款应用处理器,将 CPU 工作模式进一步细分,支 持九种工作模式下表所示。结合上表处理器的各种工作模式讲解如下:i.MX 6U 特权等级从低到高被分为 3 个等级(PL0~PL2)• User 用户模式,用户模式是相对于 Linux 系统来说的,有

2022-02-23 17:51:13 1640

原创 三极管开关作用

三极管当做开关来使用时,是利用了其要么工作在饱和区(导通),要么工作在截止区(不导通),总之就是不能工作在放大区。这个比较容易理解,如果工作在放大区,那么Vce的电压就很难确定了,这会导致当你想要高低电平的时候,结果得到一个中间态。所以,最重要的就是要保证管子的工作状态是ok的,也就是说我们要选好电路中的电阻阻值。如何选择电阻我们的电路输入一般是只有两种状态,0V或者是其它的高电平(1.8V,3.3V,5V等),截止状态一般不用怎么考虑,因为如果让三极管的Vbe=0,自然就截止了,重要的是.

2022-02-16 17:47:32 10075 1

原创 巧用GPIO口控制多个LED

3个IO口控制6个LED灯这个电路用到了单片机GPIO的三种状态: 高电平 低电平 高阻态 所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。各个LED灯单独亮起,分为六种情况。1、当只有LED1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)2、当只有LED2亮起时,单片机各GPIO的状态如下:3、当只有LED3亮起时,单片机各GPIO的状态如下:4、当只有.

2022-02-10 11:51:47 14475 14

原创 晶振应用中常见问题及解决方法

在电子行业有这样一个形象的比喻:如果把MCU比作电路的“大脑”,那么晶振毫无疑问就是“心脏”了。同样,电路对“晶体晶振”(以下均简称:“晶振”)的要求也如一个人对心脏的要求一样,最需要的就是稳定可靠。晶振在电路中的作用就是为系统提供基本的频率信号,如果晶振不工作,MCU就会停止导致整个电路都不能工作。晶振不起振问题归纳1、 物料参数选型错误导致晶振不起振例如:某MCU需要匹配6PF的32.768KHz,结果选用12.5PF的,导致不起振。解决办法:更换符合要求的规格型号。必要时请与MCU原厂

2022-02-09 14:36:59 1805

原创 电容器3种用途

电容器大致用于以下三种用途。储能用途利用了电池功能。电源瞬断或IC驱动速度急速上升引起负载电流变大时,电源的线电压下降,可能会导致IC故障。为防止发生故障,向IC侧提供电容器在电源线正常时储蓄的电荷,暂时维持电源线电压。去耦用途利用了交流电流通特性。为提供稳定的直流电压,去除重叠于电源线的外部感应性噪声及高速电路驱动引发的高频噪声。用于一般的电源电路。耦合用途去除前段电路的直流偏置电压,只向后段电路传递交流信号电压。一般用于音频电路。...

2022-02-09 14:05:59 3753

原创 常用电路标记表示什么意思

一、名词解析(1)VCC:C=circuit 表示电路的意思, 即接入电路的电压(2)VDD:D=device 表示器件的意思, 即器件内部的工作电压;(3)VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压(4)VEE:负电压供电;场效应管的源极(S)(5)VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。(6)VPP:编程/擦除电压。

2022-02-09 11:47:00 2246

原创 电路参考设计

简单的过压保护电路一般加个TVS可以实现,当外部有瞬间高能量冲击时候它能够把这股能量抑制下来,虽然功率高,上千W都可以,但是维持抑制的时间很短很短,万一器件损坏或者长时间工作电压高于正常工作电压的时候,就力不从心了。所以最好的办法是设计一个智能电路了,如下所示:Vin正常输入电压时,稳压管没有反向击穿,R3,R4电流基本为0。PNP三极管的Vbe=0,即PNP三极管不导通。PMOS管Q4的Vgs由电阻R5,R6分压决定,PMOS管导通,即电源正常工作。当Vin输入大于正常输入电压,此时Vi.

2022-02-09 11:09:30 863

原创 i2c协议详解

i2c的数据字节定义为8-bits长度,对每次传送的总字节数量没有限制,但对每一次传输必须伴有一个应答(ACK)信号, 其时钟由主设备提供,而真正的应答信号由从设备发出,在时钟为高时,通过拉低并保持SDA的值来实现。然后主设备开始传送寄存器地址(RA),接到应答后,开始传送寄存器数据, 然后仍然要有应答信号,连续写入多字节时依次类推。传输时,SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。写数据方向时,SDA由主机控制,从机接收信号。

2022-01-12 17:13:20 35746

原创 BT656与BT1120的区别

BT1120与BT656的区别BT656主要是针对PAL/NTSC等标清视频。时钟频率是27MHz。注意采样频率灰度为12.5MHz,色度为6.25MHz。随着高清视频的发展的须要,又推出了BT1120标准,它与BT656是相似的,只不过期钟频率更高了,以适合高清视频的传输。601是SDTV的数据结构 656是SDTV的interface709是HDTV的数据结构 1120是HDTV的interface从数据结构上 都是Y Cb Crinterface上 其实是一样的 vclk + vid[9

2022-01-11 11:30:33 9325

原创 linux内核的初始化过程

标准 linux 内核初始化过程如下: 内核引导第一阶段:汇编语言 内核启动的第二阶段:C 语言 linux/arch/arm/kernel/head.S 文件定义了 bootloader 和 kernel 的参数传递要求: MMU = off, D-cache = off, I-cache = dont care, r0 = 0, r1 = machine nr, r2 = atags or dtb pointer. 目前的 kernel 支持旧

2021-12-28 09:24:51 384

原创 linux系统日志设置

为何我更喜欢 SystemV我更喜欢 SystemV,因为它更开放。使用 Bash 脚本来完成启动。内核启动init程序(这是一个编译后的二进制)后,init启动rc.sysinit脚本,该脚本执行许多系统初始化任务。rc.sysinit执行完后,init启动脚本,该脚本依次启动中由 SystemV 启动脚本定义的各种服务。其中X是待启动的运行级别号。除了init程序本身之外,所有这些程序都是开放且易于理解的脚本。...

2021-11-19 11:07:16 5658

原创 imx8独立编译

1.编译 uboot获取 uboot 源码 git clone https://source.codeaurora.org/external/imx/uboot-imx cd uboot-imx 2.选择编译版本git tag |grep rel_imx_4.14.git checkout rel_imx_4.14.98_2.0.0_gagit status3. 设置编译环境source /opt/fsl-imx-xwayland/5.4-zeus/.

2021-11-05 17:00:10 2259

原创 创建 yocto 编译环境

Ubuntu 18.04 编译主机需要事先执行以下命令安装编译所需包: sudo apt-get update sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev sudo apt-get install libsdl1.2-dev xterm sed cvs subversion coreutils te

2021-10-29 14:04:43 1061

原创 semaphore和mutex的区别

semaphore函数在内核文件include\linux\semaphore.h中声明,如下表:mutex函数在内核文件include\linux\mutex.h中声明,如下表:semaphore和mutex的区别semaphore中可以指定count为任意值,比如有10个厕所,所以10个人都可以使用厕所。而mutex的值只能设置为1或0,只有一个厕所。是不是把semaphore的值设置为1后,它就跟mutex一样了呢?不是的。看一下mutex的结构体定义,如下:它里面.

2021-09-27 22:52:10 863

原创 位置无关代码

ARM处理器支持位置无关的程序设计,这种程序加载到存储器的任意地址空间都可以正常运行,其设计方法在嵌入式应用系统开发中具有重要的作用。尤其在裸机状态下开发Bootloader程序及进行内核初始化设计;利用位置无关的程序设计方法还可以在具体应用中用于构建高效率动态链接库。应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行

2021-08-19 15:05:00 1489

原创 设备树详解二

通过外部芯片片选激活模块。例如,挂载在外部总线上,需要通过片选线工作的一些模块: external-bus{ #address-cells = <2> #size-cells = <1>; ethernet@0,0 { compatible = "smc,smc91c111"; reg = <0 0 0x1000>; .

2021-08-18 14:13:10 1008

原创 异步通知 mq_notify函数

System V消息队列的问题之一是无法通知一个进程何时在某个队列中放置了一个消息。采用轮询(poling),是对CPU时间的一种浪费。Posix消息队列容许 异步事件通知,以告知何时有一个消息放置到某个空消息队列中。该通知有两种方式:当一个消息被放置某个空队列时,要么产生一个信号来通知,要么通过创建一个线程来执行一个特定程序,来完成消息到来时的该做的事情。这种通知通过调用mq_notify建立#include <mqueue.h>int mq_notify(mqd_t mq

2021-07-06 16:49:00 1365

原创 posix_msgqueue 报Error Opening MQ: : Invalid argument

经四处查找,终于发现原因:(1)attr.mq_maxmsg 不能超过文件 /proc/sys/fs/mqueue/msg_max 中的数值,我的机器上面是10。(2)attr.mq_msgsize不能超过 /proc/sys/fs/mqueue/msgsize_max 的数值。(3)消息队列名称前面必须加上斜杆。详细请参考:命令“man mq_overview”在man pages的第7章有关于消息队列的综述。有一段叫/proc interfaces的标签,说明了一些限制问题。

2021-07-06 14:56:18 413

原创 ti ds90ub954 的调试总结

ti的953与954是很好用的进行图像传输的芯片,它们可以通过外部的mode管脚进行模式配置,然后只需要简单的几个寄存器的配置就可以进行图像传输。还可以通过954的iic去配置953的寄存器,甚至通过954的iic去控制953的iic来配置与953相连的sensor的初始化。...............

2021-06-11 17:20:58 2696 2

转载 Linux终端显示当前路径

linux 左边设置后台不显示当前路径,每次查看当前路径的全路径都得通过pwd命令。解决办法:1. 进入到etc目录,修改profile文件2. 编辑文件,在文件最后一行加上:export PS1='[\u@\h $PWD]\$'3.保存之后执行命令:source /etc/profile执行后查看当前路径变化,路径前边加了 “/”然后切换目录,都会显示全路径。问题解决~...

2021-06-04 16:10:59 14423 2

原创 Linux内存初始化

有了armv8架构访问内存的理解,我们来看下linux在内存这块的初始化就更容易理解了。创建启动页表:在汇编代码阶段的head.S文件中,负责创建映射关系的函数是create_page_tables。create_page_tables函数负责identity mapping和kernel image mapping。 identity map:是指把idmap_text区域的物理地址映射到相等的虚拟地址上,这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU相关

2021-05-26 14:18:53 526

原创 内存管理之CPU访问内存的过程

CPU访问内存的过程可以用图的方式来说明,简单直接:蓝色部分是cpu,灰色部分是内存,白色部分就是cpu访问内存的过程,也是地址转换的过程。在解释地址转换的本质前我们先理解下几个概念: TLB:MMU工作的过程就是查询页表的过程。如果把页表放在内存中查询的时候开销太大,因此为了提高查找效率,专门用一小片访问更快的区域存放地址转换条目。(当页表内容有变化的时候,需要清除TLB,以防止地址映射出错。) Caches:cpu和内存之间的缓存机制,用于提高访问速率,armv8架构的话上图的c

2021-05-26 14:10:43 4514

原创 利用proc和sys的接口进行linux系统调试

在调试的过程中我们通常需要去不停的修改寄存器的值来调试效果,其实linux有两个手段,分别利用的proc和sys可以帮忙我们来进行调试proc的方法不依赖与kobject,sys中show和store则依赖于kobject。 /proc是内存中有关系统进程的实时信息;/sys是有关系统内核以及驱动的实时信息;/proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)/proc下数字命令的目录就是对于PID的进程目录/proc/cmdl...

2021-05-25 11:09:44 601

原创 设备数示例图解

/ { node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; // hex is implied in byte arrays. no '0x' prefix is required a-byte-data-property = [01 23 34 56]; child-node1...

2021-05-21 15:05:51 319

原创 The root filesystem on /dev/sdax requires a manual fsck

1. 问题描述dev/sda1: Inodes that were part of a corrupted orphan linked list found./dev/sda1: UNEXPECTED INCONSISTENCY:; RUN fsck MANUALLY (i.e., without -a or -p options)fsck exited with status code 4The root filesystem on /dev/sda1 requires a ma...

2021-05-21 14:09:55 820

原创 设备树语法详解

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的"arch/

2021-05-20 16:49:49 1164

原创 linux 设备树详解

没有Device Tree的ARM linux是如何运转的?1、自己撰写一个bootloader并传递适当的参数给kernel。除了传统的command line以及tag list之类的,最重要的是申请一个machine type,当拿到属于自己项目的machine type ID的时候。2、在内核的arch/arm目录下建立mach-xxx目录,这个目录下,放入该SOC的相关代码,例如中断controller的代码,时间相关的代码,内存映射,睡眠相关的代码等等。此外,最重要的是建立一个board

2021-05-13 11:47:21 1996

原创 tda2x调试参考

#BSP overlay required for DRA752* bin/dra7-evm-infoadas.dtb => built after applying the patches* bin/zImage => built after applying the patches* bin/MLO => built with "dra7xx_evm_vi...

2021-05-11 14:26:06 409

原创 make编译语法

subsystem:cd subdir && $(MAKE)其等价于:subsystem:$(MAKE) -C subdir这句是Makefile的规则:这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。...

2021-05-07 18:10:43 439

原创 Ubuntu下搭建TDA2x开发环境

最近进行tda2x开发板的调试,官方参考文档VisionSDK_Linux_UserGuide.pdf。Ubuntu环境下搭建TDA2x开发环境如下:1. 首先使用命令sudo apt install安装所需的支持包:sshcorkscrewgawkunamesedu-boot-toolsdos2unixdtrxgitlib32z1lib32ncurses5lib32bz2-1.0libc6:i386libc6-i386libstdc++6:i386libncurses5

2021-05-06 15:28:47 553

原创 进程间IPC通信方式比较

常见的通信方式:1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,需要双方通信时,需要建立起两个管道; 而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2. 命名管道FIFO:有名管道也是半双工的通信方式,支持可靠的、单向或双向的数据通信。但是它允许无亲缘关系进程间的通信。 遵循先进先出(first in first out),对管道PIPE及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。3. 信号 ( sinal ...

2021-01-11 17:37:12 444

原创 进程调度

linux调度器https://www.cnblogs.com/20135235my/p/5398066.html 好文章首先我们在思考调度器的时候,我们要理解任何操作系统的调度器设计只追求2个目标:吞吐率大和延迟低(相应快)。因为吞吐率要大,势必要把更多的时间放在做真实的有用功,而不是把时间浪费在频繁的进程上下文切换;而延迟要低,势必要求优先级高的进程可以随时抢占进来,打断别人,强行插队。但是,抢占会引起上下文切换,上下文切换的时间本身对吞吐率来讲,是一个消耗,这个消耗可以低到2us或者更

2021-01-11 17:25:32 228

原创 内存分配管理

kmalloc 和 vmalloc 区别在于:kmalloc 分配的内存物理地址是连续的, 虚拟地址也是连续的vmalloc 分配的内存物理地址是不连续的,虚拟地址是连续的因此在使用中,用的较多的还是 kmalloc,因为kmalloc 的性能较好。因为kmalloc的物理地址和虚拟地址之间的映射比较简单,只需要将物理地址的第一页和虚拟地址的第一页关联起来即可。而vmalloc由于物理地址是不连续的,所以要将物理地址的每一页都和虚拟地址关联起来才行。kmalloc和vmalloc是分配.

2021-01-11 16:57:20 465

原创 ARM的七种工作模式详解

一、存储器格式(字对齐):Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。存储器格式 1、大端格式:高字节在低地址,低字节在高地址; 2、小端格式:高字节在高地址,低字节在低地址;指令长度:Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器...

2020-11-24 17:31:52 1630

原创 SPI中的极性CPOL和相位CPHA之英文详解

SPI Transfer ModesSPI interface allows to transmit and receive data simultaneously on two lines (MOSI and MISO).Clock polarity (CPOL) and clock phase (CPHA) are the main parametersthat define a clock format to be used by the SPI bus.Dependi..

2020-11-24 14:56:25 2245

原创 Linux内核调试方法

#1 内核调试以及工具总结内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试.内核的调试, 其本质是内核空间与用户空间的数据交换, 内核开发者们提供了多样的形式来完成这一功能.工具 描述 debugfs等文件系统 提供了 procfs, sysfs, debugfs以及 relayfs 来与用户空间进行数据交互, 尤其是 debugfs, 这是内核开发者们实现的专门用来调试的文件系统接口. 其他

2020-11-20 16:47:47 270

原创 Linux之strsep函数

strsep函数用于分割字符串,函数原型如下:char *strsep(char **s, const char *ct);s为指向欲分割的字符串,ct为分隔符,函数将返回分隔符前面的字符串,s将指向分隔符之后的字符串,实例如下:#include <stdio.h>#include <string.h>int main(void){ c...

2020-11-18 10:05:40 667

freeRTOS实时内核实用指南

《FREERTOS 实时内核实用指南》是学习freeRTOS非常好的入门文档,要多读几遍才好,并且里面的例子可以快速帮忙我们进行理解。

2020-11-06

奔跑吧Linux内核

本书内容基于Linux 4.x内核,主要选取了Linux内核中比较基本和常用的内存管理、进程管理、并发与同步,以及中断管理这4个内核模块进行讲述。全书共分为6章,依次介绍了ARM体系结构、Linux内存管理、进程调度管理、并发与同步、中断管理、内核调试技巧等内容。本书的每节内容都是一个Linux内核的话题或者技术点,读者可以根据每小节前的问题进行思考,进而围绕问题进行内核源代码的分析。 本书内容丰富,讲解清晰透彻,不仅适合有一定Linux相关基础的人员,包括从事与Linux相关的开发人员、操作系统的研究人员、嵌入式开发人员及Android底层开发人员等学习和使用,而且适合作为对Linux感兴趣的程序员的学习用书,也可以作为大专院校相关专业师生的学习用书和培训学校的教材。

2018-09-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除