自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

转载 vim配置及插件安装管理(超级详细)

转自:https://www.cnblogs.com/snowbook/p/5923770.html 1 写在前面   Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, "工欲善其事,...

2019-01-28 12:49:55 8862

转载 STM32启动文件——startup_stm32f10x_hd.s

转自 http://blog.csdn.net/wqx521 https://blog.csdn.net/a1314521531/article/details/50925553 一、启动文件的作用 (关于启动代码的作用,前面已经提到过了,这里再啰嗦一下)(1)初始化堆栈指针 SP;(2)初始化程序计数器指针 PC;(3)设置堆、栈的大小;(4)设置异常向量表的入口地址...

2019-01-28 09:21:17 2940

转载 stm32 startup_stm32f10x_md.s的作用

一、启动文件的作用是:1.  初始化堆栈指针 SP;2.  初始化程序计数器指针 PC;3.  设置堆、栈的大小;4.  设置异常向量表的入口地址;5.  配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM);6.  设置 C 库的分支入口__main(最终用来调用 main 函数);7.  在 3.5 版的启动文件还调用了在 sy...

2019-01-28 09:16:26 6259 1

转载 STM32存储器知识的相关应用(IAP、Bit Banding)

1 STM32的启动根据参考手册RM0008中的图表: 得知STM32的启动有三种模式,三种模式的选择在于芯片上的两个Boot引脚,如RM0008种描述: 在系统复位之后的四个上升沿后索存BOOT引脚,从而决定启动方式;用户对BOOT引脚的设置决定了系统复位之后的启动模式。三个不同的启动区域有着不同的起始地址,STM32这样规定: 注意的是:只有当从SRAM...

2019-01-28 09:10:45 536

转载 STM32启动过程解析

  相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:...

2019-01-23 21:50:38 258

转载 STM32启动过程--启动文件--分析

STM32启动过程--启动文件--分析一、概述1、说明  每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。  STM32作为一款高端Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。  本文以一个实际...

2019-01-23 21:43:13 1494 1

转载 嵌入式系统启动例程

通常PC在开机之后,会进入带有PC机厂商信息的BIOS画面,并且会显示出当前PC机的硬件信息,比如:内存大小,CPU信息等,它其实是PC机启动之后运行的第一段程序,它主要完成一些基本硬件初始化操作和硬件检测工作,保证拥有操作系统正常运行的软硬件环境,随后会加载并且启动操作系统。该段小程序是烧制到主板上的BIOS存储硬件里的。由此可见计算机系统在启动过程中必须依赖软硬件,在嵌入式系统中同样需要软硬件...

2019-01-23 21:32:02 914

转载 深入嵌入式系统的 BootLoader

一、简介   本文将从 BootLoader 的概念、BootLoader 的主要任务、BootLoader 的框架结构以及 BootLoader 的安装等四个方面来讨论嵌入式系统的 BootLoader。   引导加载程序 。包括固化在固件 (firmware) 中的 boot 代码 ( 可选 ) ,和 Boot Loader 两大部分。   Linux 内核 。特定于嵌入式板子的定制内核...

2019-01-23 20:54:42 342

转载 STM32存储结构(2)

当我们在完成某一个实验,当我们正庆幸的时候,我们不由得产生一种不安的想法——我们是否已经少许明白其中的种种细节?尤其,当我们所有的事情都依赖于编译环境或Firmware,抑或他人的程序,而自己仅仅是Copy和Modify,以致Using。当你还是一个初学者的时候,或许不会太过于关注于此,但是要想提高自己对单片机、处理器原理的理解,并且希望走得更远的时候,您就需要关注更为详细的内部知识,您需要明...

2019-01-23 20:44:09 1106

转载 STM32学习:存储器组织

一、存储结构  STM32F1有四种存储单元,依次是SRAM、Flash、FSMC和AHB到APB桥(挂载各种外设)。二、存储组织程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。  可访问的存储器空间被分成8个主要块,每个块为512MB...

