背景
通过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.h
、cpu_a.asm
和 cpu_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 语言编写函数。
来源:https://www.cnblogs.com/schips/p/12381589.html