自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (2)
  • 收藏
  • 关注

原创 【c】-include经典注入问题

如果非得有包含依赖,要确保宏定义、typedef 在include之前写(不推荐)问题建议做法头文件互相包含避免循环引用,重构依赖结构定义宏或类型后立刻用确保在使用前已完成定义使用注入全局头保证这个头文件结构清晰、无副作用。

2025-04-11 19:05:48 301

原创 [uboot]支持env保存到Nor Flash

1 概述uboot在命令行界面可以查看、更改flash中相关的环境变量,这些环境变量可以用于uboot本身进行相关设置,也可以被kernel识别,用于完成特定的配置。 本小节主要讲述如何通过配置将环境变量保存到Nor Flash中。1.1 环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改。  启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境变量初始化硬件、启动操作系统等等。...

2021-09-10 17:58:34 1876

原创 [uboot]支持mtd分区

参考:https://blog.csdn.net/weixin_42314225/article/details/83241230问题:(1)uboot支持nor flash sf命令后,如何与网络配置进行版本更新?(2)uboot如何支持MTD设备,Nor flash MTD分区如何进行分区划分?(3)uboot中的分区如何与kernel中的分区进行统一?(4)uboot变量mtdparts=60000000.nor:2m@0x100000(nor_bank0_uboot),4

2021-09-09 16:04:39 2723

原创 [uboot]使能spi flash,支持sf命令

1 目标可以使用sf*命令烧写QSPI2 具体配置2.1 SF命名开启相关的宏(1)CONFIG_CMD_SF=y #sf命令开启宏u-boot\cmd\sf.ccmd/Makefile:140:obj-$(CONFIG_CMD_SF) += sf.oDepends on: DM_SPI_FLASH [=n] || SPI_FLASH [=n](2)CONFIG_CMD_SF_TEST #sf测试实例宏(3)CONFIG_CMD_SPI is not setCommand to

2021-08-23 13:50:13 4241 3

原创 Linux Kernel编程 --- 字符设备驱动

1 字符设备驱动结构 字符设备是3大类设备(字符设备、块设备、网络设备)中的一类,其驱动程序主要完成的工作是初始化、添加、删除cdev结构体,申请和释放设备号,填充file_oprations结构体中的操作函数,实现file_oprations中的read() write() ioctl()等函数是驱动设计的主要工作。 先看看字符设备驱动的架构:1.1 cdevcdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下:#include ...

2020-08-18 10:26:54 572

原创 Linux Kernel编程 --- class_create/device_create/udev特性

1 class 内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。(1)通过class_cr...

2020-08-11 11:42:24 3866

原创 Linux Kernel编程 --- procfs编程

1 procfs概述 procfs也是虚拟文件系统(debugfs、sysfs和procfs)之一。这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口。在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作。 procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或ca...

2020-07-29 10:03:37 1098

原创 Linux Kernel编程 --- 内存与IO访问

本文档参考宋宝华老师的《linux设备驱动开发详解》内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要。1 CPU与内存、I/O嵌入式处理器,一般不提供专门的I/O空间,而仅存在内存空间;各种外设寄存器都直接映射到内存空间,可以通过指针直接访问x86一般提供专门的I/O空间, 用特殊指令访问这些空间; CPU访问虚拟地址(VA),MMU把虚拟地址转换为物理地址(PA),同时提供内存访问权限保护和Cache缓存控制等硬件支持。MMU的知识点还是比较多,也比较复

2020-07-27 22:28:25 1121

原创 Linux Kernel编程 --- 中断与时钟

本文档参考宋宝华老师的《linux设备驱动开发详解》1 中断与定时器  中断一般有如下类型:内部中断和外部中断:内部中断来自CPU,例如软件中断指令、溢出、除0错误等;外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断(矢量中断)和非向量中断,ARM一般是非向量中断,因为现在的中断源很多,如果做成向量,那中断向量表会很大。不过ARM的总异常还是按照向量的方式组织的。NVIC(CM4) -- 向量中断 CR5/CA55 -- 非向量中断向量表:发生异常后,CPU直接跳转到响应地址.

2020-07-25 19:35:07 550

原创 Linux Kernel编程 --- 设备驱动中的异步通知和异步IO

本文档参考宋宝华老师的《linux设备驱动开发详解》1 概念异步通知,也称信号驱动的异步IO,类似于软中断的概念。具体来讲,一旦资源就绪,则主动通知相应的应用来获取资源。信号是软件层次上对中断的一种模拟。信号是异步的,一个进程不必通过任何操作来等待信号的到达。阻塞IO意味着一直等待设备可访问后再访问。非阻塞IO使用poll查询设备是否可以访问。异步通知意味着设备通知用户设备自己可以被访问,之后用户再进行IO。...

2020-07-25 17:14:49 377

