《如何让led发光》.doc

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《如何让led发光》.doc

额思路: 不按datasheet介绍,从实战出发,以例子为基础讲解概念 ? ? 第一章 无论学习一门语言还是一个新的平台上开始开发,从最简单的例子入手总是最容易的,比如C语言学习中的HelloWorld程序,一个简单的例子,不但可以消除接触新语言新平台的恐惧感,而且可以用最小的代价,完成一个从源程序到最终运转的实际应用。和语言学习一样,在Arm平台上的嵌入式开发,我们也遵循这个步骤,从一个打印出的HelloWorld的应用开始,进入到嵌入式开发的世界。 相比一门语言的HelloWorld,Arm平台的HelloWorld要略显复杂一些。以Linux平台的C语言HelloWorld程序为例,我们只需要选用正确的编译工具,编译下面的程序,生成一个可执行文件,然后运行这个程序,就会在屏幕上打出“HelloWorld”。 #include stdio.h int main() { ????printf(“HelloWorld\n”); ????return 0; } 嵌入式平台的HelloWorld,不是在一个现成的操作系统上运行的单纯程序,因此不但要保成程序的正确性,能编译生成可执行文件,更重要的是在程序运行前,必须要做一系列的准备工作。反过来说,即使生成了可执行文件,如果没有和硬件的配置匹配的话,也是不可能在嵌入式平台上正确的运行的。 这一章的目标就是从一个C语言的HelloWorld为基础,打造一个能在嵌入式平台上运转的Helloworld开始,一步一步的扩展功能,最后目标是能将得到广泛应用的bootloader U-boot移植到我们的开发板上。 第一节 嵌入平台的HelloWorld 嵌入式应用程序简介 由于我们是在一个没有操作系统的ARM嵌入式平台上开发,因此,和一般操作系统上的C语言程序不同,程序的执行并不是从main函数开始的。根据ARM CPU的式样,在CPU上电启动后的第一个动作就是硬件复位(Reset),当复位完成以后,CPU会发出一个复位异常(Reset Excepton),伴随着这个复位异常,CPU就会到0开始的地址去读取可执行代码。那么如果我们有办法把main函数放到0地址,是不是就可以上电以后就直接执行C语言的main函数了呢?的确,是有办法把main函数放到0开始的地址上的。但是仅有这些是不够的,根据ARM CPU的式样,ARM系统具有8种异常,如表1-1所示,分别对应8种不同的异常原因,我们刚才提到的复位异常只是其中的一种,对应这些异常,一共有8个异常向量与之相对应,也就是说当某一种异常发生的时候,CPU会自动跳转到这个向量所对应的地址上去,执行预先放到这个地址里的代码。那么显而易见,这些异常响亮必须放到某个预先规定好的地方。对于ARM CPU来说,这个地址固定在从0开始的4*8=32字节的地址上。由于每个异常向量只能占有4个字节的位置,要想放下这个异常所对应处理的全部代码是不可能的,实际上4个字节只够ARM CPU的一条机器指令,我们唯一的选择就是在这里放一条跳转指令,跳转的目的地才是真正的异常处理程序的地址。总结一下上面所提到的式样,我们发现ARM嵌入平台的入口代码必须满足下面这些要求: 1. 从0开始的32个字节必须放置8种异常对应的异常处理代码 2. 每个异常处理代码只有4个字节空间,因此必须放入跳转指令 3. 0字节开始第一个指令对应系统的复位异常处理 而C语言写出的程序,显然不可能精确到机器指令单位。对上述要求来说,唯一的选择就是用汇编语言来实现入口代码。 除此之外,在调用C语言函数之前,必须设定好堆栈指针,这也必须用汇编语言来实现。 对于一个只有C语言编程经验的人来说,汇编语言似乎是繁琐,晦涩的代名词,其实不然,汇编语言指令虽然不如C语言那么容易读写,但是一旦掌握了常用指令的含义和用法,就会发现汇编语言其实并不难,而且重要的是,一旦我们掌握了汇编语言,就可以写出C等其他高级语言不可能实现或者实现起来很困难的功能,比如我们现在需要的的入口代码程序。 本书没有用专门的篇幅来介绍汇编语言的语法,而是结合书中例子里,对涉及到的语法进行说明。读者也可以参考一本系统讲解ARM汇编语法的书,来理解本书中的实例。 第一个HelloWorld 既然C语言的函数,不能作为整个系统的入口函数,那么我们可以采用任何一个函数作为HelloWorld的C语言入口函数,在这里,为了区别起见,我们把main改成arm_start,让它成为HelloWorld的C语言部分的入口函数。也就是上面汇编程序里调用的C语言入口函数。对于C语言程序来说,因该没有比打印一个”HelloWorld到屏幕上更简单的例子了,可是对嵌入式系统来说,却不是很容易的一件事情。我们知道,printf

文档评论(0)

mwap + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档