zyp568 发表于 2013-1-27 19:34:12

uCOS-II...学习ing...

本帖最后由 zyp568 于 2013-1-27 19:35 编辑

写在前面:
       因为自己是半路出家,一直是瞎碰乱撞,根本没有学习过《操作系统原理》之类的理论, 也学着别人直接上Linux,折磨了半天,内核代码还是糊里糊涂的,后来一位前辈推荐我先学习下uCOS-II,这个内核体积小,结构简单,容易理解内核最基本的一些东西。最近小尝试了一点点,觉得前辈说的很有道理,所以,想在此处来个自己学习的现场直播,方便被大家拍砖,嘿嘿。由于TQ的网站上还没有uCOS-II的板块,所以,只好发在这里了,要是发错区了,还请版主帮移动下。

学前准备:
      主要教材:
                《嵌入式实时操作系统uC/OS-II》(第二版) ---- Jean J.Labrosse著、邵贝贝翻译
      参考教材:
                《微机原理与接口技术》---- 陈光军、傅越千
      "开发"环境:
                BC45 + Source Insight
学前YY:
      各位看官可能就要奇怪了,嵌入式,怎么会整出微机原理这个蛋疼玩意儿来了?
      笔者自打不知是初中还是小学,学了第一篇文言文后,就深刻的体会到,古人啊,就是晕得好,几百年前开始晕人,晕到笔者这一代,效果还是这么好。YY远了,嗯,好像应该是古人云才对,有的放矢。正如前言中所说,笔者学习uC/OS-II的目的,是为了了解操作系统最底层----内核,究竟都干了些什么?是怎么干的?
      所以,看看《嵌入式实时操作系统uC/OS-II》(第二版) 中第一章的内容,作者提供了4个在基于Windows下的例子,编译器使用的就是BC45,作者自己也认为,在Windows + PC的这个平台上,是最容易将uC/OS-II演示清楚的。不过各位不用纠结,《微机原理与接口技术》只是做参考,查查汇编指令之类的。
      如果你也认同笔者的学习目的,并且准备向下看,那么笔者将再次,更明确的提醒你,不要把时间浪费在BC45编译器的编译细节、内核的Makefile、内核的链接文件上,因为他们跟内核原理没有半毛钱的关系。当对内核比较了解,考虑如何移植的时候,再根据所选用的移植环境思考这些问题。

第一课:摸石头过河。
      一直到在教材中看到BC45编译器,笔者才知道,有过这么一个玩意儿,而且据说这玩意儿当年跟Microsoft的Visual C++可以分庭抗礼,之后嘛……你懂的。
      言归正传,既然第一章给出了4个例子,咱不妨先把他们跑起来:
      下载BC45压缩包,解压,放到C盘根目录下,务必解压到C盘,别在路径问题上浪费时间,从教材光盘里,找到一个叫SOFTWARE的目录,所有的源码都在这个里面,将这个文件夹复制到BC45目录内,进入SOFTWARE目录,将其中的TO目录删除,TO是作者自己写的一个工具程序,用以在DOS命令行模式下快速切换目录,笔者觉得没有必要,所以删了。
先说说几个重要目录的用途:
                   SOFTWARE/uCOS-II/DOC         : 一些说明文档,暂时可以不用管。
                   SOFTWARE/uCOS-II/EX……       : 数一数,4个目录,分别就是教材中的4个例子的任务代码。
                   SOFTWARE/uCOS-II/Ix-86L[-FP] : 硬件平台相关的核心代码,4个例子共用。
                   SOFTWARE/uCOS-II/SOURCE    : 硬件平台无关的核心代码,4个例子共用。
                   SOFTWARE/BLOCKS : 提供一些DOS平台相关的API函数,用于在DOS窗口中显示特定内容,4个例子共用。
      接下来建立Source Insight工程,笔者的方法是在Ex……目录下建立一个名SI的目录,在其中建立S.I.工程,这样避免把原目录搞得很混乱。

笔者建立的第一个例子的工程中,添加的文件如下,注意它们的路径:

要改哪些东西呢?其实不多,主要是解决一些路径问题:
      1.    C:\BC45\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE\INCLUDES.H
               原代码:
#include    "\software\ucos-ii\ix86l\bc45\os_cpu.h"
#include    "os_cfg.h"
#include    "\software\ucos-ii\source\ucos_ii.h"
#include    "\software\blocks\pc\bc45\pc.h"                修改后:
#include    "C:\BC45\SOFTWARE\uCOS-II\Ix86L\BC45\os_cpu.h"
#include    "os_cfg.h"
#include    "C:\BC45\SOFTWARE\uCOS-II\SOURCE\ucos_ii.h"
#include    "C:\BC45\SOFTWARE\BLOCKS\PC\BC45\pc.h"            在INCLUDE.H文件可以看到,它把所用到的头文件都包含在一个头文件里,然后在所有代码文件中都包含这个“总”头文件,这样子,如果需要在几个代码文件里添加同一个"分"头文件时,只需要加在"总"头文件中即可。
      2.    C:\BC45\SOFTWARE\uCOS-II\SOURCE\uCOS_II.C
               原代码:
#include "\software\ucos-ii\source\os_core.c"
#include "\software\ucos-ii\source\os_flag.c"
#include "\software\ucos-ii\source\os_mbox.c"
#include "\software\ucos-ii\source\os_mem.c"
#include "\software\ucos-ii\source\os_mutex.c"
#include "\software\ucos-ii\source\os_q.c"
#include "\software\ucos-ii\source\os_sem.c"
#include "\software\ucos-ii\source\os_task.c"
#include "\software\ucos-ii\source\os_time.c"               修改后:
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_core.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_flag.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_mbox.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_mem.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_mutex.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_q.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_sem.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_task.c"
#include "C:\BC45\SOFTWARE\uCOS-II\SOURCE\os_time.c"      同样的,加上绝对路径。
3.    C:\BC45\SOFTWARE\uCOS-II\EX1_x86L\BC45\TEST\TEST.MAK
       原代码:
OS=\SOFTWARE\uCOS-II\SOURCE
PC=\SOFTWARE\BLOCKS\PC\BC45
PORT=\SOFTWARE\uCOS-II\Ix86L\BC45      修改后:
OS=$(BORLAND)\SOFTWARE\uCOS-II\SOURCE
PC=$(BORLAND)\SOFTWARE\BLOCKS\PC\BC45
PORT=$(BORLAND)\SOFTWARE\uCOS-II\Ix86L\BC45      这里利用原文件中开头定义的变量BORLAND=C:\BC45来设置路径。

      至此,代码修改完成,进入C:\BC45\SOFTWARE\uCOS-II\EX1_x86L\BC45\TEST目录中,双击MAKETEST.BAT,执行成功后,会在C:\BC45\SOFTWARE\uCOS-II\EX1_x86L\BC45\OBJ目录中生成一个TEST.EXE,双击它:

      OK,第一个成功了,现在可以继续将另外三个例子也弄一下,修改操作基本一样,而且修改过的”共用“文件都可以不用改了。
         
      YY:有朋友可能会说,上面修改头文件路径时,为什么不,把绝对路径去掉,然后在Makefile中的编译选项中用-I选项引入这些搜索路径,以使代码比较整洁。笔者尝试过这个做法,但是可能由于这个编译器太老古董了,跳出了一条错误提示,大意是命令行参数太多。



几个例子的运行情况都在上面了。
      其实仔细看看书的话,会发现书中还提到了一些细节,但是,到目前为止,这些都是次要的。
      重要的是,我们的实验环境建立好了:
      1. 各个路径设置OK了。
      2. 知道如何编译生成.EXE了,双击例程目录下的MAKETEST.BAT即可。
                                                      ↑前面阶段的调试简单,如此即可,后面的调试用到啥,再说。
      接下来的调试,只需要在原例程中做修改即可,不必关心各种杂项问题了。笔者选择用例程4来修改,因为这个例程中,使用了CPU的硬件浮点运算器,现在的CPU基本都支持这个特性。

OK,这一课OVER。

啊,不知道为什么上传了以后,图片缩好小了,但是占的位置还是那么大?……


zyp568 发表于 2013-1-28 15:20:15

本帖最后由 zyp568 于 2013-1-28 15:22 编辑

额,看样子,大家都没啥拍砖的激情,有兴趣的朋友,去我的博客看吧,第二课完成。。。
http://long568.blog.163.com/

wjw123abc 发表于 2013-9-12 12:09:14

mark mark mark

万里 发表于 2014-3-31 15:34:36

{:2_141:}很强大,学习一下。

kevin_SCM 发表于 2015-8-14 11:03:50

mark!mark!mark!

1585006673 发表于 2015-8-19 12:44:53

kevin_SCM 发表于 2015-8-14 11:03
mark!mark!mark!

顶                     起
页: [1]
查看完整版本: uCOS-II...学习ing...