原创 Linux Kernel编程 --- 设备驱动中的阻塞与非阻塞IO

本文档参考宋宝华老师的《linux设备驱动开发详解》1 概述阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态;也就是进入等待队列,直到满足的条件被满足为止; 非阻塞:不能获取资源时,不睡眠,要么退出、要么一直查询;直到可以进行操作为止,直接退出且无资源时,返回-EAGAIN如图所示,阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源让给其它进程。阻塞的进程会进入休眠状态,所以必须确保有一个地方可以唤醒休眠的进程。一般在中断中唤醒。非阻塞进程则是通过不断的尝试,直到

2020-07-25 16:31:21 557

原创 Linux Kernel编程 --- 设备驱动中的并发控制

1 基本概念(1)并发(concurrency)指的是多个执行单元同时、并行被执行;(2)并发的执行单元对共享资源的访问容易导致竞态(race conditions);这里的共享资源可以为硬件资源、软件上的全局及静态变量等(3)解决竞态问题的途径是保证对共享资源的互斥访问;所谓互斥访问是指一个执行单元访问共享资源的时候,其他执行单元被禁止;(4)访问共享资源的代码区域称为临界区,临界区需...

2020-07-25 15:16:45 217

转载 Linux Kernel编程 --- genalloc原理

参考链接:https://www.douban.com/group/topic/47566535/http://blog.chinaunix.net/uid-20321537-id-1966893.htmlhttp://www.alivepea.me/kernel/kernel-genalloc/

2020-03-03 21:12:15 1945

原创 Linux Kernel编程 --- Mailbox驱动框架

1 概述(1)mailbox是一种框架,通过消息队列和中断驱动信号处理多处理器间的通讯;(2)mailbox的实现分为contoller和client。简单的说就是client 可以通过controller提供的channel发送信息给controller;(3)在drivers/mailbox下实现的都是controller的源码;具体到某个厂商的硬件,则描述如下:Kconfig文...

2020-02-02 21:29:48 22497

原创 ubuntu上 eclipse+arm-linux-gcc+jlink+s3c2440a开发环境搭建

