自学经历

 晚上无事翻了翻以前的资料和笔记,突然发现了几年前写的日记,关于自学arm、linux时候的,拿出来晒晒大笑...

 

2009-4-28

这个项目是最简单也最经典的实验项目了“跑马灯”。其实写这个程序并没什么难的,难就难在这时我在这套开发板上跑起来的第一个程序,需要搭建一个开发平台,从4/19号板子回来就开始看书,看原理图,上网找资料,到现在不到10天的时间里,我基本上搞懂了ARM裸跑程序是如何运行的了。

17号在网上订购了两本ARM书籍,加上从朋友那里借了一本ARM的书,然后就开始看,刚开始我还想先看一周书再去买开发板子做,因为那样理论要了解了一些,但是我看了两天后才明白,这样不行,自己的资料不是很多,网上要去下载的话也要费时间。所以19号亲自去南山那面买了套板子回来。这两天期间我是先看了江湖上流传的中嵌教育的ARM嵌入式培训视频,我只看了拿其中的3集,讲ARM体系结构的,本来想看完指令系统,结果那两集视频真好没有声音,就放那里了。

买回来开发板子,人家带的资料就是齐全,而且里面还有我在铁驴上下的那十几个G的中嵌视频呢。而且还有各种编译联接,调试,下载软件,省去了我很多力气啊。

这段时间看了学的东西太多了,反正现在时了解了ARM是怎么一回事,鉴于目前还没有打算在操作系统下编程,所以暂时会在ARM上裸跑一段时间,就是要深入熟悉ARM的片内资源的应用,之后再去加上操作系统,听说这两种东西完全是两码事。

学了这么久一下这几点是需要注意的:

1.    在看资料的时候,如果某些东西自己努力理解还是迷糊的话,最好跳过去,接着往下看,或与某天你就突然明白了。

2.    多看网上的资料,参考被人的经验,但是也不要完全相信别人的话,自己要思考,多前后联系着想,这样才能将所学知识联系起来。

3.    ARM理论的学习,最好先看ARM体系结构和编程结构,寄存器,存储系统,电源时钟,最小系统电路一定要先弄明白。至于外设功能者可以先放一边,以后用的时候在学。上面弄懂之后,就开始看ARM的汇编语言,这个一定要看,而且是认真的搞懂,以后在分析启动代码,bootloader的时候就不是那么费力了。

4.    认识你的开发板,认真分析板子的原理图,至少在刚开始的时候要把ARM最小系统的电路图分析透彻。比如ARM引脚定义,外挂存储器的访问方法,存储器芯片的信息,电源,时钟,都有什么引脚被外扩出来以供用户使用等。其他的先暂时不管

5.    开发平台的搭建:编辑,编译,调试仿真,下载,这些工具软件的应用和设置方法,有时开发板上带的下载工具自己电脑不能使用的话,就要另外想办法。我的开发板是带了一个简易的并口JTAG板,以供调试下载程序用,但是我的主机上没有并口,只有串口和USB,刚开始把我急坏了,赶紧打电话给开发板供货商,他说现在网上很多卖一种叫JLINK的东西,是USB口的,功能一样,一百多快钱。所以我又风尘仆仆得买了个这个东西回来。刚开始不怎么会用,不过没事,照着说明书上的做一遍就会了。另外还有就是这几个工具软件之间的设置问题,多看点资料就会了,没什么难的。

6.    对于自己写程序,开始自己不是很会写工程,这样你可以先拷贝一份板子上带的测试程序过来,现在你就需要开始研究启动代码之类的东西了,就是在进入Main()主函数之前CPU都做了什么事情,这些事必不可少的,而且是必须整明白的,要不然学了也是白学。

7.    比较难理解的就是那个映像文件的初始化过程了,我都还是琢磨了几天才在某天豁然想通的呢。

呵呵,先写这么多吧,也记录一下我的自学过程,反正在这10天我做的事还是比较多的,像全部写下也是不可能的,只有检主要的写了。