2019-01-23 20:17:24 741

转载 嵌入式 Linux 启动时间优化

1 简介本章包含的话题有启动时间的测量、分析、人因工程(human factors)、初始化技术和优化技巧等。产品花在启动方面的时间直接影响终端用户对该产品的第一印象。一个消费电子设备不管如何引人注目或者设计得怎么好,设备从关机状态到可交互的使用状态所需的时间对于获得正面的用户体验尤为关键。案例 #1 就是在关机状态从头启动一个设备的例子。启动一个设备涉及到许多步骤和一系列的事件。...

2018-11-01 12:40:07 6505

转载 ubuntu安装GTK2.0

1、安装gcc/g++/gdb/make 等基本编程工具sudo apt-get install build-essential2、安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件sudo apt-get install gnome-core-devel3、用于在编译GTK程序时自动找出头文件及库文件位置sudo apt-g

2014-10-11 13:29:57 19112 1

原创 块设备之三

一、I/O调度器1.1 数据结构在将请求提交给块设备时,内核提供了各种调度策略,这些调度器用于重排和调度I/O请求以获得最优的性能。I/O调度器在内核中被称为elevator。内核使用了如下数据结构来实现和管理I/O调度器:struct elevator_type{ /* managed by elevator core */ struct kmem_cache *icq_cac

2014-02-20 22:10:22 2084

原创 块设备驱动之二

一、将块设备添加到系统register_blkdev并没有真正将设备添加到系统中,想要将设备添加到系统中,需要使用如下API:void blk_register_region(dev_t devt, unsigned long range, struct module *module, struct kobject *(*probe)(dev_t, int *, void *),

2014-02-12 00:00:56 5465

原创 块设备驱动程序之一

一、块设备概述linux支持的两种重要的设备类型分别是字符设备和块设备,块设备可以随机地以固定大小的块传送数据。与字符设备相比,块设备有以下几个特殊之处:块设备可以从数据的任何位置进行访问块数据总是以固定长度进行传输,即便请求的这是一个字节对块设备的访问有大量的缓存。当进行读时,如果已经缓存了,就直接使用缓存中的数据,而不再读设备,对于写也通过缓存来进行延迟处理。在块系统中,数据块

2014-02-10 23:41:00 5482

原创 字符设备驱动

一、设备驱动概述linux内核的驱动模型为编写驱动提供了抽象,将驱动公共的部分提取了出去简化了驱动的编写工作,但是那并不是实际的驱动,如果要实现真正的驱动,还要给予驱动模型做一些其它的工作。根据外设和内核交互数据的方式,内核将驱动分成了几种类别。基本上设备可以分为两类,一类适合于面向字符的交换,一类适合于处理包含固定数目字节的数据块,这两类分别称为字符设备和块设备(网络设备是一种特殊的设备,它

2014-01-28 22:39:50 1824

原创 驱动和class

一、设备驱动相比较设备、总想,设备驱动能够抽象的要少些,它的更多内容都是特定于硬件的,因而linux驱动模型中的驱动部分相对也比较简单。1.1 数据结构linux内核的设备驱动子系统使用数据结构struct device_driver来表示一个设备驱动,请定义如下:struct device_driver {const char *name;struct bus_typ

2014-01-27 23:32:42 1741

原创 总线和设备

一、总线总线是处理器与设备之间的通道。在linux设备模型中,所有的设备都通过总线相连,总线可能是实际的总线,比如usb总线,pci总线,也可能是虚拟的总线。1.1 数据结构linux使用bus_type来表示总线。其定义如下:struct bus_type { const char *name; const char *dev_name; struct device

2014-01-26 22:15:11 1896

原创 kobject和kset

一、kobjectkobject是linux内核做的一个抽象,它本身不具备实际的含义。它被嵌入到各种数据结构中,因而只要我们具有kobject就可以获取并访问它所嵌入的宿主数据结构。这样就提供了良好的组织管理能力。宿主数据结构可以千变万化,但是其嵌入的kobject很简单,可以基于该结构做很多通用的事情。sysfs就是利用这一点实现的。该文件系统以很简单的方式实现了对内核中各种复杂部件(尤其是

2014-01-25 21:37:06 3809

原创 sysfs文件系统

一、sysfssysfs是用来向用户空间导出内核对象的一种文件系统,通过它,用户空间程序可以查看、甚至修改内核数据结构。该文件系统是基于内核数据结构kobject建立起来的,同时该文件系统的目录结构反映了相关内核数据结构的层次结构。由于kobject是组成设备模型的基本结构,因此sysfs也包括了系统中设备的信息,它提供了系统硬件的拓扑信息。由于sysfs提供了访问、修改内核数据结构的一种

2014-01-23 15:23:29 2135 1

原创 proc文件系统

一、proc文件系统proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容动态生成,当写文件时,文件所关联的写函数被调用。每个proc文件都关联的字节特定的读写函数,因而它提供了另外的一种和内核通信的机制:内核部件可以通过该文件系统向用户空间提供接口来提供查询信息、修改软件行为,因而它是一种比较重要的特殊文件系统。1.1 proc文件系统的内容由于proc文件系统以文件的形式

2013-11-28 21:39:15 12483

原创 访问IO设备

一、I/O端口和I/O内存1.1 I/O端口和I/O内存的概念外设都是通过读写其寄存器来进行访问的,可以通过寄存器来对其进行配置、获取其运行状态。由于不是处理器自己的寄存器,因而无法直接使用指令访问,外设的寄存器需要通过其地址来进行访问。外设寄存器的地址可能位于内存地址空间也可能位于单独的I/O地址空间。在为外设提供了单独的I/O地址空间的架构上,处理器提供了称为I/O端口的独立的

2013-11-28 00:46:13 5794

原创 设备IO之二(DMA)

一、DMADMA是硬件的一种能力,具备这种能力的硬件可以直接从主存中读写数据,也就是它可以直接使用主存进行I/O而不需要处理器的干预,这可以节省处理器资源并提高整个系统的IO吞吐量,因为IO操作相对来说是较慢的,如果每个IO都要使用处理器资源,则毫无以为会耗费大量CPU时间在单个IO上,最终导致系统IO性能下降。1.1 DMA工作方式对于I/O来说,在输入端存在两种工作模式:软

2013-11-26 21:29:27 8365

原创 设备IO之一(mmap、直接IO以及异步IO)

现在,在linux中经常可以看到在用户空间编写的驱动程序,比如X服务器,一些厂商的私有驱动等等,这就意味着用户空间取得了对硬件的访问能力,这通常是通过mmap将设备内存映射到了用户进程空间,从而使得用户可以通过读写这些内存来获取对硬件的访问能力。内核一般会对I/O操作进行缓冲以获取更好的性能,但是也提供了直接I/O以及异步I/O的能力。在和硬件进行数据交互时,有的硬件支持DMA,DMA可以

2013-11-22 18:58:40 7264

原创 linux内核数据结构以及内核调试

一、可移植性1.1 数据类型可移植性由于内核可能运行在不同的架构上,不同的架构具有不同的机器字长,因而可移植性对内核编程非常重要。内核数据使用的数据类型分为 3 个主要类型标准C类型明确大小的类型用作特定内核对象的类型1.1.1 标准 C 类型使用标准C类型时,必须知道它们的长度在不同架构上可能是会变的,标准C对每种类型的长度没有一个很严格的规定,对于很多类型,它们的长度都

2013-11-19 21:51:10 3397

原创 linux内核内存分配

内核中的内存分配通常通过kmalloc/kfree来进行,但是也有其它的方式来获取内存,所有这些方式共同提供了内核中分配、释放内存的接口。一、kmalloc/kfree类似于标准C中的malloc/free,kmalloc/kfree是内核中的用于常规内存分配的接口。kmalloc/kfree是工作在slab分配器的基础上的,在系统启动时会调用kmem_cache_init,该函数会创

2013-11-18 20:56:07 6350

原创 linux-uart

uart是Universal Asynchronous Receiver and Transmitter的缩写.翻译成中文即为”通用异步收发器”.它是串口设备驱动的封装层。它是linux在tty的基础上又做了一层封装,通过该封装层,可以比较容易的编写新的串口驱动程序。一、uart数据结构uart建立在tty之上,它是真实的驱动和tty之间的桥梁,其涉及到的关键数据结构及其相互关系如下图所示

2013-10-30 00:00:33 5798 3

原创 linux-tty

一、TTY设备在*nix中,tty设备用来抽象串口类型的设备,它位于字符驱动之下,抽象了串口设备需要的特性、功能,抽象后的一个tty设备即可表示一个串行输入、输出接口(比如控制台口,串口、pty设备接口)。TTY的实现由两部分组成:Tty core:它以统一一致的方式来处理流向某个tty设备的数据以及来自某个tty设备的数据,并向用户空间提供了统一一致的用户接口,向底层即真实的设备

2013-10-28 22:11:00 6021

原创 斐波那契堆

斐波那契堆同二项堆一样,也是一种可合并堆。相对于二项堆,斐波那契堆的优势在于如果不涉及删除元素的操作,则它的平摊运行时间为O(1)。但是由于其算法过于复杂, 因而实际上更多的是用二项堆。一、定义一个斐波那契堆具有如下性质:堆有一组有序树组成,但是堆中的树不一定是二项树斐波那契堆中的树之间是无序的(二项堆中的树是按照其包含的二项树的度数排序的)堆中每个节点的数据结构包含如下域:

2013-10-28 21:52:05 5563 1

原创 二项堆

一、二项树二项树是一种通过递归定义的有序树,其定义如下:度数为0的二项树只包含一个结点度数为k的二项树有一个根结点,根结点下有 个子女,每个子女分别是度数为k-1,k-2,…,0的二项树的根也可以按照如下定义:度数为0的二项树只包含一个结点度为k的二项树由两棵度为k-1的二项树通过连接而组成,其连接方式是:其中一棵树的根成为另一棵树的最左边的孩子。 二项树Bk具有如

2013-10-21 20:46:37 5342 1

原创 B树

B树是另一种平衡查找树,它与AVL树以及红黑树的区别在于,它的一个节点可以由多个子女,由于B树中每个节点子女比ALV树和红黑树多,因而它的高度要比这种两种树更低,不过数量级仍为O(logn)。B树中一个节点的关键字将该节点所处理的关键字域划分成了多个子域,如果一个节点有x个关键字,则它有x+1个孩子。下图即为一棵B树:一、B树的基本性质B树是一种平衡的多路查找树,一棵B树,或者

2013-10-20 11:45:38 1051

原创 linux内核的子系统(或者说功能模块的)初始化

内核启动过程中需要完成各个部分的初始化,比如中端、页面管理、slab分配器、任务调度器、网络、PCI设备等等的初始化,这些初始化大概可以分为两种:一种是关键的,必须完成的而且必须以特定的顺序来完成的初始化,这部分的代码往往是直接便如内核的而且是直接调用的另一种是非关键的的子系统(或者说模块、功能)的初始化,这部分根据配置可以不加载,可以以built-in的方式编到内核的可执行文件中,也可以

2013-10-16 22:42:29 4143

原创 ubuntu命令备忘

一、修改文件的默认打开方式1.1 相关配置文件ubuntu和文件打开方式有关的配置文件包括:全局配置文件/etc/gnome/defaults.list  /usr/share/applications/mimeinfo.cache  个人配置  ~/.local/share/applications/mimeapps.list  ~/.local/share/applica...

2013-10-15 22:16:47 1276

原创 红黑树之二(删除节点)

红黑树的另一个重要的操作是删除节点,它也可以分为两步:找到要删除的节点,并删除它对树进行调整使得树满足红黑树的要求一、删除节点从排序树中删除节点的思路是一样的,首先找到要删除的节点,并做如下处理:如果该节点不存在非空子节点,则直接删除它如果该节点存在一个非空子节点,则用其非空子节点替换其位置即可如果该节点有两个非空子节点,则可以找到该节点的前驱或者后继,然后更换

2013-10-15 21:50:08 12754 4

原创 红黑树之一(基本性质,插入节点)

平衡二叉树(AVL)是一种具有很好的性能的排序二叉树,但是也并不完美。如果所需要维护数据变化也比较频繁,这就需要经常对ALV树进行调整,由于平衡二叉树对其子树的限制太严格,因而进行插入或者删除时经常需要对树进行调整,而且插入时需要调整的子树可能就是树本身,这就需要较长的时间来查找需要调整的子树的根节点;而对于删除操作情况可能更糟,极端情况下,甚至需要递归的对每层进行调整一直调整到根节点。比如:

2013-10-14 21:36:23 5930 1

原创 平衡二叉树之二(删除节点)

类似于添加操作,从平衡二叉树中删除节点也分为两步,第一步完成节点的删除,第二步找到因为删除而导致不满足平衡二叉树要求的子树并对其进行调整。一、 删除节点从平衡二叉树中删除节点更为复杂。首先第一步需要找到要删除的节点x,并分情况进行处理:如果要删除的节点为叶子节点,就找到了要删除的节点如果要删除的节点为只有一棵子树的节点就找到了要删除的节点如果要删除的节点既有左子树,又有右子树,

2013-09-17 20:38:00 25784 17

原创 平衡二叉树之一(基本性质、查询、添加)

平衡二叉树(Balanced BinaryTree)又被称为AVL树。它具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的高度为O(logn)。平衡二叉树一般是一个有序树,由于其高度为O(logn),因此可以得到很好的添加、删除、查询效率,即O(logn)。平衡二叉树具有二叉树的所有性子,其遍历操作和二叉树的遍历操作相同。

2013-09-14 22:17:12 7172

原创 二叉树

二叉树是一种比较常见的树,其加在树上的限制是树的度为2。每个节点的两棵子树分别为其左子树和右子树。一、基本概念1.1 二叉树的性质二叉树的度为2,它具有如下性质:一棵非空二叉树的第i 层上最多有2i-1 个节点(i≥1)一棵深度为k 的二叉树中,最多具有2k-1 个节点对于一棵非空的二叉树,如果叶子节点数为n0,度数为2 的节点数为n2,则有:n0=n2+1。证

2013-09-14 13:42:22 1461

原创

树是一种极为重要极其常见的数据结构。从数据结构中数据元素之间的关系的角度来看,树表示的是一对多的关系。一、基本概念1.1 定义从定义的角度讲,树(tree)是包含n(n>=0)个结点的有穷集合,其中:每个数据元素称为被节点(node)树中有且仅有一个没有前驱的特殊节点,该节点被称为树的根节点或者树根(root),所有其它节点都有且仅有一个前驱没有后继的节点被称为树的叶子,除了叶

2013-09-13 22:24:31 2344

原创 哈希表

链表的插入和删除效率比较好,但是查找的效率较低,而数组的插入和删除效率较低,但是有很好的查找效率,很自然的想到能否将二者结合起来以得到很好的插入、删除以及查找效率。这种方法就是哈希表。一、基本概念哈希表又叫散列表。它的原理是通过一个哈希函数和一种处理冲突的方法将一组关键字映射到一个有限的连续的地址集上(即数组上)。关键字被当做选定的函数函数的输入,哈希函数的输出结果被用来索引该关键字对应的

2013-09-11 22:23:09 1958

空空如也

空空如也

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

TA关注的人

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