EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/7/8 12:40:14

71

关于投票

基于STM32的教学楼智能灯光控制系统

STM32项目/学习计划表

项目名称  教学楼智能灯光控制系统
请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。http://space.ednchina.com/member/Register.aspx
联系方式
(邮箱/电话)
为了保证用户隐私,此处已被隐藏
预计实施时间 自  7月8日 到8月8日 计划参加人数  2
背景描述 该计划的背景及其实现的目的、意义
 步入21世纪,节约能源问题越来越深入人们的意识范围,为了节约能源,节省设备,实现智能化管理,就想出了基于STM32的智能教学楼灯光控制管理系统。
功能描述 详细描述该项目能够实现的功能
 系统通过光敏电阻将光强转化为电压信号,经过AD转换成数字信号,送到控制器分析得到光线强度;通过红外传感器判断教室内部人数,根据光线强度和人数,系统给出相应的开关动作,实现以指令方式对教学楼照明的总体控制。
解决办法 预计会遇到的困难和相应的解决办法

 红外传感器判断教室内部人数是本系统的一个难题。

解决办法:先假定开门前教室内人数为零,开门后用红外判断有人进出教室的情况来判断教室人数的多少。

预期效果 开发项目:预期要解决的问题、达到的经济效益和产品所需数量;
学习项目:希望学到的知识或技能,达到哪些实践的目的等。
 如果成功的话,将会为一些高校教学方面节省大量的电力能源。本人也会从整体上完成一个项目,学会了时间安排,培养独立解决问题的能力。
时间安排 日  期 进    度    描    述
 7.8到7.12  整体规划,原理图设计
 7.13到7.22  PCB设计,部分功能调试
 7.23到8.8  编写系统程序,系统调试
总结  
备  注

签名:戴求淼           时间:2008.7.8

系统分类: 单片机  |  用户分类: ARM/linux  |  标签: 灯光控制  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(12260) | 回复(37)

发表于 2008/4/1 22:09:16

2

关于投票

linux的“快捷方式”---link

       对应英文版:   http://blog.ednchina.com/likee/100986/message.aspx

 

Windows下面有快捷方式,那么linux下面有没有与之相对应的东东呢?如果有,那又是什么呢?回答是肯定有的!这就是linux下面的linkLink的功能不少,它主要分为hard link 还有symbolic links

一、Hard Links

由上一节我们知道:当linux系统要去读取某一个档案的时候,就会先去读取inode table,因为它要知道去哪里读取信息呢!而恰恰inode table中就记载了这些信息。然后再根据inode上的信息去block area上去将数据读出来利用。

Hard link就是直接再建立一个inode连结到档案放置的block区块,这只是一个映射的意思,真正档案上的东西是不会变的。所以,要查询的时候,不管你利用原来的inode还是利用后来建立的inode都可以被指向这个档案存放的位置。也就是说两个指向会完全一样的。取任意一个inode读取都行的。但是,这样一来会有问题,因为inode是会连续到block区域去的,而目录本身仅仅消耗inode而已,这样一来的话,hard link就不能link目录了。所以,Hard link有两个限制:

1、  不能跨filesystem,因为不同的filesystem有不同的inode table

2、  不能link目录!

二、symbolic links

symbolic linksHard link不同的是,它会建立一个独立的档案,而这样档案会让数据读取指向他link的那个档案内容,这样比较好理解一些。因为这个档案是指向要读取的内容的,所以,如果原来的档案被删除的话,那么symbolic links肯定不知道指向哪里了啦!所以symbolic links也会打不开。会一直说:无法打开某档案。

那是不是hard link会比较安全?从某种意义上来讲是的,因为它有两个inode,某一个被杀掉后,只要有一个在,那个档案就还会在。但是我们前面主闻,Harkd link的限制太多了,所以在用途上有比较多的限制。反而symbolic links的用途比较广泛。下面我们就以实例来说明一下:

/root下建立一个test文件夹:

点击看大图

 