昨晚才开始决定要写跑马灯程序的(不过我是两天之前就在研究启动代码了),昨天调试下载都还是存在问题的,今天就改了改主函数的东西,很快就调通了。

明天可以把今天的bin文件烧到板子上运行一下,练习一下烧程序。

接下来的话准备把按键加上,熟悉熟悉中断。。。

 

2009-5-9

从1号开始调中断键盘,开始是学习理论知识了,反正就是熟悉与外部中断有关的寄存器,在这之前,分析启动代码的时候就已经把异常中断时如何执行就搞清楚了的,所以就很快把中断这部分的理论学会了。

接下来就是写代码,其实也是有参照被人的代码在写自己的代码。想的是一定要把之前的【跑马灯程序加进来一起凑合更大个工程。

第一天把代码写好,第二天回来调了一天,开始出现的问题是中断异常已经进入,不过进入的服务程序地址不对,也是偶然凑巧我在一本书上看见了下面的话:当处理器产生中断时,pc会指向0x00的地址开始处的中断向量表,再通过中断向量表再找到最终的服务程序。我最先是在nor flash启动下,程序下载到SDRAM中进行调试的,后来看了这句话一想,不对哦,nor flash 里板子在出厂的时候就已经烧写了super vivi的bios程序,它里面的中断向量表初始化的情况和我自己写的中断键盘的初始化情况又不一样,当然程序会跑到一个莫名其妙的地方了。就这样我把原来的跑马灯工程烧到nand flash 里去,然后从nand启动,把程序下载到SDRAM中频那个调试,因为一上电nand里的前4k的程序都会拷贝到0x00开始的4k空间里去,当然这里面就包含了完整的未初始化的中断向量表了。异常发生后,pc就会指向自己程序设置的地址了。

接下来可以进入中断了,但是全速运行时,中断仍然看不到,很简单,在终端服务程序中加一个延时就可以再全速时看到。

接下来的三四天都在绞尽脑汁地搞全局标志位的问题,在单步时很正确,一全速就不不变了。

到最后终于把罪魁祸首找到了,原来是我键盘抖动的问题没有处理,硬件是厂家做好的,没有做硬件区抖,要是我自己做的话或许就会加上一个RS电路去抖。当然就只有在软件上消除了,而且这个还和以前做51的不一样,以前只要加一个延时10ms的就可以了,现在ARM不一样了,加了还是不管用,后来上网上一查,有人提供一种方法就是多次采样,判断是否按键稳定后再做处理,而且最后一定要等释放键完成后再退出中断处理程序

到目前为止,键盘这一块是基本解决了。现在按键还是比较好用,在调试的时候是有一个两个按键不好用,估计是按键的差别了。不过在我烧些进nand里去之后再运行,每个键的话就一样了。呵呵

    接下来的任务就是:使用定时器,AD,串口,pwm

 

 

2009-5-12

用了两天的时间9、10号用了ARM的定时器驱动蜂鸣器,加上了之前的键盘和led显示,倒是没有花太多时间去调试就成功了,还是比较简单。

现在的问题就是我的程序现在写的越来越大,至少大于4k了,现在需要将这么大的程序写入nand flash里去的话,就需要修改启动代码或者直接应用现成的bootloader去将nand里的程序复制到SDRAM里去执行,这个工程就是我接下来的任务了,搞清楚如何复制。

 

 

2009-5-19

经过这么时间的琢磨,终于将复制nand数据的代码加进了启动代码中,并且成功地将12号调试出来的程序烧录到nand,然后启动,结果在意料之中。呵呵,这一切来的不容易。首先我研究了一下2440的数据手册上写的关于nand控制器的内容,了解到nand钱4k的代码是位置无关代码,这是在编译连接时都已经确定了的,所以一上电,硬件自动加载钱4k代码到settpingstone中运行,在这4k代码中有一段代码是将nand中的全部程序复制到SDRAM中去的,之后通过一条ldr  pc, =copy_proc_beg伪指令跳转到SDRAM运行。总之就是前期的工作周期比较长,研究透了之后就简单了,中间的过程还要感谢我在网上搜集到的资料。

