跳至主要内容

博文

目前显示的是 一月 11, 2009的博文

【转】中断控制器工作原理

中断是计算机的一种基本工作方式,几乎所有的 CPU 都支持中断,S3C4510B 的支持多达 21 个中断源,中断请求可由内部功能模块和外部引脚信号产生。 ARM7 TDMI 核可以识别两种类型的中断:正常中断请求(Normal Interrupt Request,IRQ)和 快速中断请求(Fast Interrupt Request,FIQ),因此,S3C4510B 的所有中断都可以归类为 IRQ 或 FIQ。S3C4510B 的中断控制器对每一个中断源都有一个中断悬挂位(Interrupt Pending Bit)。 S3C4510B 用如下四个寄存器控制中断的产生和对中断进行处理: - 中断优先级寄存器(Interrupt Priority Register):每一个中断源的索引号写入一个预定义的 中断优先级寄存器,以获得特定的优先级。中断优先级预定义为从 0~20。 - 中断模式寄存器(Interrupt Mode Register):为每一个中断源定义中断模式,是 IRQ 还是 FIQ。 - 中断悬挂寄存器(Interrupt Pending Register):指示中断请求处于悬挂状态(未处理)。 如果中断悬挂位被置位,则中断悬挂状态会一直保存,直到 CPU 通过写'1'到中断悬挂寄存器的 相应位清除(注意是写'1'清除,而不是写'0')。当中断悬挂位被置位时,无论中断屏蔽寄存 器是否为'0',中断服务程序都开始执行。在中断服务程序中,必须通过向中断悬挂寄存器的相 应位写'1'来清除中断悬挂标志,以避免由于同一个中断悬挂位导致中断服务程序的反复执行。 - 中断屏蔽寄存器(Interrupt Mask Register):如果中断屏蔽位为'1' 则对应的中断会被禁止,如果中断屏蔽位为'0',则对应的中断请求能正常响应。但如果全局中 断屏蔽位(位 21)为'1',则所有的中断都会被禁止。当有中断请求产生时,对应的中断悬挂位 会被置为'1',在全局中断屏蔽位和对应的中断屏蔽位为'0'时,中断请求就会被响应。 S3C4510B 的中断源(Interrupt Sources)

【转】2440中断控制器部分内容(知识与理解)

2008年04月21日 星期一 04:36 P.M. SRCPND--源中断指示寄存器 则相应的中断源 32位中的每一位对应着一个中断源,每一位被设置为1,则相应的中断源产生中断请求并且等待中断被服务因此这个寄存器表明哪个中断源在等待中断请求被处理。 注意:SRCPND寄存器是自动设置的 。,同时不管INTMSK寄存器中的屏蔽位是否置1.在指定的中断源的服务程序中。SRCPND相应的位必须被清除,这样才可以正确的响应同一中断源的中断请求。如果从ISR返回而没有清除相应的位,也就是说SRCPND中对应的还是1,那么就会一直相应这个中断请求。 如何清除:相应位写1。 INTMOD--中断模式寄存器 32位中的每一位对应一个中断源,当每一位都设置为1,则ARM内核将以FIQ模式相应中断,否则以IRQ模式。 INTPND--中断请求寄存器 32位中的每一位对应着相应的中断请求,经过优先级逻辑后,INTPND寄存器只能有一位被设置为1。并且ARM产生中断请求。在IRQ中断服务程序中能够读取这个寄存器的值来决定32个中断源的哪一个中断被服务。同SRCPND寄存器,在中断服务程序里,这个寄存器的相应为需要被清除。我们可以向INTPND寄存器写一个数据1,来清除寄存器的指定位。 INTMSK--中断屏蔽寄存器 如果相应指定位被设置为1,ARM将不相应中断源的中断请求(注意:即使SRCPND相应为被置位1的条件下也不响应),相反为0时候,则响应。 SUBSRCPND--次级中断指示寄存器 INTSUBMSK--次级中断屏蔽寄存器 下面结合今天学习的红外模块的实验理解中断控制器的相关编程: //红外模块发送测试程序 void Test_IrDA_Tx(void) {     int i;     IrDA_cnt=0;     IrDA_end=0;     IrDAdataFl=(volatile U8 *)IrDABUFFER;// volatile U8 *IrDAdataFl,IrDABUFFER=0x31000000     IrDAdataPt=(volatile U8 *)IrDABUFF...

【转】Makefile学习教程: 跟我一起写 Makefile

作者:陈皓. 来源: http://www.csdn.net Makefile学习教程: 跟我一起写 Makefile 0 Makefile概述 0.1 关于程序的编译和链接 1 Makefile 介绍 1.1 Makefile的规则 1.2 一个示例 1.3 make是如何工作的 1.4 makefile中使用变量 1.5 让make自动推导 1.6 另类风格的makefile 1.7 清空目标文件的规则 2 Makefile 总述 2.1 Makefile里有什么? 2.2Makefile的文件名 2.3 引用其它的Makefile 2.4 环境变量 MAKEFILES 2.5 make的工作方式 3 Makefile书写规则 3.1 规则举例 3.2 规则的语法 3.3 在规则中使用通配符 3.4 文件搜寻 3.5 伪目标 3.6 多目标 3.7 静态模式 3.8 自动生成依赖性 4 Makefile 书写命令 4.1 显示命令 4.2 命令执行 4.3 命令出错 4.4 嵌套执行make 0 Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是――"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提...