0 环境搭建概述所需工具:(1)EclipseEclipse的本身只是一个框架平台,但是众多插件的支持,使得Eclipse拥有较好的灵活性。(2)CDTCDT是Eclipse用于扩展Eclipse支持C/C++开发的插件。(3)ARM cross GCC tooltain整合了GNU arm的交叉编译工具链,是一个跨平台的 ARM 架构开发平台,是一个 Eclipse 的插件。(...

2019-11-27 21:58:14 2402

原创 嵌入式RTOS---异常和中断处理流程

ARM中断体系以S3C2440讲解1 中断体系硬件原理中断处理分为统一的中断处理和独立的中断处理;1.1 统一的异常和中断处理1.1.1 ARM的异常模式所谓异常,指的是中止了程序正常的执行过程而不得不完成一些特殊的工作(异常工作)。中断也是一种异常,中断包括由外部硬件产生的外部中断和内部硬件产生的内部中断。异常分为同步异常(SWI 软件指令产生的异常)和异步异...

2019-11-26 22:50:39 3296 1

转载 ARM存储:存储管理单元MMU

在创建多任务嵌入式系统时,最好有一个简单的方式来编写、装载及运行各自独立的任务。目前大多数的嵌入式系统不再使用自己定制的控制系统,而使用操作系统来简化这个过程。较高级的操作系统采用基于硬件的存储管理单元MMU来实现上述操作。MMU提供的一个关键服务是使各个任务作为各自独立的程序在其自己的私有存储空间中运行。在带MMU的操作系统控制下,运行的任务无须知道其他与之无关的任务的存储需求情况,这就简化...

2019-10-11 22:31:43 2880

转载 ARM存储:存储保护单元MPU

一些嵌入式系 统使用多任务的操作和控制。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。要达到这 一目的通常有软件保护和硬件保护两种途径。这里软件保护是指仅靠软件来保护系统资源。系统中无保护硬件或硬件没启动。在多任务的系统中,通常要运行操作系 统来达到任务间同步与通信。所以,这种软件的资源保护通常由操作系统来完成。但这种通过软件来协调任...

2019-10-09 09:55:34 4982

转载 ARM存储:高速缓冲存储器Cache

转载自:https://www.eefocus.com/embedded/323218/p1当第一代RISC微处理器刚出现时,标准存储器元件的速度比当时微处理器的速度快。很快,半导体工艺技术的进展被用来提高微处理器的速度。标准DRAM部件虽然也快了一些,但其发展的主要精力则放在提高存储容量上。  1980年,典型DRAM部件的容量为4KB。1981年和1982年开发出了16KB芯片。这些部...

2019-10-08 11:08:00 2415

原创 uboot启动 -- uboot基本启动流程

本文以Board JZ2440(SMDK2410)的启动过程进行说明,u-boot选用u-boot-20151 概述1.1 概述CPU初始刚上电的状态。需要小心的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。其次,就是要根据硬件资源进行板级的初始化,代码重定向等等。最后,就是进入命令行状态,等待处理命令。在armv7架构的uboot,主要需要做如下事情(1)arch级的...

2019-07-14 11:03:23 4031

原创 uboot启动 --- SPL

在启动阶段,芯片内部的ROMCODE首先将eMMC/NAND FLASH中的spl加载到IRAM,然后直接跳转到spl运行下面对SPL的整体执行流程进行说明1 说明1.1 uboot-spl入口说明通过uboot-spl编译脚本u-boot/arch/arm/cpu/u-boot-spl.ldsOUTPUT_FORMAT("elf32-littlearm", "elf32-l...

2019-07-07 10:05:04 2100

原创 设备树和Platform架构--5--platform_device创建

platform_device的建立包含两种方式:(1)在内核初始化时通过device_node转换为platform_device,这种是最新的实现方式,基于设备树,在内核初始化时将设备树中的节点转化为platform_device;(2)使用platform_device_register注册platform_device;1 关键数据结构体struct platfor...

2019-06-30 11:26:55 8096

原创 设备树和Platform架构--6-platform_driver及match

1 概述(1)Linux设备模型使用了三个数据结构分别来描述总线、设备和驱动。所有的设备和对应的驱动都必须挂载在某一个总线上,通过总线,可以绑定设备和驱动。这个属于分离的思想,将设备和驱动分开管理。(2)Platform总线仅仅时诸多总线中的一种。platform总线的设计初衷:见《设备树和Platform架构--4--platform bus概述及其初始化》(3)在设备树为引入到li...

2019-06-13 10:15:46 971 1

原创 设备树和Platform架构--4--platform bus概述及其初始化

1 概述1.1 platform(平台)总线出现背景 Platform总线是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等,他们与cpu的通信都是直接挂在相应的总线下面与cpu进行数据交互的,但是在嵌入式系统当中,并不是所有的设备都能够归属于这些常见的总线,在嵌入式系统里面,SoC系统中集成的独立的外设控制器...

2019-06-12 09:00:02 3902

转载 设备树和Platform架构--2--设备树编译

本小节讲解(1)设备树编译(2)uboot对设备树的相关操作;参考:https://blog.csdn.net/woyimibayi/article/details/775747361 Device Tree编译Device Tree文件的格式为dts,包含的头文件格式为dtsi,dts文件是一种人可以看懂的编码格式。但是uboot和linux不能直接识别,他们只能识别二进制文件,所...

2019-06-04 13:49:53 934 1

原创 设备树和Platform架构--3--kernel解析设备树(dtb----device_node)

参考:https://blog.csdn.net/thisway_diy/article/details/84336817https://blog.csdn.net/woyimibayi/article/details/775747361 概述Linux使用设备树完成3个目的:(1)识别machine(platform identification);(2)运行信息提取与管...

2019-06-04 10:19:15 2827

原创 设备树和Platform架构--1--设备树基础

本小节讲解设备树相关的基础知识。参考链接:https://www.cnblogs.com/liuwanpeng/p/7421661.html设备数语法参考链接:https://elinux.org/Device_Tree_Usage设备树(dts)是节点和属性的树型结构。属性即为键-值对,节点包含子节点和属性描述上图属性结构的示例dts为:##################...

2019-05-30 09:24:25 1635

原创 vim 常用命令

only record1 打开终端:ctl+alt+t:打开一个终端ctrl+shift+t ,:在同一个窗口中打开多个终端Alt+1,就会切换到第一个终端,按Alt+2,就会切换到第2个终端,Alt+n,对应的就会切换到第n个终端。2 安装CTAGSsudo apt-get install ctags->如果你的vim有使用echofunc插件来显示函数的参数定义, 那么在...

2019-05-29 21:59:38 313

原创 PCI-E基础知识学习

PCIE特点:(1)2种路由方式:基于地址的路由方式、基于ID(BDFR)的路由方式(2)2种数据发送方式:Posted方式和No-Posted方式;(3)多种总线事务:配置读写、内存读写、IO读写、消息一、PCIe IP初始化主要完成工作:链路训练及初始化、PCIe IP初始化1、链路训练(1)基本概念1)PCIe链路结构: 一个Lane由收发2个方向组成...

2018-12-21 17:24:38 13512 4

原创 GIT 基本原理及使用

1 git基础1.1 git与其它版本控制(SVN)的区别(1)Git是分布式的,而Svn不是分布的;GIT跟SVN一样有自己的 集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看历史版本记录,创建项 目...

2018-11-12 23:08:00 386

转载 Linux内核数据结构-----链表2

一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用...

2018-08-25 18:08:55 176

原创 Linux内核数据结构-----链表

0 内核链表的引出背景普通的链表操作,通常包含数据域和指针域2个内容 如下所示。typedef struct node{     ElemType data;       //数据域     struct node *next;  //指针域}node, *list;   但是,这种方式和数据本身的关联性太大,不利于通用化;而Linux中设计了一种专门的通用链表数据结构,只需将链...

2018-08-18 14:20:38 177

原创 python环境搭建问题总结

对于pycharm + python环境搭建中出现pip无论是在setting中配置还是在CMD中调用都报错的情况,一般都是版本匹配问题,python、pycharm 、pip 的版本要配套。

2018-04-25 09:46:52 287

原创 嵌入式操作系统----BSP架构实现

在嵌入式系统中为了对外设进行统一管理,本文设计了一种简易的设备驱动管理架构。一、基本概念所谓设备驱动管理架构是指使用数组索引的方式对SOC片内外设进行统一的管理。基本原理:为每一种外设分配一个设备编号,功能函数通过设备编号索引相应的设备操作。 二、设备驱动管理架构结构体1、将SOC片内外设进行编号//设备编号,静态分配#define     Device_Spi    1#define     D...

2018-04-07 21:55:29 2705

原创 嵌入式操作系统---核间通讯之RingBuf

前言两个核(分为主核和从核)之间进行通讯,一般使用共享内存的形式进行。核间通讯的机制,是以共享内存为媒介,利用核间中断来通知对方。通过核间对象的句柄进行具体的访问和操作;(1)多个核进行核间通讯时,首先由一个核创建一个核间对象,另外一个核通过名称或索引定位到该对象的句柄,从而对核间通讯对象进行操作。(2)核间中断来通知对方,采用“硬件信号量”对资源进行临界保护,再利用操作系统的信号量使得核间任务的...

2018-04-07 10:44:41 9498

原创 嵌入式操作系统---内存管理

嵌入式系统中的内存管理,主要用于实现内存的动态申请/释放;在嵌入式操作系统中,使用malloc/free这两个函数会产生内存碎片;并且这两个函数的执行时间存在不确定性;争取对以下嵌入式操作系统的内存管理机制有一定的认识:1、uc/os上使用的内存管理机制2、典型值的内存管理机制3、基于伙伴算法的内存管理机制一、uc/os上使用的内存管理机制(一)基本原理首先将一块大的内存堆分为若干个分区,每个分区...

2018-04-03 21:29:34 5228

原创 嵌入式知识储备---死锁的形成与解决

一、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争同一资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。二、死锁产生的原因1、系统资源竞争只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。2、进程请求和释放资源的顺序不当进程在运行过程中,请求和释放资源的顺序...

2018-04-01 11:15:20 1130

原创 嵌入式操作系统---打印函数(printf/sprintf)的实现

格式化输出函数:printf/sprintf/fprintf/snprintf等等一、打印函数简介作用:将“给定的内容”按照“指定的格式”输出到“指定目标内”。打印函数的基本格式:char print_buf[BUF_SIZE];void printf(const char *fmt, ...){ va_list ap;//定义一个指针变量 unsigned ...

2018-03-31 23:22:28 6211 1

原创 Linux开发环境搭建05---s3c2440最简BootLoader实现

一、JZ2440(S3C2440开发板)存储单元说明JZ2440的基本参数如下:SDRAM:64MB   0x3000 0000~ 0x3400 0000Nand Flash:256MB  0x0000 0000 ~ 0x1000 0000 二、最简BootLoader启动流程分析JZ2440开发板的启动分为Nor Flash启动和Nand Flash启动,这里以NandFlash启动为例进行说明...

2018-03-24 23:29:55 695

原创 嵌入式知识储备---边沿触发与电平触发的区别

1、边沿触发边沿触发包括上升沿触发和下降沿触发,边沿触发检测的是电平变化,高电平转低电平或低电平转高电平时,触发一次中断。边沿沿触发是锁存中断信号的,由D触发器记忆,即:若CPU来不及响应中断,外部中断信号撤消后,由于D触发器的记忆作用,消失的中断信号仍然有效,直到中断被响应并进入中断ISR,记忆的中断信号才会由硬件自动清除。2、电平触发电平触发分为高电平触发和低电平触发;电平触发需要手动清除中断...

2018-03-20 08:49:43 2628

罗克韦尔实验指导

以MicroLogix1400为例讲述了AB PLC ML系列的操作方法。

2013-12-06

simulate UART receive

单片机模拟UART,包含发送和接受两部分,实现了普通单片机IO口模拟异步串行的通讯方式。

2013-08-28

空空如也

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

TA关注的人

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