建立hard link后的信息为:

 

 

建立symbol link的信息为:

 

 

删除原文件后两个link的反应为:

 

说明:

要注意一下,如果没有加任何参数的话,那么默认就是Hard Link,像上面说明的情况一样,增加了hard link后,可以发现link那一栏的属性增加了。而如果这样时候不要那个passwd会怎么样呢?这样的话,passwd-hard的内容还会同原来的passwd一样,但是呢,passwd-soft就找不到该档案了。

但是使用-s参数时,就做成差不多是windows底下的快捷方式的意思了(这就是symbolic link了,很常用的。)但是,需要注意:linux linkwindows的快捷方式有一样不同,就是,如果在windows下面建立一个快捷方式的时候,你可以改变这样快捷方式的内容,修改任何数据,而你的原始数据,也就是快捷方式所指向的内容不会跟着变。但是,如果你修改linux下的link档案时,那么它的原始档案也会跟着变哦。呵呵。所以不论你的这个原始档会被连续到哪里去,只要你修改了连结档,原始档就会跟着变的哦。以上面为例,由于你使用-s的参数建立一个名为passwd-soft的档案,如果你修改了passwd-soft时,其内容与passwd完全相同,并且,如果修改后你存储了的话,被改变的将是passwd这个档案。

如果你做了下面这个连结:

Ln –s /bin/root/bin

那么,如果你进入/root/bin这个目录下(注意:该目录其实是/bin这个目录,因为我们做了连结档了),所以,如果我们进入/root/bin这个刚刚建立的连结目录,并将其实的数据杀掉的时候,/bin下面的数据就会通通不见了!哈哈,所以说,并不是/root下面的资料都是root哦。还需要注意一下它的属性呢·!

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: link linux  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2122) | 回复(1)

发表于 2008/3/14 15:47:04

4

关于投票

Linux中的inode

在理解Link前,我们先要了解inode这个名词的概念(因为下一篇打算讲linux的“快捷方式”--Link)。而在这之前,先理解一下硬盘的一些基本知识先。

硬盘是一种采用磁介质的数据存储设备,数据存储在密封于洁净的硬盘驱动器内腔的若干个磁盘片上。这些盘片一般是在以铝为主要成分的片基表面涂上磁性介质所形成,在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector),数据就按扇区存放在硬盘上(所以扇区是硬盘的最小单位啦!它一般是512byte)。在每一面上都相应地有一个读写磁头(head),所以不同磁头的所有相同位置的磁道就构成了所谓的柱面(cylinder)。传统的硬盘读写都是以柱面、磁头、扇区为寻址方式的(CHS寻址)。硬盘在上电后保持高速旋转(5400/min以上,现在基本上都达到7200/min了吧?),位于磁头臂上的磁头悬浮在磁盘表面,可以通过步进电机在不同柱面之间移动,对不同的柱面进行读写。所以在上电期间如果硬盘受到剧烈振荡,磁盘表面就容易被划伤,磁头也容易损坏,这都将给盘上存储的数据带来灾难性的后果(这也是我们平时装配电脑的时候将硬盘安装在机箱内的位置越低也好的原因)。

    硬盘的示意图如下:

点击开大图

我们现在知道硬盘的大体结构了。那么怎么样进行硬盘分割呢?我们在进行硬盘分割的时候,最小都是以磁柱为单位进行分割的,那么分割完成之后自然就是格式化( format ),在 Linux 里面我们在进行格式化的时候必须要考虑到 Block inode 的信息,这个 block 还好理解,他是我们磁盘可以记录的最小单位,是由数个 sector 所组成的,所以

