之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。
回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。
这几章想达成目的如下:
- 能够快速的上手
- 能够控制系统的功能
- 明白移植的过程
- 能够根据需要的功能来裁剪源码
从第六十一章开始的章节都是熟读源码后,根据笔者的整理方法,按照某种逻辑从系统源码中抽出来的专项解释。
笔者整理方法如下
- 各文件夹功能介绍(每个文件夹放什么文件,哪些是移植的,哪些不需要改,哪些需要修改)
- 各文件功能概览(每个文件都明白有哪些东西,是系统的哪一部分)
- 各文件函数概览(每个文件的有什么函数,函数的作用是什么,形参是什么)
- 移植的本质与移植的顺序(哪些文件需要了解,哪些文件是移植的时候需要更换的)
- 添加与裁剪源码(添功能与删功能怎么上手)
- 常用的结构体列表
- 常用宏介绍(如何用宏来控制整个系统,启用或关闭某个功能)
- main函数常用的结构顺序
- 创建任务的流程
- 任务在几种队列的变化
每个整理方法会用一章或多章的篇幅来解释。
点击此处进入μC/OS-iii章节总目录
2024.05.12:UCOSIII第六十六节:常用的控制宏介绍 第二部分
- 六十九、UCOSIII:常用的控制宏介绍 第二部分
- lib_cfg.h文件
- 内存库配置
- 调度器配置
- 信号量/消息邮箱/消息队列等OS对象的配置
- 中断配置
- 字符串库配置
- 是否启用内存保护、是否使用浮点运算等
- 代码实例
- 应用实例
六十九、UCOSIII:常用的控制宏介绍 第二部分
lib_cfg.h文件
在μC/OS-III系统中,lib_cfg.h
通常包含一些配置宏和参数,用于配置uC/OS-III库的行为和功能。
这个文件允许用户对uC/OS-III的行为进行一些自定义和配置。
内存库配置
配置内存管理器的参数,如堆栈大小、堆栈大小、消息邮箱的大小等。
调度器配置
包括时钟节拍的定义、任务优先级等。
信号量/消息邮箱/消息队列等OS对象的配置
定义系统中使用的信号量、消息邮箱、消息队列的数量和属性。
中断配置
定义中断服务程序(ISR)并指定其优先级和其他属性。
字符串库配置
启用/禁用浮点数字符串函数
浮点数函数的最大有效数字个数(默认值)
是否启用内存保护、是否使用浮点运算等
在实际项目中,lib_cfg.h
的内容可能因项目需求而有所不同。通常,它是根据特定应用程序的需求和硬件平台的特性进行配置的。
代码实例
下面是一个简单的示例,展示了包含在lib_cfg.h
中的一些配置:
/*
*********************************************************************************************************
* 内存库配置
*********************************************************************************************************
*/// 启用/禁用内存库函数的外部参数检查
#define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED // 启用外部参数检查// 启用/禁用汇编优化的内存函数
#define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED // 启用汇编优化函数// 启用/禁用内存分配函数
#define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED // 启用内存分配// 定义堆大小(27KB)
#define LIB_MEM_CFG_HEAP_SIZE (27u * 1024u) // 堆内存大小(字节)// 定义堆内存的基地址(如果未在app_cfg.h中定义,则注释掉)
//#define LIB_MEM_CFG_HEAP_BASE_ADDR 0x00000000u/*
*********************************************************************************************************
* 字符串库配置
*********************************************************************************************************
*/// 启用/禁用浮点数字符串函数
#define LIB_STR_CFG_FP_EN DEF_DISABLED // 禁用浮点数函数// 浮点数函数的最大有效数字个数(默认值)
#define LIB_STR_CFG_FP_MAX_NBR_DIG_SIG LIB_STR_FP_MAX_NBR_DIG_SIG_DFLT/*
*********************************************************************************************************
* 模块结束
*********************************************************************************************************
*/
应用实例
这些代码是用于配置内存库和字符串库的宏定义。
在实际的软件项目中,我们可以将这些宏定义添加到你的项目配置文件中,例如 app_cfg.h
或者 lib_cfg.h
中。
这些宏定义将会被编译器用来控制库的行为。
以下是一个示例,展示如何使用这些宏定义:
#include "app_cfg.h" // 包含你的项目配置文件#ifdef LIB_MEM_CFG_ARG_CHK_EXT_EN// 根据 LIB_MEM_CFG_ARG_CHK_EXT_EN 的值,选择是否启用外部参数检查#if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)// 启用外部参数检查#define EXTERNAL_ARGUMENT_CHECK#else// 禁用外部参数检查#undef EXTERNAL_ARGUMENT_CHECK#endif
#endif#ifdef LIB_MEM_CFG_OPTIMIZE_ASM_EN// 根据 LIB_MEM_CFG_OPTIMIZE_ASM_EN 的值,选择是否启用汇编优化#if (LIB_MEM_CFG_OPTIMIZE_ASM_EN == DEF_ENABLED)// 启用汇编优化#define ASM_OPTIMIZATION#else// 禁用汇编优化#undef ASM_OPTIMIZATION#endif
#endif#ifdef LIB_MEM_CFG_ALLOC_EN// 根据 LIB_MEM_CFG_ALLOC_EN 的值,选择是否启用内存分配函数#if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)// 启用内存分配函数#define MEMORY_ALLOCATION_ENABLED#else// 禁用内存分配函数#undef MEMORY_ALLOCATION_ENABLED#endif
#endif#ifdef LIB_STR_CFG_FP_EN// 根据 LIB_STR_CFG_FP_EN 的值,选择是否启用浮点数字符串函数#if (LIB_STR_CFG_FP_EN == DEF_ENABLED)// 启用浮点数字符串函数#define FLOATING_POINT_STRING_FUNCTIONS#else// 禁用浮点数字符串函数#undef FLOATING_POINT_STRING_FUNCTIONS#endif
#endif// 在此处可以根据需要使用上述宏定义来控制代码的行为
在这个示例中,我们根据每个宏定义的值选择性地定义了一些预处理器宏。这些预处理器宏可以在后续的代码中用来控制特定功能的编译行为。
通过这种方式,我们可以根据需要启用或禁用不同的库功能,从而优化项目代码。