【转】用STL快速编写ini配置文件识别类

作者: Winter 用STL快速编写ini配置文件识别类 1 设计需求: 2 设计实现: 3 具体使用 ini文件是技术人员经常用到的一种系统配置方法,如何读取和快速识别ini文件中的内容实现起来比较繁琐。STL强大的功能在于能快速的实现排序、查找、 识别等功能。本文通过STL中的map,string,vector,ifstream等,来快速实现ini文件的识别类class IniFile ? 。IniFile可以实现常见查找功能,并提供完整的源码。 1 设计需求: ini文件的格式一般如下: [section1] key1=value1 key2=value2 ...... [section2] key1=value1 key2=value2 #注释 ...... 实际的例子是: #ini for path [path] dictfile = /home/tmp/dict.dat inputfile= /home/tmp/input.txt outputfile= /home/tmp/output.txt #ini for exe [exe] user= winter //user name passwd= 1234567 #pass word database= mydatabase 其中有五种元素:section 名,Key名,value值,注释 #或者//开头,标志字符"[" "]" "="。查找项的对应关系为sectiong-key和value对应。需要得到是value。class IniFile ? 要实现的是两个函数:读入ini文件,读取sect-key对应的value值。即实现下面的接口: class IniFile{ public: IniFile(); //打开ini文件 bool open(const char* pinipath); //读取value值 const char* read(const char* psect, const char*pkey); }; 2 设计实现: 用ifstream按行读入ini文件的内容 识别每一行的字符串,分析出secti...

【转】详细解说STL hash_map系列

详细解说STL hash_map系列 0 为什么需要hash_map 1 数据结构:hash_map原理 2 hash_map 使用 2.1 一个简单实例 2.2 hash_map 的hash函数 2.3 hash_map 的比较函数 2.4 hash_map 函数 3 相关hash容器 4 其他 4.1 hash_map和map的区别在哪里? 4.2 什么时候需要用hash_map,什么时候需要用map? 4.3 如何在hash_map中加入自己定义的类型? 4.4如何用hash_map替换程序中已有的map容器? 4.5为什么hash_map不是标准的? 4.6 有学习使用hash_map的建议吗? 5 参考文章: 条条大路通罗马,为什么你不随便选一条? 0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑 张三丰-武当掌门人,太极拳创始人 东方不败-第一高手,葵花宝典 ... 这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按照名字一个一个比较。如果要速度快,就需要把这些记录按照字母顺序排列,然后按照二分法查找。但是增加记录的时候同时需要保持记录有序,因此需要插入排序。考虑到效率,这就需要用到二叉树。讲下去会没完没了,如果你使用STL 的map容器,你可以非常方便的实现这个功能,而不用关心其细节。关于map的数据结构细节,感兴趣的朋友可以参看 学习STL map, STL set之数据结构基础 。看看map的实现: #include <map> #include <string> using namespace std; ... map<string, string> namemap; //增加。。。 namemap[" 岳不群 "]=" 华山派掌门人,人称君子剑 "; namemap[" 张三丰 "]=" 武...

【转】学习STL map, STL set之数据结构基础

作者: winter 摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set选择问题,并分析了map, set的优势之处。对于希望深入学习STL和希望了解STL map等关联容器底层数据结构的朋友来说,有一定的参考价值。 STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 为何map和set的插入删除效率比用其他序列容器高? 为何每次insert之后,以前保存的iterator不会失效? 为何map和set不能像vector一样有个reserve函数来预分配数据? 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何? 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树 的统计性能要好于 一般的 平衡二叉树 (有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树) ,所以被STL选择作为了关联容器的内部结构。本文并不会介绍详细AVL树和RB树的实现以及他们的优劣,关于RB树的详细实现参看 红黑树: 理论与实现(理论篇) 。本文针对开始提出的几个问题的回答,来向大家简单介绍map和set的底层数据结构。 为何map和set的插入删除效率比用其他序列容器高? 大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。说对了,确实如此。map和set容器内所有元素都是以节点的方式来存储,...

【转】C++的iostream标准库介绍

作者:管宁 C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 strstream: ostrstream 和 istrstream 4 stringstream 5 io_state 输入/输出的状态标志 0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。   iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。   为什么说要扩展才能提供支持呢?我们来一个示例。 #include <stdio.h> #include <iostream> using namespace std; class Test { public : Test( int a=0, int b=0) { Test::a=a; Test::b=b; } int a; int b; }; int main() { Test t(100,50); printf(" %??? ",t); //不明确的输出格式 scanf(" %??? ",t); //不明确的输入格式 cout<<t<<endl; //同样不够明确 cin>>t; //同样不够明确 system(" pause "); }   由于自定义类的特殊性,在上面的代码中,无论...