他的大小通常为 n*512 bytes ,例如 4K 。那么 inode 是什么? Block 是记录档案内容数据的地区,而 inode 则是记录该档案的属性、及该档案放置在哪一个 Block 之内的信息!所以,每个档案都会占用到至少一个 inode 。而当我们 Linux 系统要找到这个档案时,他会先去搜寻 inode table 找到这个档案的属性及数据放置的地区,然后再到数据库去找到数据存放的 Block 进而将数据取出利用。这个 inode 数目在一开始就会被设定好,他的设定方式通常是利用硬盘大小 / 一个容量,这个容量至少应该比 Block 要大一些较佳,例如刚刚的 Block 订为 4K ,那么 inode 可以订为 8K 左右。所以,一颗 1GB 的硬盘,如果以 8K 来规划他的 inode 数时,他的 inode 就会有 131072 inode 啦!而一个 inode的大小为 128 bytes 这么大!这么一来的话,我们就可以清楚的知道了,那就是一个 partition 格式化为一个 filesystem 之后,他一定会有 inode table data area 两个区块,一个用来记录档案的信息与该档案放置的 block 区块,一个用来记录档案的内容!

   由于我们 Linux 在读取数据的时候,是先查询 inode table 以得到数据是放在那个 Block 里面,然后再去该 Block 里面读取真正的数据内容!然后,那个 block 是我们在格式化硬盘的时候规定出来的一个值,这个 block 是由 2 n 次方个sector 所集结而成的!所以,他是 0.5K 的倍数。假设我们 block 规划为 4KBytes 好了,那么由于一个 inode 与一个block 最多均只纪录一个档案,所以,哈哈!如果你的一个档案有 0.1 K bytes 这么大时,但是,由于你的 block4K bytes ,因此,你就会有 3.9 Kbytes 的空间“浪费掉”!所以,当你在格式化硬盘的时候,请千万注意到您的系统的使用范围。

  1block 越小 ( 最小为 0.5K ) inodes 越多,可利用空间越多,但是大档案写入效率较差:适合档案数量多但是

档案容量小的系统,例如 BBS 或者新闻群组 news 这方面的服务之系统;

2block 越大 ( 最大可到 16 * 0.5K 以上 ) inodes 数越少,大档案写入效率较佳,但浪费的空间较多:适合档案容量大的系统。

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: inode Linux  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1474) | 回复(0)

发表于 2008/3/9 20:30:09

6

关于投票

虚拟机下linux上网设置指南:

       本文以Fedora为例,例举安装在虚拟机Vmware下linux下IP设置的问题。

       在虚拟机下,点击:Ethernet,如下图:

       点击开大图

    出现如下对话框:

点击开大图

device status选第二个,connect at power on.  Net connection有四个选项,第一个的意思是说独立一个IP地址,如果您的电脑上有两个网卡的话,或者你的windows不需要上网的话,可以选项第一个。但是最好的还是选项第二个。第二个选项的意思就是:与主要共享一个IP地址,这样的话,只要主机同意将它的IP地址同这个linux共享的话,这样主机和虚拟机都可以上网。建立大多数用户采用这一种。第三个选项的意思是:自己的私有网络与主机共享。第四个的意思是虚拟网络。暂时我没有用到。

        设置完后,然后在windows下面的网上邻居下,点击“右键---属性”,出现以下对话框:

点击看大图

再在本地连接上,点击:“右键---属性”,出现以下对话框:

点击开大图

选中高级选项,在internet连接共享中的“允许其它网络用户通过此计算机的internet连接来连接”,再在下拉选项中选中:“VMware Network Adapter VMnet8”,再确定!

       好啦,启动linux下的浏览器,是不是可以上网啦?哈哈~~~~~~~

 

 

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: linux 网络  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3815) | 回复(0)

发表于 2008/1/15 19:49:32

10

关于投票

ucos源码中文注释版问世!

源码下载:rar

经过likee同学的辛勤劳动,终于将它简单地写成中文注释。由于时间比较匆忙,肯定有不足之处。如果各位朋友发现有什么错误,请在我blog中留言,我们一起探讨。谢谢!

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: ucos  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(6792) | 回复(23)

发表于 2008/1/5 11:48:58

3

关于投票

uC/OS之就绪表知识

