本来应该早点写这篇东西的,但最近烦心事太多,一直没有静下来的时候,今天终于状态好了一些,把学2440的历程总结一下。
为了学习嵌入式,我是在09年的9月初买的2440开发板。对2440的学习从最初就定为三步走,单片机、bootloader、linux操作系统,由于当时已经有LM1138(是CONTEX-M3核心)的经验了,所以对单片机的困难程度估计不足,当时想2个月左右的业余时间应该就能够完成的,没想到拖到这么久。这里原因分析一下挺简单的,首先,我所使用的LM1138是周立功的1138开发板,用的是配套的IAR开发环境,其核心也与ARM正统系列有所区别,ZLG的相关技术支持做的实在是太好了,在那块开发板上连仿真器都做成一体了,导致我一度认为1138不用仿真器,通过U口就能直接烧录程序了。由于当时是工作需要使用其作为开发目标板的,所以一切的目标就是完成任务,所以很多东西,能用现成的就用现成的,而周公的例程又是最全的,几乎所有的硬件器件都有相应的例程,在其基础上修改一下就能够成功运行了,这里不得不说一下工作于学习的区别还真大,工作中,为了追求速度,很多都是用已有的现成的东西,而学习为了理解深入,却需要由0开始,才能对整体有深层次的把握。周公提供的开发板、开发环境、开发例程已经把涉及到架构、中断响应、初始化过程的东西都已经写好了,所要做的选择就是填空,诸如在这里写个函数,把函数指针添加到中断响应的列表中之类的。但对中断响应的过程、初始化却一无所知。所以当时我在制定以2440作为单片机的计划时,将开发板商提供的环境ADS抛弃,转而将2440以IAR作为目标环境进行学习,应该说这是一个痛苦的开始。这里应该说明的是,其实以哪种环境作为嵌入式开发环境并没有什么区别的,所要做的工作都是一样的,主要的不同是不同的环境针对不同的MCU有不同的资源,IAR下针对2440的资源就相当的少,对很多常用的MCU IAR都为其提供了相应的例程,通过例程学习该MCU是比较迅速的,但对2440,IAR没有例程,在网上也很少会找到在IAR下调2440的系统介绍,每种环境又有着自己独特的语法,如IAR 、ADS针对ARM汇编语句的支持就是不一样的,这就导致在初学时使用陌生的环境,学习陌生的知识,难度可想而知,但我认为既然目的是学习,就需要由困难的地方入手,这样学到的东西才是最多的。虽然时间确实耗费了很多,统计下来,由09年9月初,到10年3月末,中间整整7个月时间,刨去春节、各种事情的干扰,其它的业余时间都耗费在了这个上面,中间曾一度因为一个问题而耽搁整整3个月时间,一步一绊的走到这里,回想起来依然很令我感慨,总结下来中间经历的有:IAR环境的熟悉,主要包括:仿真器设置、链接文件icf的地址分配,使用仿真器调试闪灯程序--这就像软件中的Hello World!一样让人兴奋。但在这个时候所有的程序还是跑在RAM中的,只能是个调试程序,断电后就都消失了。但在这个过程中熟悉IAR、仿真器是很重要的,是一个基础性的工作。下一步正式开始嵌入式ARM的开发,编写异常向量,设置各个中断入口,这里都是使用汇编编写的,对ARM的汇编需要一定的了解,对ARM异常向量表设置、响应的过程也要有了解,这里需要注意的是,在调试中断时就不能使用仿真器跟踪调试了,需要通过仿真器烧录到ROM中运行了。能够在RAM中跟踪的是最好的,在不能够跟踪的时候我们就需要调通UART串口输出了,通过打印数据来表明当前的运行状态。最后,我们是需要配置icf文件将所有的程序跑在片外的SDRAM.flash中的。这里对异常向量表栈空间、程序正常运行栈空间又有深入的理解。使能MMU,对ARM存储器控制有实际操作的感性认识,最后使能PLL将CPU运行频率设置为400MHZ,实际运行速度,单片机的学习过程就告一段落了。应该说中间走了很多弯路,没有一个人请教真的是一件很痛苦的事,网上的很多东西不可不信又不可全信,很多时候,人家说的都是正确的,但你却用错误的方法去使用,那肯定得不到正确的结果的。 |