- 博客(245)
- 收藏
- 关注
转载 FPGA 中时钟信号的总结
数字电路中,时钟是整个电路最重要、最特殊的信号。第一, 系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错.第二, 时钟信号通常是系统中频率最高的信号.第三, 时钟信号通常是负载最重的信号, 所以要合理分配负载。出于这样的考虑在FPGA这类可编程器件内部一般都设有数量不等的专门用于系统时钟驱动的全局时钟网络。这类网络的特点...
2019-02-22 09:59:12
5740
原创 自己学驱动18——中断
1.中断原理 当某个事件发生时,硬件会设置某个寄存器;CPU在执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址去处理这个事件,最后返回继续执行被中断的程序。2.中断处理过程 (1)中断控制器汇集各类外设发出的中断信号,然后告诉CPU。 (2)CPU保存当前程序的运行环境(各个寄存器等),调用中断服务
2015-03-05 09:42:34
1262
原创 自己学驱动17——ARM工作模式和ARM9寄存器
1.ARM体系CPU的7种工作模式 (1)用户模式(usr):ARM处理器正常的程序执行状态。 (2)快速中断模式(fiq):用于高速数据传输或通道处理。 (3)中断模式(irq):用于通用的中断处理。 (4)管理模式(svc):操作系统使用的保护模式。 (5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
2015-02-27 11:37:42
3310
原创 自己学驱动16——NAND Flash
1.NOR Flash和NAND Flash 对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有的Flash器件(包括NOR Flash和NAND Flash)都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),NAND Flash出现这种问题的几率远大于NOR Flash。当位反转发生在关键的代码、数
2015-02-26 11:05:24
1320
原创 自己学驱动15——Cache
1.Cache简介 同样是基于程序访问的局部性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,这对提高系统的性能很有帮助。这个位于主存和CPU之间的高速小容量存储器称作高速缓冲器(Cache)。 启用Cache之后,CPU读取数据时,如果Cache中有这个数据的副本则直
2015-02-12 16:39:04
1253
原创 自己学驱动14——内存管理单元MMU(内存访问权限检查和TLB)
1.内存的访问权限检查 内存的访问权限检查是MMU的主要功能之一,简单地说,它就是决定一块内存是否允许读、是否允许写。这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位等联合作用。 CP15寄存器C1中的A位表示是否对地址进行对齐检查,所谓对齐检查就是访问字时地址是否为4字节对齐,访问半字时地址是否2字节对齐,如果
2015-02-11 16:28:00
2523
原创 自己学驱动13——内存管理单元MMU(虚拟地址和物理地址)
1.MMU简介 MMU负责完成虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。现代的多用户多进程操作系统通过MMU使得各个用户进程都拥有自己独立的地址空间:地址映射功能使得各个进程拥有"看起来"一样的地址空间,而内存访问权限的检查可以保护每个进程所使用的内存不会被其他进程所破坏。MMU增加了底层的复杂性,但是为上层程序开发提供了极大的方便。2.虚拟地址与物理地址
2015-02-11 15:22:32
2665
原创 自己学驱动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根
2015-02-11 10:10:26
1147
原创 自己学驱动11——简单GPIO操作
1.对于GPIO的操作 对于GPIO的操作,通常是通过读写其相应的寄存器来实现的,S3C2440也是如此。比如,S3C2440的GPBCON和GPBDAT寄存器的地址分别是0x56000010和0x56000014,可以通过如下的指令让GPB5输出低电平。 #define GPBCON (*(volatile unsigned long *)0x56000010) #
2015-02-10 13:50:07
1205
原创 自己学驱动10——arm-linux-选项
1、arm-linux-gcc选项总体选项(1)-E:预处理之后立即停止,不进行编译。(2)-S:编译后停止,不进行汇编。(3)-c:预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成obj文件。(4)-o:指定输出文件名。这个选项可以使用在预处理、编译、汇编以及连接中,需要注意的是obj文件后缀为.o,而汇编文件的后缀为.s。(5)-v:显示制作GCC工具自身时
2015-01-23 16:20:26
1066
原创 自己学驱动9——uboot代码阅读四(start_armboot函数)
前面分析过在start.S中执行完相关的一些操作之后,会跳转到C语言的部分来执行,跳转到的目标位置就是start_armboot函数,所以现在来看一下这个函数完成了一些什么工作。在这个函数的第一行定义了一个变量如下:init_fnc_t **init_fnc_ptr; 通过查找uboot源码可以得到下面的类型重定义:typedef int (init_fnc_t) (void);
2015-01-23 09:52:38
1054
原创 自己学驱动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
2014-11-23 18:33:05
1481
原创 自己学驱动7——uboot代码阅读二(start.S)
#ifdef CONFIG_USE_IRQ/* IRQ stack memory (calculated at run-time) */.globl IRQ_STACK_STARTIRQ_STACK_START: .word 0x0badc0de/* IRQ stack memory (calculated at run-time) */.globl FIQ
2014-11-23 16:09:09
1345
原创 #ifdef、#if defined、#ifndef的使用
1.#ifdef和#if defined 注意两者都有个define的作用,区别在于使用方式上。前者的通常用法是:#ifdef X ....#else ....#endif 只能在两者中选择是否有定义。对于后者,常用法是:#if defined x1 ....#elif defined x2 ....#elif de
2014-11-21 14:47:45
2155
转载 RS485接口保护电路
下面就是四种RS485防雷保护接地电路原理图,GDT(陶瓷放电管)接地,TVS(瞬态抑制二极管)接地,后端电路的是信号地,大家从图中可以很方便的看到接地的情形。
2014-11-14 10:50:28
7846
1
转载 RS232接口保护电路
●RS232口在通信设备上作为调试用接口,板间通信接口和监控信号接口,传输距离不超过15米。调试用接口使用比较频繁,经常带电插拔,因此接口会收到过电压,过电流的冲击,若不进行保护,很容易将接口芯片损坏 。 ●RS232的接口芯片输出电压一般为±9V,不会超过±12V。因此对接口收发信号线可采用双向瞬态抑制二极管. BS0150MS,限流电阻选100欧姆,一般放在232接口芯片侧,电阻的功率要选
2014-11-14 10:23:43
6576
原创 《C和指针》整理一
1.C语言的注释 在C语言中,如果需要注释掉一段代码,且代码中可能会已经存在/**/注释形式,那么可以使用:#if 0 statements#endif 这种形式来注释掉这段代码(statements代表这段代码)。这样做的原因是C语言不允许嵌套注释,也就是说第一个/*和第一个*/符号之间的内容都被看作注释,不管里面还有多少个/*符号。2.换行符的处理
2014-10-28 10:45:23
1048
原创 《C陷阱和缺陷》整理四
1.assert宏的定义#define assert(e) \ ((void)((e) || _assert_error(__FILE__, __LINE__))) 库里面对这个宏做了这样的定义,当宏参数(或表达式)e为真的时候由||运算符的运算规则会执行_assert_error(__FILE__, __LINE__)从而打印一条报警信息。所以整个表达
2014-10-16 00:26:00
1326
原创 《C陷阱与缺陷》整理三
1.大多数C语言的实现都通过函数main的返回值来告诉操作系统该函数的执行是成功还是失败。典型的处理方案是,返回值为0代表程序执行成功,返回值非0则表示程序执行失败。如果一个程序的main函数并不返回任何值,那么有可能看上去执行失败。所以建议我们的C程序的main函数应该如下编写:int main(){ return 0;}当然如果main函数需要接受参数的话将参数声明加
2014-10-13 14:59:59
1102
原创 《C陷阱与缺陷》整理二
1.在C语言中,我们没有办法将一个数组作为函数参数传递,如果我们使用数组名作为参数,这个时候数组名立刻会被转换为指向该数组的第一个元素的指针。 关于这一点的理解可以向前深入一步,比如定义的数组为int a[3],那么a作为参数传递之后会变为int *类型;如果定义的数组为int a[3][4],那么a作为参数传递之后被变为int (*)[4];如果定义的数组为int a[3][4][5]
2014-10-11 16:24:05
1010
原创 《C陷阱与缺陷》整理一
1.词法分析中的“贪心法” C语言的某些符号,例如/、*和=,只有一个字符长,称为单字符符号。而C语言中的其他符号,例如/*和==,以及标识符等都包含了多个字符,称为多字符符号。当C编译器读入一个字符'/'后又跟了一个字符'*',那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号来对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽
2014-10-11 08:17:01
1237
原创 自己学驱动6——uboot代码阅读一(start.S)
uboot中的start.S文件开头的这段代码:对应的反汇编的结果: 00000000 [0xea000012] b 0x50 00000004 [0xe59ff014] ldr pc,0x00000020 ; = #0x33f80140 00000008 [0xe59ff014] ldr pc,0x00000024 ; = #0x33f801a0
2014-09-30 16:09:19
1239
原创 自己学驱动5——uboot&linux源代码目录结构
●Board:和一些已有开发板相关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。●Common:与体系结构无关的文件,实现各种命令的C文件。 ●CPU:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c和s
2014-09-30 12:44:24
1381
原创 自己学驱动4——SourceInsight代码阅读工具
使用SourceInsight阅读Linux源码1.启动SourceInsight,启动之后因为默认环境没有支持.S汇编代码的阅读,所以需要添加对.S汇编语言的支持。添加方法:Options->Document Options->Document Type选项卡中在File filter中添加.S类型。2.新建一个SourceInsight的项目新建方法:Project->New
2014-09-30 11:43:42
2844
转载 自己学驱动3——ARM-THUMB子程序调用规则ATPCS
ARM-THUMB子程序调用规则ATPCS 为了使C语言程序和汇编程序之间能够互相调用,必须为子程序间的调用制定规则,在ARM处理器中,这个规则被称为ATPCS(ARM-THUMB procedure call standard:ARM-Thumb过程调用标准):ARM程序和Thumb程序中子程序调用的规则,基本的ATPCS规则包括寄存器使用规则、数据栈使用规则、参数传递规则、子程序结果
2014-09-29 11:20:14
1828
原创 C语言指针——指针和数组
先看一个常用的例子:#include int main(void){ int a[3] = {1,2,3}; int *p = a; printf("%d ", p[0]); return 0;} 这段代码编译和运行都没有任何问题,程序会打印出1这个值,但是为什么可以这样用呢?p明明是一个int类型的指针,这里怎么可以使用p[0]这
2014-09-26 09:35:14
1665
原创 C语言指针——指针的运算
说指针之前,先说两个比较不相关的东西,也当做是一种知识的补充。看下面的代码:#include int main(void) { char *s = "Hello world."; printf(s);}运行这段代码,会出现错误吗?如果出现错误,是什么错误? 分析:printf一种常规的用法就是printf("Please input a
2014-09-25 22:31:57
1833
原创 习题五——逻辑智力题
1. 飞机飞行问题 每架飞机只有一个油箱,一箱油可供一架飞机绕地球飞半圈,空中没有加油机,但飞机之间可以相互加油。 问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机? (所有飞机从同一机场起飞,不允许中途降落,必须全部安全返回机场)分析:3架飞机A、B、C同时起飞,同向而行。飞至1/8航程(绕地球一周)处,正好耗去1/4燃油,其中1架飞机A将2×1/4油箱燃油分加至...
2014-09-23 19:26:00
3398
1
转载 网络编程中设计并发服务器,使用多进程与多线程有什么区别?
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?答案一:1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小
2014-09-23 19:07:11
5234
转载 linux进程调度方法简述
在 Linux2.6 中,仍有三种调度策略: SCHED_OTHER、SCHED_FIFO 和 SCHED_RR。 SCHED_ORHER:普通进程,基于优先级进行调度。 SCHED_FIFO:实时进程,实现一种简单的先进先出的调度算法。 SCHED_RR:实时进程,基于时间片的SCHED_FIFO,实时轮流调度算法。 前者是普通进程调度策略,后两者都是实时进程调度策略
2014-09-22 11:10:55
1261
转载 Linux内核态与用户态数据交换方式(二)
本系列文章包括两篇,它们文详细地地介绍了Linux系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与sysfs、 sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体的例子帮助读者掌握这些技术的使 用。本文是该系列文章的第二篇,它介绍了procfs、seq_file、debugfs和relayfs,并结合给出的例子
2014-09-22 09:55:49
1330
转载 Linux内核态与用户态数据交换方式(一)
在Linux下用户空间与内核空间数据交换的方式一 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体的例子帮助读者掌握这些技术的使用。 本文是该系列文章的第一篇,它介绍了内核启动
2014-09-22 09:27:43
5320
原创 ping命令和tracert命令
ping命令 当我们在使用ping命令测试网络是否连通的时候,输出的最后一项一般都是TTL=XX这样的形式,那么TTL到底代表什么呢?TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。所以需要在包中设置这样一个值,包在每经过一个节点,将这个值减1,反复这样操作,
2014-09-21 11:41:39
3527
原创 C语言中的零长度数组使用说明
C语言中的零长度数组用法详解 在C语言中允许在结构体和联合体中定义零长度的数组,写法可以是以下两种:char p[]或者char p[0],这个数组定义在结构体或者联合体中,不占用空间大小。这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移; 2.不占任何空间,指针需要占用int长度空间,空数组不占
2014-09-20 23:35:35
3167
原创 C语言中宏定义使用方法详解
C语言中的宏替换详解首先看一个问题:#include #define PRINT_CLINE() printf("%d", ______)int main(void) { PRINT_CLINE(); PRINT_CLINE(); return 0;}在横线处填上适当的代码,使得上面这段代码的输出为34。
2014-09-20 21:56:45
3636
原创 习题四——数字智力题
1.找出规律并填写:16 96 12;10 () 15分析:这个题网上搜了,但是感觉有一种还是比较靠谱的,就是16*12/2=96,所以10*15/2=75。答案:752. 235 711 131 719 () 931 374 143分析:题目中数字分开来看。2.3.5.7.11.13.17.19……都是是质数,并且括号中应填三位数,那么接下来的应该是23.29,所以答案是
2014-09-18 18:34:02
1522
原创 习题三——C语言笔试题
1.下面的程序片段的输出为?#include #include int main(void){ char str[]="h\t\"\\/\012\00034"; printf("%d", strlen(str));}分析:主要考察的是转义字符和strlen库函数的使用。\t和\"以及\\分别是用\符号表示其后的为转义符,这三个转义符分别为报警符、"和
2014-09-17 11:00:11
2378
原创 C语言中main函数的参数详解
main函数的定义形式 main函数可以不带参数,也可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。所以C99标准中规定只有以下两种定义方式是正确的: int main(void) //无参形式 int main(int argc, char *argv[]) //有参形式
2014-09-17 09:33:55
6418
原创 面试题&笔试题:求1+x+x^2+x^3+...+x^n的和(尽可能少的使用乘法运算)
题目:求1+x+x^2+x^3+...+x^n的和(尽可能少的使用乘法运算)。分析:可以使用折半的方式,每次计算两个的和,比如首先计算出1+x的值保存,然后用保存的这个值乘以x^2可以得到后面两项的值再保存,依次类推直到计算结束。需要注意的是如果n是奇数或者偶数的情况是不同的,当n为奇数的时候就完全按照前面的方法计算即可,但是n为偶数的时候比较麻烦,因为最后一项的计算比较困难,所以当n为偶数的
2014-09-16 20:36:34
22070
1
转载 网络端口号说明
端口号从0~65535一共65536个被分为三类:1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。2) 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的
2014-09-15 15:49:10
982
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人