就绪是什么呢?它就是一切准备就绪了,准备运行了。任务一旦建立,它就会进入了就绪态(task ready),准备运行了。任务的建立可以是在多任务运行开始之前,也可以动态地由一个运行着的任务建立。

那么,如果有多个任务就绪,那怎么办呢?这就牵涉到了就绪表的问题了。就绪表(ready list)在存放就绪任务的。就绪表中有两个变量,OSRdyGrpOSRdyTbl[]。因为任务最多一般只能是64个,Jean J.Labrosse 就把就绪表分成8*8的一个矩阵形表(table),这样就刚好能存放64个就绪的任务了。下面表格里面的数字代表优先级。那么,OSRdyGrpOSRdyTbl[]又代表什么呢?

 

见上图,作者见任务太多,就按优先级将它分成了八组,每一行作为一组,每组八个任务,(也即按Y坐标分组)。而OSRdyGrp是一个有八位二进制数的数,它的每一位代表一个组。比如:OSRdyGrp的第0位代表了第一行07这八个优先级。第一位代表了815这八个优先级,以此类推。只要哪一组中的任何一位置位(即哪一组中有任何一个任务进入就绪表),那么OSRdyGrp相应的位就置1。比如:第一行中优先级07,只要有一个任务进入就绪表,那么OSRdyGrp的第0位就会置1(有更多任务进入就绪表也会置1),表示这一行中有任务进入就绪表啦,但是有多少呢?不知道!

那不知道,怎么办呢?这就要看OSRdyTbl[]了。先来介绍一个掩码的知识:ucos里面有一个数组,叫OSMapTbl[],它来帮助我们查一个任务是否进入优先级。

具体如下:

OSMapTbl[]的下标

OSMapTbl[](即位掩码)

0

00000001

1

00000010

2

00000100

3

00001000

4

00010000

5

00100000

6

01000000

7

10000000

我们来看,一个任务优先级将它化成二进制数,它的低三位与它在哪一组没有任务关系!因为逢八才换组,而低三位最大才是七!但它能决定这个任务在一组的某个地方(即能决定X的值)而它的接下去三位与它在一组中的哪个位置没有任何关系!因为去掉低三位,接下去三位始终是八的倍数,始终指向组的首地址!但它能决定Y的值!这样,在一个矩阵中,X的值和Y的值都决定了,那么这个任务所在的位置就决定了。这样,使一个任务进入就绪状态和脱离就绪状态也就简单了。

其实我们不用这么麻烦,我们看,我们可以把表中的数看成是八进制的数,低三位看成是个位,接下来三位看成是进位,进位代表OSRdyGrp,个位代表OSRdyTbl[],个位无论怎么变,它都不会影响进位的位置,所以在哪一行只取决于OSRdyGrp,在哪一列只取决于OSRdyTbl[],口算也算出来了,呵呵。这样比较好理解一些。

这里可能大家有疑问:那不只取了优先级的六位吗?还有两位呢?这个不用着急,还有两位为零!因为最大才63,只需要用到六位,如果最高两位有任何一位为一的话,就会出错。所以我们就不用管最高两位了。

使任务进入就绪状态的程序为:

OSRdyGrp             |= OSMapTbl[prio>>3];//确定它的行,置1

OSRdyTbl[prio>>3]     |=OSMapTbl[prio&0x07];//确定它的列,置1

 

找出进入就绪态的俦优先级最高的任务

明白了上面的内容,这里也不难明白了。这里作者Jean J.Labrosse 提供了一个查找表的,只要按照一定算法查找,很快就查出来了。

代码为:y = OSUnMapTbl[OSRdyGrp];

       x= OSUnMapTbl[OSRdyTbl[y]];

       prio = y<<3 +x;

这个表为:

右边注释的值是代表OSRdyGrp的值。如果OSRdyGrp的值为01101000,即0x68,那么,我们可以根据右边的注释,要查第七行。是第七行的第八个(从0开始)。是3。再代入程序,算出x2,将xy 代入prio = y<<3 +x;,算出最高为26,再根据这个值,查出任务控制块优先级表,得到该任务的任务控制块。

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: ucos 嵌入式 就绪表  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2176) | 回复(0)

