![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
菜鸟嵌入式
文章平均质量分 76
zhu8920253
这个作者很懒,什么都没留下…
展开
-
开发板uboot ping不通虚拟机解决方法
具体设置set severip 192.168.1.xxset addrip原创 2014-11-04 22:42:03 · 707 阅读 · 0 评论 -
内核初始化优化宏 ,初始化顺序, __init,__devexit等
内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。下面是一些常用的宏:· __init ,标记内核启动时使用的初始化代码,内核启动完成后不再需要。以此标记的代码位于.init.text转载 2015-03-17 15:50:36 · 226 阅读 · 0 评论 -
U-Boot启动过程完全分析
1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能Ø 硬件设备初始化Ø 加载U-Boot第二阶段代码到RAM空间Ø 设置好栈Ø 跳转到第二阶段代码入口 (2)第二阶段的功能Ø 初始化本阶段使用的硬件设备Ø 检测系统内存映射Ø 将内核从Fla转载 2015-03-30 09:59:16 · 274 阅读 · 0 评论 -
软件开发过程中的C语言细节记录
1.在linux 2.6.38内核的driver/input/keyboard目录下的gpio_keys.c源码中的486行开始如下for (i = 0; i pdata->nbuttons; i++) { struct gpio_keys_button *button = &pdata->buttons[i]; struct gpio_but转载 2015-04-01 10:57:57 · 361 阅读 · 0 评论 -
mod_timer()
Namemod_timer — modify a timer's timeoutSynopsisint mod_timer(struct timer_list * timer, unsigned long expires); Argumentstimerthe timer to be modif转载 2015-04-08 16:16:58 · 706 阅读 · 0 评论 -
宏定义中的#,##
1、在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。(原文:When you put a # before an argument in a preprocessor macro, the preprocessor turns that argument into a character array. This,combined with the fact转载 2015-04-15 13:31:35 · 450 阅读 · 0 评论 -
Linux时间子系统之五:低分辨率定时器的原理和实现
利用定时器,我们可以设定在未来的某一时刻,触发一个特定的事件。所谓低分辨率定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。早期的内核版本中,内核并不支持高精度定时器,理所当然只能使用这种低分辨率定时器,我们有时候把这种基于HZ的定时器机制成为时间轮:time wheel。虽转载 2015-04-17 11:05:18 · 264 阅读 · 0 评论 -
Linux输入子系统:输入设备编程指南 -- input-programming.txt
输入设备编程指南(Programming input drivers)~~~~~~~~~~~~~~~~~~~~~~~~~1. 新建一个输入设备驱动程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1.0 一个最简单的例子~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转载 2015-05-04 11:47:52 · 263 阅读 · 0 评论 -
自旋锁spin_lock和raw_spin_lock
1. 临界区(Critical Section)我们知道,临界区是指某个代码区间,在该区间中需要访问某些共享的数据对象,又或者是总线,硬件寄存器等,通常这段代码区间的范围要控制在尽可能小的范围内。临界区内需要对这些数据对象和硬件对象的访问进行保护,保证在退出临界区前不会被临界区外的代码对这些对象进行修改。出现以下几种情形时,我们需要使用临界区进行保护:(1) 在可以抢占(p转载 2015-05-04 14:04:28 · 1613 阅读 · 0 评论 -
内核中的static inline
GCC的static inline定义很容易理解:你可以把它认为是一个static的函数,加上了inline的属性。这个函数大部分表现和普通的static函数一样,只 不过在调用这种函数的时候,gcc会在其调用处将其汇编码展开编译而不为这个函数生成独立的汇编码。除了以下几种情况外: *函数的地址被使用的时候。如通过函数指针对函数进行了间接调用。这种情况下就不得不为static inline函数转载 2015-05-13 08:32:58 · 477 阅读 · 0 评论 -
source insight 的一些快捷键
Jump ToDefinition 跳到定义出(也就是声明) : Ctrl+=, Ctrl+L Click (select), Ctrl+Double L ClickGoBack 后退 : Alt+,, Thumb 1 ClickGoForward 向前 : Alt+., Thumb转载 2015-05-13 08:35:54 · 400 阅读 · 0 评论 -
ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成转载 2015-05-18 23:19:45 · 285 阅读 · 0 评论 -
I2C
2 I2C子系统2.1 LinuxI2C子系统架构在内核中已经提供I2C子系统,所以在做I2C驱动之前,就必须要熟悉该子系统。2.2 三大组成部分1、I2C核心(i2c-core)I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorithm)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。转载 2015-06-09 13:14:19 · 329 阅读 · 0 评论 -
i2c驱动
今天我们来一起学习,arm裸机中对I2C设备学习。包括GPIO,IIC控制器学习。一、总体架构图二、I2C操作的一般步骤2.1 查看s5pv210开发板的I2C相关的硬件原理图开发板上IIC实际连接电路,AT24C02为EEPROM,大小为2k位,256字节核心板对应的原理图2.2 设置GPIO寄存器为I2C功能转载 2015-06-11 13:55:45 · 432 阅读 · 0 评论 -
tasklet原理
tasklet是Linux内核中“可延迟执行”机制、或“中断下半部”的一种。基于软中断实现,但比软中断灵活,tasklet有的地方翻译作“任务蕾”,大部分书籍没找到合适的词汇去翻译它。本篇博客主要介绍tasklet的设计原理、使用方法。本篇博客耗时8小时。一、tasklet解决什么问题?先看下tasklet在一些书籍上的介绍:tasklet是I/O驱动程序中实现转载 2015-07-09 08:36:39 · 3450 阅读 · 0 评论 -
Linux内核设计与实现(8)---中断和中断处理
之前写过中断相关的文章了,详细分析过ARM底层中断实现过程,这篇文章着重从操作系统设计层面理解中断系统。1.中断中断:是外围设备产生的异步事件,不同设备,中断号不同;比如在经典PC上,IRQ 0是时钟中断,IRQ 1是键盘中断;对于连接于PCI总线上的设备,中断还可以是动态分配的。异常:与中断不同,异常的产生必须考虑与处理器时钟同步,比如除零,缺页,软中断等,都是由处理器自身产生的同步转载 2015-03-26 09:30:43 · 306 阅读 · 0 评论 -
setup_irq与request_irq的区别
题记: 前两天在做i.mx28硬件定时器的驱动,参考了BSP里带的,使用TIMER0作为系统时钟的注册代码,发现其注册时钟中断的函数使用的是setup_irq,而非常用的request_irq,觉得有些奇怪,今天网上搜了一下,大概了解了一下原因。其实,request_irq最终调用的中断注册函数也是setup_irq,只是request_irq函数中还使用了kmalloc,而kmall转载 2015-03-26 09:19:19 · 553 阅读 · 0 评论 -
头文件相关函数
2.6.30.4的头文件的位置和2.6.25.8的不一样,除去内核源码下的include目录外,在arch/arm/mach-s3c2410/和arch/arm/plat-s3c24xx/目录下都有include目录的。#include 是在linux-xxx/include/linux下面寻找源文件。#include 是在linux-xxx/arch/arm/include/asm下面寻原创 2015-03-25 14:26:49 · 292 阅读 · 0 评论 -
Ubuntu14下配置tftp服务器
第1步:安装tftp所需的软件。首先需要安装tftp-hpa,tftpd-hpa,前者是客户端,后者是服务程序,在终端下输入 sudo apt-get install tftp-hpa tftpd-hpa,安装tftp-hpa和tftpd-hpa。然后还需要安装xinetd,在终端下输入 sudo apt-get install xinetd,安装好xinetd。第2步:转载 2014-11-04 19:42:27 · 286 阅读 · 0 评论 -
ARM指令中的"8位图"立即数格式
ARM指令中的"8位图"立即数格式 (2012-02-25 22:06:46)转载▼标签: 杂谈分类: ARM书中在介绍ARM指令格式的时候, 指出:"ARM MOV指令中, 第二个操作数 (operand2) 如果是常数表达式的话, 该常数须对应8位位图 (Pattern), 即常数是由一个8位的常数循环移位偶数转载 2014-11-23 11:08:23 · 4233 阅读 · 1 评论 -
SDRAM内存驱动 的学习
论坛里这样说的:片内RAM不需要驱动,直接上电可以执行代码!当代码要拷贝到片外SDRAM的时候,就要先初始化CPU内部的SDRAM控制器(也就是RAM驱动),由于片外的SDRAM可以兼容普通的SDRAM和高速DDR内存,每种型号的RAM延时,等待等周期各不同,为了匹配外部RAM时序获得更高性能,当然要初始化RAM控制器,也就是RAM驱动!SDRAM(Synchronous Dynami转载 2014-11-29 15:24:43 · 688 阅读 · 0 评论 -
SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)
【什么是BRC和RBC】BRC = Bank, Row, Column = Bank-Row-ColumnRBC = Row, Bank, Column = Row-Bank- Column是SDRAM中,两种不同的地址映射方式。 下面就针对上面的表述,来一点点解释。1. Bank其中Bank,是内存领域里面常用的术语,有把Bank翻转载 2014-11-29 13:41:04 · 5706 阅读 · 0 评论 -
linux等待队列wait_queue_head_t和wait_queue_t
等待队列在linux内核中有着举足轻重的作用,很多linux驱动都或多或少涉及到了等待队列。因此,对于linux内核及驱动开发者来说,掌握等待队列是必须课之一。 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。它有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待转载 2015-01-27 09:16:59 · 602 阅读 · 0 评论 -
对Linux系统休眠的理解
今天看了一个关于中断例程为什么不能休眠的文章,引发了我的思考。其实这个问题在学习驱动的时候早就应该解决了,但是由于5年前学驱动的时候属于Linux初学者,能力有限,所以对这个问题就知其然,没有能力知其所以然。现在回头看这个问题的时候,感觉应该可以有一个较为清晰的认识了。首先必须意识到:休眠是一种进程的特殊状态(即task->state= TASK_UNINTERRUPTIBLE | TASK_转载 2015-01-09 09:37:44 · 261 阅读 · 0 评论 -
详述DRAM、SDRAM及DDR SDRAM的概念
DRAM (动态随机访问存储器)对设计人员特别具有吸引力,因为它提供了广泛的性能,用于各种计算机和嵌入式系统的存储系统设计中。本文概括阐述了DRAM 的概念,及介绍了SDRAM、DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM、DDR4 SDRAM、LPDDR、GDDR。DRAMDRAM较其它内存类型的一个优势是它能够以IC(集成电路)上每个内转载 2014-12-03 09:15:55 · 1770 阅读 · 0 评论 -
_wait_event 具体实现过程
#define __wait_event(wq, condition) do { DEFINE_WAIT(__wait);for (;;) { prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); if (condition) break;转载 2015-01-27 09:45:19 · 272 阅读 · 0 评论 -
linux中的睡眠
在linux的内核中,有很多睡眠相关的函数,比如sleep_on,当然也有wake_up,睡眠的意义就是不能再运行了,那么睡眠总要有个地方啊,我们睡眠都要有个床,按照人性化设计出来的linux内核也应该有个睡眠用的床,这是对的,但是,睡眠一定要在床上吗?非也! 就好像现代的白领们,习惯就很不好,总喜欢伏案而小憩,这样不但不解乏而且还不利于健康,不管怎么说也算是一个休息方式,另外闲着没啥事的时候转载 2015-01-27 09:59:49 · 377 阅读 · 0 评论 -
嵌入式系统Linux内核开发工程师必须掌握的三十道题
先记录下:1) Linux中主要有哪几种内核锁?2) Linux中的用户模式和内核模式是什么含意?3) 怎样申请大块内核内存?4) 用户进程间通信主要哪几种方式?5) 通过伙伴系统申请内核内存的函数有哪些?6) 通过slab分配器申请内核内存的函数有?7)转载 2014-12-12 15:43:20 · 338 阅读 · 0 评论 -
软中断,tasklet和工作队列的区别与联系
为了让中断处理运行的快,同时要完成相应的全部工作。根据具体的内容将中断分为两个部分:上半部分(中断处理程序)和下半部分(推后处理程序)。上半部分需要立即执行,并且有严格的时间限制,这些工作是在所有中断被禁止的情况下完成的,剩余部分工作推迟到下半部分。下半部分的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。在Linux2.6的内核中存在三种不同形式的下半部实现机制:软中断,tas转载 2015-01-20 13:38:05 · 1961 阅读 · 0 评论 -
tasklet和工作队列
tasklet tasklet vs 内核定时器 相同:始终在中断期间运行,始终会在调度他们的同一CPU上运行,而且都接收一个unsigned long参数 不同:不可以要求tasklet在某一给定的时间执行tasklet对中断处理例程来说尤其有用。中断处理例程必须尽可能快的管理硬件中断,而大部分数据管理则可以安全的延迟到其后的时间。实际上,转载 2015-01-20 13:32:20 · 376 阅读 · 0 评论 -
信号量、互斥体和自旋锁
一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3) 若此转载 2015-01-05 08:37:32 · 318 阅读 · 0 评论 -
linux文件系统如何进行文件存取
乍一看,这个题目好像有点小儿科。写文件嘛echo hello > /tmp/foo读文件嘛cat /tmp/foo对于普通文件的存取,的确可以使用上面的方法。但是在linux操作系统上,一 切都是文件。除了普通文件,还包括:目录,符号链接,IPC Endpoints(如pipe,unix socket)和设备文件(块设备,字符设备)。当然,本文的重点不在转载 2015-08-04 16:28:03 · 669 阅读 · 0 评论