接下来的任务就是要实现串口通信了,因为现在显示的话还没有太多精力去做,但是显示这一块的话又不能少,所以就决定先做串口了,通过电脑来显示信息。

 

 

2009-5-25

快一周了吧,就这个周末才有时间去真正地静下心来写程序,上一周都忙着加班和看书了,前天写了一天的串口,昨天呢,又遇到了编译的问题,主要是时序和变量类型的问题了,不过也是整了一天的时间呢,今天下了个早班,就是想把这玩意给调出来,真是老天不负啊,刚开始用的pc自带的DNW串口软件,遇到了显示换行的问题,无论我怎么改程序都不管用,后来我想起以前我们用过一种串口调试助手,我又将其翻出来,一用,嘿嘿,居然换行ok了。

现在都11点过了,今天肯定是烧写不了了,明天吧,明天还要把另外2个串口加在一起也调一下,之后再烧到nandi去运行,不过这次的程序好大,其实主要是vsprintf()这个库函数太大了。

继续努力…………………………………..

 

 

2009-5-28

    串口终于全部完成了,而且还把以前遗留的一个pwm的问题给解决了(关闭蜂鸣器的时候有时按键不管用,频率编程另外的值)。前些天只是在串口精灵上实现了发送操作,但是一直没有实现接收字符串,然后回写到电脑上的。之后我还了很多方案,包括调整接收方式,改成查询接收,还改成先中断然后查询接收,改过先接受到字符数组里,然后利用发送中断发送出去。这些都没有改善效果,这些天上班的时候我都在想这个接收流程,最后发现时在接收过程中出了问题,而且还是发送程序也参合到里面去了,所以后来我检查了中断里的判断语句,开始以为是中断标志要和状态标志位一起查询来判断,后来按照这样修该了之后还是那样的效果,后来实在没有办法了,才将清除子标志寄存器的相应位的清除语句放在了其他两个标志位清除之前,这样就正确了。最后的总结就是,在中断里面清除标志位的时候还是有一定得先后顺序的,要不然会引起时序的混乱的。另外一个问题就是之前遗留下来的pwm定时器的问题了,也是在关断的时候关不断pwm的输出,今天才发现还是将GP口初始化位置不是很合适,改成在关断的时候,关闭定时器,关闭定时中断,将相应输出口设置成输入方式,然后在打开pwm的时候再做相反的工作,即可。

    接下来的事情该做AD转换和RTC了。

 

 

2009-06-02

    今天终于把AD转换和RTC的做出来了,具体实现的功能在功能说明的文档里写的很详细。总之,调试这个地方不是很复杂。出现了一些问题都在很短的时间攻破了。在调试RTC的时候,刚开始是时间显示不出来,也就是在调用uart_printf()中的串口中断和定时器T1发生冲突,但是在所有的串口中只有UART1才可以和t1进行调整优先级顺序,所以后来把程序中所有用到中断的地方的优先级排了个顺序,之后就OK了。另外在紧挨着的两次串口调用之间需要加延时程序,否则会出现乱码显示。另外在每次AD转换之前都需要设置ADCCON寄存器。

    接下来的话主要有以下几项任务:LCD和触摸屏显示,IIS音频,IIC串行通讯,USB,网络串口。同时还需接触操作系统方面的知识。

 

2009-07-4

    一个月没写了,今天就把这一个月的经历补上吧

 