发表于 2008/1/4 11:32:35

5

关于投票

uC/OS之任务管理

uC/OS的任务要么是一个无限的循环,也可以在执行一次后被删除掉。要注意的是,这里所说的任务删除,并不是任务的代码被删除了,而是uC/OS不再去理它了,所以该任务代码不会再运行了。在uC/OS中,有一个代表任务优先级的值,这个值在每个任务中是不相同的。值越低,它代表任务的优先级越高,它在就绪表中排得越靠前。

1、   建立任务:任务的建立可以在多任务调度之前建立,也可以在运行其它任务的时候         建立,但是,在多任务调度之前,必须要至少有已经建立了一个任务,否则系统被崩溃。还  要注意的是任务不能在中断服务程序中建立。建立任务时,系统会首先检测用户指定的优先级是否合理(是不是超过最大值,是否与已创建任务重复等),如果合理,放置一个标记,说明这个优先级我已经占用了,其它任务不能抢我这个优先级了。再给这个任务建立一个任务堆栈,(堆栈可以由上往下减,也可以由下往上增,具体见参数如何设置),如果堆栈成功建立的话,就从空闲的任务控制块缓冲池中获得一块任务控制块OS_PCB,然后任务就成功了,这个时候,相关函数会返回信息,任务建立函数会检查返回信息,如果任务建立成功的话,会将任务计数器加一。如果失败,则返回失败信息,放弃此优先级,表明,别人任务可以来抢这个优先级了。

2、              堆栈检验:有时候,比如内存有限的情况下,确定任务实际需要的堆栈空间大小是比较有必要的,这样可以避免为任务分配过多的栈空间。注意:如果需要堆栈检验,那么在任务建立的时候,堆栈中存储必须是0。而且要检验堆栈的任务必须要存在,还要允许检验堆栈!这些长期保持都满足时,就可以检验了:当堆栈是从高内存地址向低地址存储的时候,我们就从低地址开始检验,直到发现存储值不为0的堆栈入口为止(因为堆栈是连续存储的)。而已用的堆栈就是堆栈大小减去空闲的堆栈。然后将所得到的信息保存。

应该要使自己的应用程序运行足够长的时间,并经历最坏的堆栈使用情况,这样才能得到正确的数目。一旦堆栈检测提供最坏情况的堆栈需求,就可以重新设置堆栈最终的大小了。为了系统升级和扩展,应该多分配10%100%的堆栈空间。

3、               删除任务:首先要明白的是,任务删除了,并不是把代码给删了,而是使任务进入了休眠状态,不再理会它了。而且不允许在中断服务程序中删除任务,也不允许删除空闲任务,但可以删除统计任务和任务自己。在删除任务的时候,要首先保证要删除的任务存在,否则没有办法删除。再分几种情况讨论,如果要删除的任务在就绪表中,就要从就绪表中删除,如果在等待列表中,就要从等待列表中删除。如果在事件标志等待表中,也要从此表中删除。这个时候删除任务要保证其它任务或者ISR不会让该任务重新开始执行,这个时候,任务要释放或者删除自定义的TCB,还要将任务计数器减一,再把被删除任务的TCB的指针指向NULL,再把OS_TCB双向链表中的被删任务的TCB去除。退回到空闲TCB中,供其它任务使用。最后还要进行任务调度。

4、               请求删除任务:如果一任务正在占有一些内存缓冲区或者信号量一类资源,就时,另一任务想删除该任务,那么这么占有的资源就会因为没有释放而丢失了,导致了存储器有了漏洞,这样会导致系统崩溃。这些情况下,我们应该让这个任务用完资源释放后,再删除自己。

5、               任务删除自己:当被删除的任务释放完它所有的资源时,就在删除任务中将优先级设置为自己,这样就会删除自己了。要保证任务不能是空闲任务,且要保证请求删除任务的优先级是有效的。且此任务存在。

