【分享】一步一步学习uCOS和ARM体系结构的心得
学习必备条件:
1、一块
开发板——例如44B0开发板,建议初学者不要去购买那些ARM9体系结构的,因为作为初学者来说ARM9体系的东西是很复杂的,买块ARM7的就可以了(先入门,然后再提高);
2、学习必备书籍
《Pointer on C》中文名字叫《C和指针》(美)里科|译者:徐波 前提你的了解C指针吧(这本书时非常经典的书籍,完全可以看中文版的,作者翻译的非常到位)
《嵌入式实时操作系统μCOS-II(第二版)》--邵贝贝翻译的(不能不承认邵贝贝是一个非常好的翻译者)
《μC/OS-Ⅱ标准教程》--杨宗德
对于英文不好的朋友可以购买《ARM体系结构与编程》--杜春蕾(该书其实还是有很多翻译错误的,大家在看的时候要注意一下,但是不可否认的是这本书到目前为止算得上是我见过最好的讲解关于ARM体系结构的书籍了)
对于英文过关的兄弟姐妹可以直接看《ARM+Architecture+Reference+Manual(2nd+Edi
tion)》
3、有条件的兄弟姐妹可以选购一个
仿真器 JLINK V8全功能版(这个的感谢中国的优秀工程师,是他们把原价1999多的JLINK变成了几十元钱的东西
4、开发环境--MDK350或者IARARM
如果要熟悉这些开发环境,就需要好好读一些这些开发环境的手册资料,不好意思,这个就只有英文的了。
以上4个条件具备下来,可能也不会超过500元钱。
下面来讲讲我的学习经历:
我刚开始学习的时候,自己走了不少弯路,这里就省略不说了。
第一步:在开发板上跑跑简单程序
因为你有开发板,所以你就先在网上找一下对应开发板上的ARM芯片的datasheet,你都不先搞懂芯片的手册,又谈何让自己实现很多功能呢。
熟读数据手册后,就尽可能的在开发板上实现芯片对应的每个功能,像GPIO实验,UART通讯,I2C,ADC,DAC,PWM,RTC,SPI等等。自己写自己的程序,然后在开发板上好好实践一下。
当每个功能模块都实现以后,建议你让你的开发板实验一下多个功能复合使用,比如用UART打印出ADC的值什么的。
第二步:学习uCOS
鉴于你已经购买了《嵌入式实时操作系统μCOS-II(第二版)》,除开以下三个文件:
1、OS_CPU_C.c
2、OS_CPU.H,
3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编)
这三个文件的处理机制暂时可以不用先了解怎么做的,怎么移植的,以后再说
第一次读这本书时,搞清楚什么是任务,什么是前后台,为什么要在系统中加入嵌入式操作系统。
第二次读这本书时,详细了解他的TCB(Task Control Block)和ECB(Event Control Block)的数据结构,搞清楚整个uCOS的实现机制(这里不要先就去看uCOS的移植,这样只会让你云里雾里的)
第三次读这本书是,详细了解信号量,互斥信号量、消息队列、邮箱和时间标志组
鉴于你又购买了《μC/OS-Ⅱ标准教程》,你 可以想在VC++ 6.0开发环境下实现对信号量,互斥信号量、消息队列、邮箱和事件标志组的上机实验代码。
如果还是不能了解uCOS怎么工作的,建议你多看几遍(我可是足足看了6、7遍了,书都翻得脱页了。汗说明我很笨,希望各位看官都比我聪明,呵呵)
第三步:建立对uCOS的初步认识
在网上下载对应你的开发板ARM芯片移植好了文件OS_CPU_C.c,OS_CPU.H,OS_CPU_A.asm(当然有的开发板已经提供了这样的基础实验)
在你的开发板上跑跑uCOS,建立起自己对于uCOS在ARM7开发板上的认识。
在你所购买的ARM7开发板上编写一个自己跑uCOS得任务(这里先不要去搞中断,初学者对于uCOS下的中断程序设计根本就搞不清楚)
第四步:熟悉ARM体系结构
因为是基于ARM7的移植,建议英文不好的去看看这本书《ARM体系结构与编程》(虽然这本书的作者在翻译时有很多操作,但是还是建议初学者去购买来好好看看),对于英文好的直接在网上下载《ARM+Architecture+Reference+Manual(2nd+Edition)》看就可以了
在看这个《ARM体系结构与编程》或《ARM+Architecture+Reference+Manual(2nd+Edition)》时,务必注意多看几次,了解以下几个方面的知识:
1、ARM模式下的指令集
2、Thumd模式下的指令集
3、异常模式及进入异常时ARM如何处理
4、一定能熟悉ARM中的汇编指令
5、熟悉CPSR,R0-R7,R8-R14,R15及在各个模式下,这些寄存器的映射。
熟悉以后,再来自己做uCOS的移植了。
第五步:uCOS移植
当然在自己编写代码做移植uCOS之前,有必要看看别人的移植代码。
其实对于uCOS的移植,我们只需要编写关键的三个文件,文件如下:
1、OS_CPU_C.c(堆栈初始化操作OSTaskStkInit函数)
2、OS_CPU.H:完成在该芯片下的数据定义,比如什么unsigned char 之类的,注意一下OS_STK和OS_CPU_SR的定义,定义下关中断和开中断的方式,有三个只能选择1个,ARM芯片一般是定义为第三种方式
3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编),这个文件的内容就多了,要做以下几个函数的重写:
1、OSStartHighRdy函数
2、任务级的任务切换函数OSCtxSw,
3、中断级的任务切换OSIntCtxSw,其实只要写好了OSCtxSw,OSIntCtxSw自然就copy一下就完了(copy的时候记者要把保存当前任务的寄存器去掉就可以了。
第六步:测试自己的uCOS移植代码
第七步:在自己写的uCOS移植代码中跑跑任务。
5