2009-06-03

    开始学习2440的LCD控制器的知识,主要是控制信号和时序,还有先关寄存器的设置。接下来就是在ADS中写LCD的驱动程序了,两天后程序出来了,就是实现了静态显示图片,然后在屏幕上划线和矩形之类的,之后开始在AXD中调试,不过一上电就黑屏了,不知道怎么回事。就在这几天,我正好也开始在外面找工作了,所以在接下来的2周内就没有怎么调试这个LCD显示程序了。在这两周的找工作时间里我发现了什么呢?想做嵌入式的话,必须要会操作系统,哪怕你只熟悉一种linux或者wince或者vxwork也好,反正你要懂操作系统才是硬道理。所以在6月21号之后我就下决心开始学习linux操作系统了。对于ARM的裸奔,我自己觉得是没有什么问题的了,其实对于单纯的ARM这块片子如果不加操作系统的话就是个单片机,和8位的差不多,但是还是有很多不一样的地方了。对于裸机编程主要理解一下几个部分:都什么资源外设;时钟电源管理单元;存储系统(存储结构,sram,sdram,nand flash,nor flash,还有存储单元的编址);启动代码(包括nand+sdram组合时代码的搬运实现);映像文件的装载域和运行域(这个很重要,分几种情况,代码是否大于4k,和是直接装在到ram中还是烧录到flash中,情况都不同);中断控制器(工作原理,主要是相关寄存器的设置了,中断很多,不过使用起来不是很难的,和51的差不多,写个中断键盘,做个定时器控制的流水灯,或驱动一下蜂鸣器,频率可变的那种,最后再玩玩UART串口,adc模数转换,RTC时钟系统)这些都和中断有关的;Lcd控制器(不过我还没来的及去调试它的逻辑程序呢)触摸屏显示,IIS音频,IIC串行通讯,USB,网络串口。后面的我都没时间去做裸机程序就开始学习linux了,等差不多之后就在操作系统之下实现这些设备的驱动吧。

 

2009-6-21

    今天开始接触linux操作系统了

    第一步是要先在我的pc机上装一个linux操作系统,开始的5-6天都是在网上找一些资料学习怎么装双系统,最主要是分区这个事情把我的时间浪费地多一些了,不过几天之后我还真明白了装双系统分区要改怎么分了呢。首先是在网上下载linux的3张安装镜像文件ISO格式的,后来再下了个分区魔术师和一个酷客DOS工具箱,装上之后,我准备先在分区魔术师里面将装linux的10G空间先分出来,但是在这里我碰到了2个问题没有解决掉:1.我在现有xp的d盘里分去了10G的空间,此时这个10G的空间还是fat分区,还是xp的DOS分区,我不知道怎么把这个10G的分区从DOS分区中删除,在网上没找到答案。2我分好之后,xp系统只要一重启我xp下面的硬盘都被还原了,就像没有分过区一样。但是我又了解到可以不事先分区,待在linux安装的过程中要提示你分区操作的,这里你只要选择手动分区就可以了,然后之后在原来XP的系统d盘中分出一些空间作为linux的根分区,root分区,swpe分区,然后再格式化成ext3或ext2格式的就可以了。但是我在DOS环境下(xp下没有纯dos环境,用的是网上下载的DOS工具箱,这里必须学几个DOS下的简单命令了,dir,cd等)运行安装文件的时候,出来的安装界面和网上介绍的教程出现的图片不一样,之后让我选从什么安装,这里我选硬盘驱动器后,结果找不到相应的硬盘驱动器,我搞了一天之后实在不行,朋友建议我装了一个虚拟机操作系统,然后我就开始在网上找如何安装虚拟机linux操作系统,结果搜了一大堆,意思就是先在xp下面装个虚拟机软件,然后新建一个虚拟机平台,在新建的向导中会要求你设置这台虚拟pc机的各种配置。设置好后,一台新的美装任何操作系统的pc就摆在这里了,接下来的工作就是安装linux系统了。在安装的过程中有几个重要地方需要说明:

1.    在分区选择时,选择自动分区,为什么不是手动分区呢?因为这台虚拟pc机时一个全新的pc,不用担心破坏其他任何pc中已存在的文件和系统。

2.    在设置root根口令的时候,在第一次输入时可能会提示你的口令太短或者不匹配,这个不用管,等第二次输完就没有了。因为你在输入的过程中系统在自动检测两个输入区的字符是否相同。

3.    在最后安装的时候会出现两次换碟的提示,这个时候,使用ctrl+alt将鼠标切换到xp下,在VMware界面的右下角有个光盘的图标,双击打开出现对话框,然后换上第二张或第3张盘。这之后还不能马上点击确定,还需要在这个光盘图标上单击左键,点其中的disconnect,将其改成connect,之后在点击确定。

