(学习日记)2024.05.12:UCOSIII第六十六节:常用的控制宏介绍 第二部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。

回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。
这几章想达成目的如下:

  • 能够快速的上手
  • 能够控制系统的功能
  • 明白移植的过程
  • 能够根据需要的功能来裁剪源码

从第六十一章开始的章节都是熟读源码后,根据笔者的整理方法,按照某种逻辑从系统源码中抽出来的专项解释。
笔者整理方法如下

  1. 各文件夹功能介绍(每个文件夹放什么文件,哪些是移植的,哪些不需要改,哪些需要修改)
  2. 各文件功能概览(每个文件都明白有哪些东西,是系统的哪一部分)
  3. 各文件函数概览(每个文件的有什么函数,函数的作用是什么,形参是什么)
  4. 移植的本质与移植的顺序(哪些文件需要了解,哪些文件是移植的时候需要更换的)
  5. 添加与裁剪源码(添功能与删功能怎么上手)
  6. 常用的结构体列表
  7. 常用宏介绍(如何用宏来控制整个系统,启用或关闭某个功能)
  8. main函数常用的结构顺序
  9. 创建任务的流程
  10. 任务在几种队列的变化

每个整理方法会用一章或多章的篇幅来解释。

点击此处进入μC/OS-iii章节总目录

六十九、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

// 在此处可以根据需要使用上述宏定义来控制代码的行为

在这个示例中,我们根据每个宏定义的值选择性地定义了一些预处理器宏。这些预处理器宏可以在后续的代码中用来控制特定功能的编译行为。
通过这种方式,我们可以根据需要启用或禁用不同的库功能,从而优化项目代码。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 21:50:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 21:50:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 21:50:01       82 阅读
  4. Python语言-面向对象

    2024-04-29 21:50:01       91 阅读

热门阅读

  1. 嵌入式学习——C语言基础——day12

    2024-04-29 21:50:01       37 阅读
  2. Python学习路线图及开源库和工具推荐

    2024-04-29 21:50:01       24 阅读
  3. Seata分布式事务!!!

    2024-04-29 21:50:01       33 阅读
  4. 统计字符次数

    2024-04-29 21:50:01       35 阅读
  5. APP漏洞频发怎么办?渗透测试有用吗

    2024-04-29 21:50:01       34 阅读
  6. leetcode1146--快照数组

    2024-04-29 21:50:01       38 阅读
  7. 使用python写一个识别人脸

    2024-04-29 21:50:01       26 阅读
  8. C#面:委托是什么?事件是不是一种委托?

    2024-04-29 21:50:01       39 阅读
  9. 2d激光slam的改进方案探索

    2024-04-29 21:50:01       32 阅读
  10. C/C++中的整数乘法运算与汇编指令MUL和IMUL

    2024-04-29 21:50:01       35 阅读
  11. 内核镜像

    2024-04-29 21:50:01       33 阅读
  12. 常用的网站和软件

    2024-04-29 21:50:01       33 阅读
  13. 发现问题并进行管理——bug和调试器

    2024-04-29 21:50:01       31 阅读