6、               改变任务的优先级:在改变前要检验,不能改变空闲任务的优先级,且要保证新旧优先级都要合法且不能已经被别的任务占有。如果要指定的新优先级空闲,则要保留这个优先级,防止过程中有别的任务来抢。这样,再释放旧的优先级,可以被其它任务用。再检查要改变优先级的任务是不是在就绪表中或者在等待信号量等,如果是,要将它从就绪表或者等待列表中移除,将任务的TCB保存,新的优先级也保存。完成这些步骤后,如果新优先级高于旧优先级,或者新优先级高于调用本函数的任务的优先级,任务调度将调用。

7、               任务挂起:不能挂起空闲任务,但可以挂起当前任务。要保证要挂起的任务是存在的。挂起的方法是操作任务控制块,置位它的挂起位。如果任务在就绪表中,就要从表中去除,如果等待或者延时,就将延时清零,再置位挂起位。挂起后,只有在被挂起任务是调用本函数的任务本身,才需要任务调度。

8、               恢复任务:首先要检验不是空闲任务,再清除挂起位,延时清零,只有保证这两点,任务才处于就绪状态。再调用任务调度程序。

9、               获得任务信息:应用程序可以调用此函数来获得自身或者其它应用程序的信息,注意,包括空闲任务!获得指定任务的任务控制块的拷贝。要十分小心地处理OS_TCB指向其它任务控制块的指针,不要试图改变这些指针!总是来说,它是一个有用的调试工具。

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: ucos 嵌入式 任务管理  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1672) | 回复(1)

发表于 2007/12/30 12:00:17

4

关于投票

一步一步讲解keil for arm 的RV编译方法

我们知道,keil for arm中有几种不同的编译环境,比如:GNURVCARM等等。相对来说,CARM版用起来比较方便。但是自从keil for arm 3.03版本开始,keil for arm便不支持CARM编译环境了。只支持RV编译环境。下面介绍一下keil for armRV环境下建立工程的方法。

首先,打开projectà new project 建立一个新工程,输入工程名,然后保存。

 

保存后,自动跳出选择器件对话框,选好器件后,单击“确定”。

 

然后问你是不是要添加启动代码,单击“是”。

 

然后点击那个彩色品字形按钮(见下图):

 

 

选择“floders/extensions”界面,再选择“use realview compiler”。单击“确定”。

再选择“projectàoptions for target ‘target 1’”。

 

弹出以下界面:

 

 

在此界面中选择“output”界面,(在3.033.04版中选择“user”界面)。

在下面栏中输入以下内容:

 

其中那个E:\software\keil\ARM\BIN30\fromelf.exe 是用户自己安装keil for arm的实际路径,要用户自己根据自己的安装路径选择。后面是工程生成的axf文件,文件名一般是工程名,后面的.axf是扩展名。后面要加一个“-z”,表示可以编译一下产生编译资源占用信息了。

要记住,那个Run User Program #1前面的钩要打上。

编译信息如下:

 

RV编译环境对语法要求更为严格,比如:在任何C文件的结尾要留一个空行,否则有警告:my_type.h(32): warning:  #1-D: last line of file ends without a newline

还有main函数用void会出现警告:

main.c(48): warning:  #951-D: return type of function "main" must be "int"

在对AduC系列ARM编译的时候会出现问题。LPC的可以正常使用。我查过,AduC系列的ARMRV环境下没有startup.s这样文件,但是LPC中的有,我不知道是怎么回事。应该就是这个原因。

 

 

系统分类: 嵌入式  |  用户分类: ARM/linux  |  标签: keil for arm CARM RV 编译  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(4609) | 回复(9)

发表于 2007/12/13 22:06:33

4

关于投票

HEX格式内容含义

HEX文件格式是我们经常遇到的一种文件格式,因为几乎所有的编程烧录文件都为HEX格式。

