关闭

自己学驱动18——中断

1.中断原理     当某个事件发生时,硬件会设置某个寄存器;CPU在执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址去处理这个事件,最后返回继续执行被中断的程序。 2.中断处理过程     (1)中断控制器汇集各类外设发出的中断信号,然后告诉CPU。     (2)CPU保存当前程序的运行环境(各个寄存器等),调用中断服务...
阅读(644) 评论(0)

自己学驱动17——ARM工作模式和ARM9寄存器

1.ARM体系CPU的7种工作模式     (1)用户模式(usr):ARM处理器正常的程序执行状态。     (2)快速中断模式(fiq):用于高速数据传输或通道处理。     (3)中断模式(irq):用于通用的中断处理。     (4)管理模式(svc):操作系统使用的保护模式。     (5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。...
阅读(1338) 评论(0)

自己学驱动16——NAND Flash

1.NOR Flash和NAND Flash     对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有的Flash器件(包括NOR Flash和NAND Flash)都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),NAND Flash出现这种问题的几率远大于NOR Flash。当位反转发生在关键的代码、数...
阅读(677) 评论(0)

自己学驱动15——Cache

1.Cache简介     同样是基于程序访问的局部性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,这对提高系统的性能很有帮助。这个位于主存和CPU之间的高速小容量存储器称作高速缓冲器(Cache)。     启用Cache之后,CPU读取数据时,如果Cache中有这个数据的副本则直...
阅读(651) 评论(0)

自己学驱动14——内存管理单元MMU(内存访问权限检查和TLB)

1.内存的访问权限检查     内存的访问权限检查是MMU的主要功能之一,简单地说,它就是决定一块内存是否允许读、是否允许写。这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位等联合作用。     CP15寄存器C1中的A位表示是否对地址进行对齐检查,所谓对齐检查就是访问字时地址是否为4字节对齐,访问半字时地址是否2字节对齐,如果...
阅读(1100) 评论(0)

自己学驱动13——内存管理单元MMU(虚拟地址和物理地址)

1.MMU简介     MMU负责完成虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。现代的多用户多进程操作系统通过MMU使得各个用户进程都拥有自己独立的地址空间:地址映射功能使得各个进程拥有"看起来"一样的地址空间,而内存访问权限的检查可以保护每个进程所使用的内存不会被其他进程所破坏。MMU增加了底层的复杂性,但是为上层程序开发提供了极大的方便。 2.虚拟地址与物理地址...
阅读(975) 评论(0)

自己学驱动12——存储控制器

1.2440的BANK     2440一共提供给外部8个BANK(BANK0~BANK7),每个BANK均为128MB的地址空间,一共1GB地址空间。2440对外引出了27根地址线ADDR0~ADDR26,这27根地址线的访问地址大小为128MB,2440对外还引出了8根片选信号nGCS0~nGCS7,对应于BANK0~BANK7,当访问BANKx的地址空间时,nGCSx引脚输出低电平,27根...
阅读(620) 评论(0)

自己学驱动11——简单GPIO操作

1.对于GPIO的操作     对于GPIO的操作,通常是通过读写其相应的寄存器来实现的,S3C2440也是如此。比如,S3C2440的GPBCON和GPBDAT寄存器的地址分别是0x56000010和0x56000014,可以通过如下的指令让GPB5输出低电平。     #define GPBCON (*(volatile unsigned long *)0x56000010)     #...
阅读(571) 评论(0)

自己学驱动10——arm-linux-选项

1、arm-linux-gcc选项 总体选项 (1)-E:预处理之后立即停止,不进行编译。 (2)-S:编译后停止,不进行汇编。 (3)-c:预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成obj文件。 (4)-o:指定输出文件名。这个选项可以使用在预处理、编译、汇编以及连接中,需要注意的是obj文件后缀为.o,而汇编文件的后缀为.s。 (5)-v:显示制作GCC工具自身时...
阅读(661) 评论(0)

自己学驱动9——uboot代码阅读四(start_armboot函数)

前面分析过在start.S中执行完相关的一些操作之后,会跳转到C语言的部分来执行,跳转到的目标位置就是start_armboot函数,所以现在来看一下这个函数完成了一些什么工作。在这个函数的第一行定义了一个变量如下: init_fnc_t **init_fnc_ptr;     通过查找uboot源码可以得到下面的类型重定义: typedef int (init_fnc_t) (void);...
阅读(595) 评论(0)