就这样我把linux系统装上了,不过显示屏幕的大小只有800x600,这点不爽外,其他还好,速度没什么影响的。虚拟机其实挺好的,在以后开发的时候方便,可以再xp和linux之间切换。但是现在我的linux还是不能上网,这个问题待解决。

2009-6-29

    接下我花了3天的时间跟着教学视频学习linux下的命令,还不错,现在是比较熟悉了,呵呵,不过还要多加练习,幸好我找了个小本本记下来了。Shell编程和设备管理都学了,不过现在还是不怎么能理解那些管理功能。没事,慢慢来嘛。

2009-7-3

    昨天晚上看完shell编程和设备管理之后就已经半夜一点了,但是当时我是特别想把我linux的网络配置好。

参考: 在VMware的 linux虚拟机下如何配置网络.doc

       虚拟机VMware for linux 的网络配置.doc

    现在我的linux可以上网了

 

2009-07-05

    Linux下的网络功能:saba服务和nfs服务,实现linux与windows系统的文件共享,linux主机和客户机之间的文件共享(貌似在以后的嵌入式调试中就是用这种方法来共享pc linux环境下的文件共享给开发板客户机的)。

    目前可以在windows下访问linux的共享目录,但是还没有找到linux下访问windows的目录呢,正在努力中。nfs服务已经全部搞定(具体做法参见笔记本上的记录)。

    Linux和windows下的文件下载我是下载了一个flashFXP软件完成的,很好用的。

 

2009-7-25

    真的很抱歉呀,过了20天的时间才想起来回顾一下这短时间来所学的知识了。不过话说回来,学的东西还是挺多的,虽然每天基本上是12点才睡觉的,甚至有时候1点2点才睡觉,就想现在一样,都快2点了,不过没办法,我这个人就是这样,做不出来我就睡不着,除非是十分困,才会去睡觉的,要不然一定搞完。

    这几天为了搞清楚本机、虚拟机、2440开发板的联网,我都没怎么睡好觉。不过还是挺值得的,下面这一个连接文件就是我这几天来的心血啊。

开发板、虚拟机、本机的互联笔记.doc

 

现在目前只是实现了互相ping通,还没有开始实际的网络功能呢,明天就开始吧!

 

2009-7-5----2009-7-20

这段时间里呢,主要是学习虚拟机上的linux的各种知识了,包括进程创建管理,进程间通信,通讯方式呀,管道,信号量,共享内存,还有linux的系统调用及文件系统的调用,设备文件的访问,最后来了一个串口的编程。幸好以前大学时候上过一学期的操作系统课程,所以才不是很陌生,要不然。。嘿嘿!不过目前学的还不是很深入,毕竟我也不会去专门从事linux系统下的工作,只是为了以后的开发板移植,相信以后会,慢慢深入了解的。加油!

    Come on baby!

 

 

明天之后的工作就是在虚拟机和开发板之间进行了,当然也是离不开本机的。

 

 

2009-7-28

近三天来主要完成了连个任务,一个是虚拟机和mirco2440开发板的nfs,telnet,ftp的连接,最主要的是nfs功能的实现,这些东西的实现都在下面的几篇日记里面:

虚拟机linux和开发板的nfs连接笔记.doc

在xp下面使用telnet远程登录开发板.doc

使用FTP传递文件.doc

 

 

另外一个就是交叉编译环境的搭建。目前基本上有三种搭建的方法:

方法一 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法二或方法三构建交叉工具链。

方法二 通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。

方法三 直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许 会在使用时出现许多莫名的错误。

我这里是用的第三种最简单的,使用开发板厂商自带的交叉编译工具链,实际上他们是编译好的工具,在linux目录下解压后就可以使用的。最后在在配置文件里设置一下环境变量就可以了。

使用现成的交叉编译工具链的方法.doc

让Linux知道arm-Linux-gcc编译器的存在.doc

 

 

在这之后停了,去一家公司做单片机开发,再后来就发生了后来的事情...
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值