首先,HEX文件中是包含了地址信息的。这和BIN文件不同,BIN文件中只包含了数据信息。所以我们在烧写或者下载HEX文件的时候,一般不需要我们指定地址,但是在烧写BIN文件的时候,用户是一定要指定地址信息的。

二、HEX文件都是由记录组成的。它的每一行都是一个记录来的。它是由任意数量的十六进制数组成。每个记录包含五个域,它们以以下格式排列的:

aabbbbcc[dd…]ee

上面每一组不同的字母代表不同的一个域,每个字母代表一个十六进制的数字,每一个域至少由两个十六进制编码数字组成,每两个十六进制编码数字组成一个字节。具体描述如下:

1、  每个HEX记录都由冒号开头;

2、  aa表示这个记录中的数据长度域,它代表记录当中数据字节[dd…]的字节数量。

3、  bbbb是地址域,它代表记录当中数据的起始地址。

4、  cc 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 –
数据记录
01 –
文件结束记录
02 –
扩展段地址记录
04 –
扩展线性地址记录

5、  dd 是数据域,它代表一个字节的数据,一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域(aa)中指定的数字相符。

6、  ee 是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。

比如:前面AduC7026LED实验中的HEX文件内容为:

:020000040008F2                              。。。。。。。。。。。。。。。。。。。  1

:1000000018F09FE518F09FE518F09FE518F09FE5C0  。。。。。。。。。。。。。。。。。。。  2

:1000100018F09FE50000A0E118F09FE518F09FE5BB

:100020004000080074030800700308006C03080017

:100030006803080000000000640308006003080073

:1000400078009FE50110A0E3041480E50110A0E30F

:10005000081480E5F410A0E30C1480E560009FE52F

:10006000DBF021E300D0A0E1040040E2D7F021E37F

:1000700000D0A0E1040040E2D1F021E300D0A0E1F3

:10008000040040E2D2F021E300D0A0E1800040E291

:10009000D3F021E300D0A0E1040040E210F021E31E

:1000A00000D0A0E11C009FE5010010E318E09F05CF

:1000B00018E09F1510FF2FE1FEFFFFEAFEE7C046A4

:1000C0000000FFFF900401003D010800B800080097

:1000D000BD0008000000000000000000000000005B

:1000E00000000000AA2108480160012107480160C2

:1000F0005522074802600748016000210648016058

:10010000F4210648016070471004FFFF1404FFFF4C

:100110001804FFFF0404FFFF0804FFFF0C04FFFFA7

:1001200004E005490A1C0139002AFBD1011C0138F1

:100130000029F6D17047C046E8030000664806C8AB

:100140000B1C134305D000230B70491C9142FBD1BB

:10015000F5E76248C01C0323984306C80B1C1343F1

:1001600006D00378401C0B70491C9142F9D1F1E78D

:1001700000B5FFF7B7FFF0235948016899430160C4

:10018000584A59480168114301600F2457480168D3

:10019000A1430160564C5748016821430160534810

:1001A0000168994301605348016811430160524A54

:1001B0004E48016891430160504A4E48016811431E

:1001C00001604F4A49480168914301604D4A4948DE

:1001D0000168114301604C4A4C4801689143016039

:1001E0004B4A4C480168114301604B4A474801683B

:1001F00091430160494A4748016811430160484AF8

:100200004248016891430160464A424801681143EF

:1002100001604549454801604548FFF781FF454970

:10022000454801604248FFF77BFF3F494248016073

:100230003F48FFF775FF41493F4801603C48FFF7E1

:100240006FFF3F493C4801603948FFF769FF3D496E

:100250003D4801603648FFF763FF3C493A4801607A

:100260003348FFF75DFF3A49374801603048FFF7F0

:1002700057FF2D49374801602D48FFF751FF2D49A1

:10028000354801602A48FFF74BFF27493248016093

:100290002748FFF745FF29492F4801602448FFF709

:1002A0003FFF27492C4801602148FFF739FF2549C6

