移植 uCos-III 3.03 到 STM32F429 上

背景

通过STM32 的学习,我们可以往更深层次的地方走,尝试系统上的一些开发。

STM32: F429(StdPeriph)
uCos-III : v3.03?

有关说明:

在移植 3.04 版本 UCOSIII 的时候遇到了这样一个问题:一旦调用 OSStatTaskCPUUsageInit()函数就会进入 hardfault,(如果这时选择-O1 或者-O2 优化的话就没有问题),不知是 KEIL 问题还是 UCOSIII 3.04 版本的问题,所以为了保险起见我们使用 3.03 版本的 UCOSIII。
另外,目前 UCOSIII 的资料基本都是基于 UCOSIII 3.03 版本的,所以这也是我们选择 3.03 版本 UCOSIII 的另一个主要原因。
如果一定要使用 UCOSIII 3.04 的话,使用 KEIL 时一定要 选择-O1 或者-O2 优化。

uCos 介绍

什么是 uC/OS-III? uC/OS-III(Micro C OS Three 微型的 C语言编写的操作系统第 3 版)是一个可升级的,可固化的,基于优先级的实时内核。它对任务的个数无限制。uC/OS-III 是一个第 3 代的系统内核,支持现代的实时内核所期待的大部分功能。例如资源管理,同步,任务间的通信等等。然而,uC/OS-III 提供的特色功能在其它的实时内核中是找不到的,比如说完备的运行时间测量性能,直接地发送信号或者消息到任务,任务可以同时等待多个内核对象等。

为什么命名一个新的版本? uC/OS 系列,第一代产生于 1992。经过了多年的使用和上千人的反馈,已经产生了很多的进化版本。 uC/OS-III 是这些反馈和经验的总结。在 uC/OS-II 中很少使用的功能已经被删除或者被更新,添加了更高效的功能和服务。其中最有用的功能应该是时间片轮转法(round robin),这个是 uC/OS-II 中不支持的,但是现在已经是 uC/OS-III 的一个功能了。 uC/OS-III 会提供新的功能以更好地适应新出现的处理器。特别的,uC/OS-III 被设计用于 32 位处理器,但是它也能在 16 位或 8 位处理器中很好地工作。

uC/OS-III 的目标 uC/OS-III 最主要的目标是提供一流的实时内核以适应更新很快的嵌入式产品。使用像 uC/OS-III 那样具有雄厚的基础和稳定的框架的商业实时内核,能够帮助设计师们处理日益复杂的嵌入式设计。

各目录以及关键文件说明

通过官网下载源码,或者使用本人整理的代码
解压以后

# Schips @ SCHIPS-L in UCOSIII 3.04 [9:55:00]
$ tree -d
.
└── Micrium
    └── Software
        ├── EvalBoards
        ├── uC-CPU
        ├── uC-LIB
        └── uCOS-III

下面我们分别对 Software 下的不同目录进行说明

EvalBoards

在默认情况下,uCos已经在EvalBoards目录为我们准备好了STM32F429II-SK移植,打开,下面是我们需要的。

UCOSIII 3.04/Micrium/Software/EvalBoards/ST/STM32F429II-SK/uCOS-III [9:50:05]
$ ls -al | grep -v d
总用量 856
-rwxrwx---+ 1 Schips None   4898 11月 26 2013 app_cfg.h
-rwxrwx---+ 1 Schips None   9062 9月  24 2013 cpu_cfg.h
-rwxrwx---+ 1 Schips None   8749 11月  1 2013 lib_cfg.h
-rwxrwx---+ 1 Schips None   8766 9月  24 2013 os_app_hooks.c
-rwxrwx---+ 1 Schips None   3053 9月  24 2013 os_app_hooks.h
-rwxrwx---+ 1 Schips None   8240 11月 15 2013 os_cfg.h
-rwxrwx---+ 1 Schips None   4897 11月 25 2013 os_cfg_app.h

uC-CPU

这个文件里面是与 CPU 相关的代码

# Schips @ SCHIPS-L in UCOSIII 3.04/Micrium/Software/uC-CPU [10:09:39]
.
├── ARM-Cortex-M4
│   ├── GNU
│   │   ├── cpu.h
│   │   ├── cpu_a.s
│   │   └── cpu_c.c
│   ├── IAR
│   │   ├── cpu.h
│   │   ├── cpu_a.asm
│   │   └── cpu_c.c
│   └── RealView
│       ├── cpu.h
│       ├── cpu_a.asm
│       └── cpu_c.c
├── cpu_core.c
├── cpu_core.h
└── cpu_def.h

cpu_core.c

该文件包含了适用于所有 CPU 架构的 C 代码。该文件包含了用来测量中断关闭事件 的函数(中断关闭和打开分别由 CPU_CRITICAL_ENTER()和 CPU_CRITICAL_EXIT()两个宏实现),还包含一个可模仿前导码零计算的函数(以防止 CPU 不提供这样的指令),以及一些其他的 函数。

cpu_core.h

包含 cpu_core.c 中函数的原型声明,以及用来测量中断关闭时间变量的定义。

cpu_def.h
包含 uC/CPU 模块使用的各种#define 常量。

详细大家也注意到目录(GNU、IAR、RealView)中都有 cpu.hcpu_a.asmcpu_c.c 这三个文件。GNU、IAR、RealView对应了不同的编译器,这是为了根据不同的编译平台有不同的处理。我们使用的是 KEIL,所以我们在移植时选择 RealView 中的文件。
cpu.h

包含了一些类型的定义,使 UCOSIII 和其他模块可与 CPU 架构和编译器字宽度无关。 在该文件中用户能够找到 CPU_INT16U、CPU_INT32U、CPU_FP32 等数据类型的定义。该文 件还指定了 CPU 使用的是大端模式还是小端模式,定义了 UCOSIII 使用的 CPU_STK 数据 类型,定义了 CPU_CRITICAL_ENTER()和 CPU_CRITICAL_EXTI(),还包括一些与 CPU 架构相关 的函数的声明。

cpu_a.asm

该文件包含了一些用汇编语言编写的函数,可用来开中断和关中断,计算前导零(如果 CPU 支持这条指令),以及其他一些只能用汇编语言编写的与 CPU 相关的函数,这个文件中 的函数可以从 C 代码中调用。

cpu_c.c

包含了一些基于特定 CPU 架构但为了可移植而用 C 语言编写的函数 C 代码。作为一个普通原则,除非汇编语言能显著提高性能,否则尽量用 C 语言编写函数。

猜你喜欢

转载自www.cnblogs.com/schips/p/12381589.html