自己学驱动8——uboot代码阅读三(start.S)

/* Set up the stack                            */ stack_setup:     ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */     sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area          ...
阅读(956) 评论(0)

自己学驱动7——uboot代码阅读二(start.S)

#ifdef CONFIG_USE_IRQ /* IRQ stack memory (calculated at run-time) */ .globl IRQ_STACK_START IRQ_STACK_START:     .word    0x0badc0de /* IRQ stack memory (calculated at run-time) */ .globl FIQ...
阅读(761) 评论(0)

#ifdef、#if defined、#ifndef的使用

1.#ifdef和#if defined     注意两者都有个define的作用,区别在于使用方式上。前者的通常用法是: #ifdef  X    .... #else    .... #endif     只能在两者中选择是否有定义。对于后者,常用法是: #if defined x1    .... #elif defined x2    .... #elif de...
阅读(885) 评论(0)

RS485接口保护电路

下面就是四种RS485防雷保护接地电路原理图,GDT(陶瓷放电管)接地,TVS(瞬态抑制二极管)接地,后端电路的是信号地,大家从图中可以很方便的看到接地的情形。...
阅读(1231) 评论(1)

RS232接口保护电路

●RS232口在通信设备上作为调试用接口,板间通信接口和监控信号接口,传输距离不超过15米。调试用接口使用比较频繁,经常带电插拔,因此接口会收到过电压,过电流的冲击,若不进行保护,很容易将接口芯片损坏 。  ●RS232的接口芯片输出电压一般为±9V,不会超过±12V。因此对接口收发信号线可采用双向瞬态抑制二极管. BS0150MS,限流电阻选100欧姆,一般放在232接口芯片侧,电阻的功率要选...
阅读(977) 评论(0)

《C和指针》整理一

1.C语言的注释     在C语言中,如果需要注释掉一段代码,且代码中可能会已经存在/**/注释形式,那么可以使用: #if 0     statements #endif     这种形式来注释掉这段代码(statements代表这段代码)。这样做的原因是C语言不允许嵌套注释,也就是说第一个/*和第一个*/符号之间的内容都被看作注释,不管里面还有多少个/*符号。 2.换行符的处理...
阅读(742) 评论(0)

《C陷阱和缺陷》整理四

1.assert宏的定义 #define assert(e) \               ((void)((e) || _assert_error(__FILE__, __LINE__)))     库里面对这个宏做了这样的定义,当宏参数(或表达式)e为真的时候由||运算符的运算规则会执行_assert_error(__FILE__, __LINE__)从而打印一条报警信息。所以整个表达...
阅读(1021) 评论(0)

《C陷阱与缺陷》整理三

1.大多数C语言的实现都通过函数main的返回值来告诉操作系统该函数的执行是成功还是失败。典型的处理方案是,返回值为0代表程序执行成功,返回值非0则表示程序执行失败。如果一个程序的main函数并不返回任何值,那么有可能看上去执行失败。所以建议我们的C程序的main函数应该如下编写: int main() {     return 0; } 当然如果main函数需要接受参数的话将参数声明加...
阅读(700) 评论(0)

《C陷阱与缺陷》整理二

1.在C语言中,我们没有办法将一个数组作为函数参数传递,如果我们使用数组名作为参数,这个时候数组名立刻会被转换为指向该数组的第一个元素的指针。     关于这一点的理解可以向前深入一步,比如定义的数组为int a[3],那么a作为参数传递之后会变为int *类型;如果定义的数组为int a[3][4],那么a作为参数传递之后被变为int (*)[4];如果定义的数组为int a[3][4][5]...
阅读(740) 评论(0)

《C陷阱与缺陷》整理一

1.词法分析中的“贪心法”     C语言的某些符号,例如/、*和=,只有一个字符长,称为单字符符号。而C语言中的其他符号,例如/*和==,以及标识符等都包含了多个字符,称为多字符符号。当C编译器读入一个字符'/'后又跟了一个字符'*',那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号来对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽...
阅读(887) 评论(0)
244条 共13页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:226287次
    • 积分:4350
    • 等级:
    • 排名:第7383名
    • 原创:215篇
    • 转载:29篇
    • 译文:0篇
    • 评论:43条
    最新评论