:1002B0002A4801601E48FFF733FF244927480160A0

:1002C0001B48FFF72DFF2249244801601848FFF71B

:1002D00027FF9EE700BDC046D4000800DC000800F0

:1002E00000F4FFFF0000000220F4FFFF0CF4FFFF0A

:1002F0000000000150F4FFFF000F000000000004A8

:1003000000F000000000000800000F0008F4FFFFEC

:100310000000001040F4FFFF0000F000000000208B

:100320000000000F000000400000020024F4FFFF66

:100330002C0100000000010054F4FFFF0000040045

:10034000000008000000100044F4FFFF000020003F

:100350000000400028F4FFFF58F4FFFF48F4FFFFBF

:10036000FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEAF5

:08037000FEFFFFEAFEFFFFEAB9

:00000001FF

它的第二行为::1000000018F09FE518F09FE518F09FE518F09FE5C0容易知道:

它的ee为:C0,计算过程如下:

C0=0x01+ not(0x10+0x00+0x00+0x00+0x18+0xF0+…+0xE5)

文件结束(EOF)记录
Intel HEX
文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下:
:00000001FF
其中:
00
是记录当中数据字节的数量。
0000
是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的。0000h是典型的地址。
01
是记录类型 01(文件结束记录)
FF
是这个记录的校验和,计算方法如下:
01h + NOT(00h + 00h + 00h + 01h).

扩展线性地址记录(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16.扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC
其中:
02
是这个记录当中数据字节的数量.
0000
是地址域,对于扩展线性地址记录,这个域总是0000.
04
是记录类型 04(扩展线性地址记录)
FFFF
是地址的高16.
FC
是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址                              2462
扩展线性地址记录的数据域                      + FFFF
                                  ------------
绝对存储器地址                               FFFF2462

扩展段地址记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下:
:020000021200EA
其中:
02
是记录当中数据字节的数量.
0000
是地址域.对于扩展段地址记录,这个域总是0000.
02
是记录类型 02(扩展段地址记录)
1200
是地址段.
EA
是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址                             2462
扩展段地址记录数据域                      +  1200
                                 ---------
绝对存储器地址                    00014462




系统分类: 单片机  |  用户分类: ARM/linux  |  标签: HEX  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2248) | 回复(1)

发表于 2007/11/23 19:18:41

4

关于投票

ADuC7026之按键处理

基本是按照圈圈的来的。

rar

系统分类: ARM  |  用户分类: ARM/linux  |  标签: 按键处理  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(897) | 回复(0)

发表于 2007/11/23 19:10:00

4

关于投票

ADuC7026实验之PWM

代码下载:rar

下图显示了PWMDAT0为OXFFFF时,对应PWM最小频率为344Hz。

点击看大图

系统分类: ARM  |  用户分类: ARM/linux  |  标签: PWM  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1656) | 回复(0)

发表于 2007/11/23 19:04:16

3

关于投票

ADuC7026之DA实验

原代码下载:rar

编译完成后,接图示操作,就可以用纯软件仿真了。

点击看大图

系统分类: ARM  |  用户分类: ARM/linux  |  标签: DAC  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1031) | 回复(0)

发表于 2007/11/23 18:52:53

3

关于投票

ADuC的AD转换实验

偶的ADuC7026的实验的代码大多数有圈圈的代码,因为我发现我写的没有他的完美,所以保留了他的大部分代码。

代码下载:rar

点击看大图

系统分类: ARM  |  用户分类: ARM/linux  |  标签: ADC  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1320) | 回复(0)

发表于 2007/11/23 18:45:12

2

关于投票

ADuC7026_串口实验

里面的一些代码是按照圈圈来的,发现圈圈的一些代码写得真是太好了。通俗易懂!

原代码下载:rar

点击看大图点击看大图

 

 

 

系统分类: ARM  |  用户分类: ARM/linux  |  标签: ARM 串口  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1052) | 回复(0)

Total , Page /