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

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

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

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

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

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

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

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

2024.05.11:UCOSIII第六十五节:常用的控制宏介绍 第一部分

  • 六十九、UCOSIII:常用的控制宏介绍 第一部分
    • app_cfg.h文件
      • 任务堆栈大小
      • 任务优先级大小
      • 最大信号量数目
      • 消息队列的最大消息数量
      • 每个消息的最大大小(字节)
      • 代码实例
      • 应用实例
    • cpu_cfg.h文件
      • CPU 名称配置
      • CPU 时间戳配置
      • CPU 中断禁用时间测量配置
      • CPU计数前导零配置
      • 代码实例
      • 应用实例

六十九、UCOSIII:常用的控制宏介绍 第一部分

app_cfg.h文件

在本文件中定义的宏如下:

任务堆栈大小

任务优先级大小

最大信号量数目

消息队列的最大消息数量

每个消息的最大大小(字节)

代码实例

本文件代码实例如下:

#ifndef APP_CFG_H
#define APP_CFG_H

/****************************** 任务配置 *************************************/
#define APP_TASK_START_PRIO       3    // 应用程序启动任务的优先级
#define APP_TASK_START_STK_SIZE   256  // 应用程序启动任务的堆栈大小

#define TASK1_PRIO                6    // 任务1的优先级
#define TASK1_STK_SIZE            128  // 任务1的堆栈大小

#define TASK2_PRIO                7    // 任务2的优先级
#define TASK2_STK_SIZE            128  // 任务2的堆栈大小

/****************************** 信号量配置 ***********************************/
#define MAX_SEM                   5    // 最大信号量数目

/****************************** 消息队列配置 **********************************/
#define MAX_QUEUE_ENTRIES         10   // 消息队列的最大消息数量
#define MAX_MSG_SIZE              32   // 每个消息的最大大小(字节)

#endif /* APP_CFG_H */

应用实例

使用app_cfg.h中定义的配置参数在应用程序中创建任务、初始化信号量和消息队列:

#include "os.h"
#include "app_cfg.h"

// 任务函数原型
void Task1(void *p_arg);
void Task2(void *p_arg);

// 信号量
OS_SEM sem1;

// 消息队列
OS_Q queue1;

int main(void) {
    OS_ERR err;

    // 初始化操作系统
    OSInit(&err);

    // 创建任务
    OSTaskCreate((OS_TCB *)&Task1TCB,
                 (CPU_CHAR *)"Task 1",
                 Task1,
                 0,
                 TASK1_PRIO,
                 &Task1Stk[0],
                 TASK1_STK_SIZE / 10,
                 TASK1_STK_SIZE,
                 0,
                 0,
                 0,
                 (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 &err);

    OSTaskCreate((OS_TCB *)&Task2TCB,
                 (CPU_CHAR *)"Task 2",
                 Task2,
                 0,
                 TASK2_PRIO,
                 &Task2Stk[0],
                 TASK2_STK_SIZE / 10,
                 TASK2_STK_SIZE,
                 0,
                 0,
                 0,
                 (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 &err);

    // 创建信号量
    OSSemCreate(&sem1, (CPU_CHAR *)"Semaphore 1", 0, &err);

    // 创建消息队列
    OSQCreate(&queue1, (CPU_CHAR *)"Queue 1", MAX_QUEUE_ENTRIES, &err);

    // 启动操作系统
    OSStart(&err);

    return 0;
}

// 任务函数
void Task1(void *p_arg) {
    OS_ERR err;
    while (1) {
        // 任务1的代码
        // 例如:等待信号量
        OSSemPend(&sem1, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
        // 执行其他操作
    }
}

void Task2(void *p_arg) {
    OS_ERR err;
    while (1) {
        // 任务2的代码
        // 例如:向消息队列发送消息
        CPU_INT08U msg = 10;
        OSQPost(&queue1, &msg, sizeof(msg), OS_OPT_POST_FIFO, &err);
        // 执行其他操作
    }
}

cpu_cfg.h文件

cpu_cfg.h文件通常包含一些针对特定处理器和编译器的配置选项和宏定义。
这些配置选项可以根据你的硬件平台和应用程序需求进行自定义。一般情况下,cpu_cfg.h 文件可能包含以下内容:

CPU 名称配置

CPU 时间戳配置

CPU 中断禁用时间测量配置

CPU计数前导零配置

代码实例

/*
*********************************************************************************************************
*                                       CPU 名称配置
*
* 注意事项:(1) 配置 CPU_CFG_NAME_EN 以启用/禁用 CPU 主机名特性:
*
*               (a) CPU 主机名存储
*               (b) CPU 主机名 API 函数
*
*           (2) 使用所需的 ASCII 字符串大小配置 CPU_CFG_NAME_SIZE,包括终止的 NULL 字符。
*
*               参见 'cpu_core.h  全局变量  注意事项 #1'。
*********************************************************************************************************
*/
//CPU 名称配置:
//CPU_CFG_NAME_EN: 用于启用或禁用 CPU 主机名特性。
//CPU_CFG_NAME_SIZE: 配置 CPU 主机名的 ASCII 字符串大小,包括终止的 NULL 字符。
                                                                /* 配置 CPU 主机名特性(参见注意事项 #1): */
#define  CPU_CFG_NAME_EN                        DEF_ENABLED
                                                                /*   DEF_DISABLED  CPU 主机名已禁用               */
                                                                /*   DEF_ENABLED   CPU 主机名已启用               */

                                                                /* 配置 CPU 主机名 ASCII 字符串大小 ...     */
#define  CPU_CFG_NAME_SIZE                                16u   /* ...(参见注意事项 #2)。                     */


/*$PAGE*/
/*
*********************************************************************************************************
*                                     CPU 时间戳配置
*
* 注意事项:(1) 配置 CPU_CFG_TS_xx_EN 以启用/禁用 CPU 时间戳功能:
*
*               (a) CPU_CFG_TS_32_EN   启用/禁用 32 位 CPU 时间戳功能
*               (b) CPU_CFG_TS_64_EN   启用/禁用 64 位 CPU 时间戳功能
*
*           (2) (a) 使用 CPU_CFG_TS_TMR_SIZE 配置 CPU 时间戳定时器的字大小:
*
*                       CPU_WORD_SIZE_08         8 位字大小
*                       CPU_WORD_SIZE_16        16 位字大小
*                       CPU_WORD_SIZE_32        32 位字大小
*                       CPU_WORD_SIZE_64        64 位字大小
*
*               (b) 如果 CPU 时间戳定时器的大小不是 8 位八位组的二进制倍数(例如 20 位或偶数 24 位),
*                   则应配置为下一个较低的二进制倍数的八位组大小(例如 16 位)。
*                   然而,CPU 时间戳定时器的最小支持字大小为 8 位。
*
*                   参见 'cpu_core.h  函数原型  CPU_TS_TmrRd()  注意事项 #2a'。
*********************************************************************************************************
*/
//CPU 时间戳配置:
//CPU_CFG_TS_32_EN 和 CPU_CFG_TS_64_EN: 启用或禁用 32 位和 64 位 CPU 时间戳功能。
//CPU_CFG_TS_TMR_SIZE: 配置 CPU 时间戳定时器的字大小。可以是 8 位、16 位、32 位或 64 位。
                                                                /* 配置 CPU 时间戳功能(参见注意事项 #1):     */
#define  CPU_CFG_TS_32_EN                       DEF_ENABLED          // Modified by fire (原是 DEF_DISABLED)
#define  CPU_CFG_TS_64_EN                       DEF_DISABLED
                                                                /*   DEF_DISABLED  CPU 时间戳已禁用             */
                                                                /*   DEF_ENABLED   CPU 时间戳已启用             */

                                                                /* 配置 CPU 时间戳定时器字大小 ...          */
                                                                /* ...(参见注意事项 #2):                     */
#define  CPU_CFG_TS_TMR_SIZE                    CPU_WORD_SIZE_32


/*
*********************************************************************************************************
*                        CPU 中断禁用时间测量配置
*
* 注意事项:(1) (a) 配置 CPU_CFG_INT_DIS_MEAS_EN 以启用/禁用测量 CPU 中断禁用时间:
*
*                   (a)  已启用,       如果在 'cpu_cfg.h' 中 CPU_CFG_INT_DIS_MEAS_EN      #define'd
*
*                   (b)  已禁用,       如果在 'cpu_cfg.h' 中 CPU_CFG_INT_DIS_MEAS_EN  未 #define'd
*
*                   参见 'cpu_core.h  函数原型  注意事项 #1'
*                          & 'cpu_core.h  CPU 包含文件    注意事项 #3'。
*
*               (b) 使用 CPU_CFG_INT_DIS_MEAS_OVRHD_NBR 配置要测量和平均中断禁用时间测量开销的次数。
*
*                   建议仅进行一次测量,即使对于启用指令高速缓存的 CPU,临界区也不会在指令缓存循环中调用。
*                   因此,对于大多数非缓存中断禁用时间测量,单次非缓存/非平均时间测量是更现实的开销。
*
*                   参见 'cpu_core.c  CPU_IntDisMeasInit()  注意事项 #3a'。
*********************************************************************************************************
*/
//CPU 中断禁用时间测量配置:
//CPU_CFG_INT_DIS_MEAS_EN: 启用或禁用测量 CPU 中断禁用时间的功能。
//CPU_CFG_INT_DIS_MEAS_OVRHD_NBR: 配置测量中断禁用时间开销的次数。建议仅测量一次开销。
#if 1          // Modified by fire (原是 0)                    /* 配置 CPU 中断禁用时间 ...                     */
#define  CPU_CFG_INT_DIS_MEAS_EN                                /* ... 测量功能(参见注意事项 #1a)。             */
#endif

                                                                /* 配置中断禁用开销测量的次数 ...                  */
#define  CPU_CFG_INT_DIS_MEAS_OVRHD_NBR                    1u   /* ... 时间测量(参见注意事项 #1b)。             */


/*$PAGE*/
/*
*********************************************************************************************************
*                                CPU计数前导零配置
*
* 注意事项:(1) 配置 CPU_CFG_LEAD_ZEROS_ASM_PRESENT 以在以下位置原型/定义计数前导零位数功能:
*
*               (a) 'cpu.h'/'cpu_a.asm',       如果在 'cpu.h'/'cpu_cfg.h' 中 CPU_CFG_LEAD_ZEROS_ASM_PRESENT      #define'd,则启用汇编版本的功能
*
*               (b) 'cpu_core.h'/'cpu_core.c',如果在 'cpu.h'/'cpu_cfg.h' 中 CPU_CFG_LEAD_ZEROS_ASM_PRESENT  未 #define'd,则启用 C 源码版本的功能
*********************************************************************************************************
*/
//CPU 前导零计数配置:
//CPU_CFG_LEAD_ZEROS_ASM_PRESENT: 启用汇编版本或 C 源码版本的计数前导零位数函数。
#if 1                                                           /* 配置 CPU 计数前导零位数 ...                  */
#define  CPU_CFG_LEAD_ZEROS_ASM_PRESENT                         /* ... 汇编版本(参见注意事项 #1)。             */
#endif



应用实例

好的,下面是一个简单的示例,展示了如何在代码中使用上述 cpu_cfg.h 中定义的一些宏:

#include <cpu_cfg.h>
#include <os.h>

#define TASK_PRIO_HIGH    10
#define TASK_PRIO_MEDIUM  15
#define TASK_PRIO_LOW     20

#define TASK_STACK_SIZE   256

// 定义任务堆栈
static CPU_STK task_stk_high[TASK_STACK_SIZE];
static CPU_STK task_stk_medium[TASK_STACK_SIZE];
static CPU_STK task_stk_low[TASK_STACK_SIZE];

// 任务函数
void TaskHighPrio(void *p_arg);
void TaskMediumPrio(void *p_arg);
void TaskLowPrio(void *p_arg);

int main(void) {
    OS_ERR os_err;

    // 初始化uC/OS-III内核
    OSInit(&os_err);

    // 创建任务
    OSTaskCreate(&TaskHighPrio,
                 (void *)0,
                 &task_stk_high[TASK_STACK_SIZE - 1],
                 TASK_PRIO_HIGH);

    OSTaskCreate(&TaskMediumPrio,
                 (void *)0,
                 &task_stk_medium[TASK_STACK_SIZE - 1],
                 TASK_PRIO_MEDIUM);

    OSTaskCreate(&TaskLowPrio,
                 (void *)0,
                 &task_stk_low[TASK_STACK_SIZE - 1],
                 TASK_PRIO_LOW);

    // 启动uC/OS-III内核
    OSStart(&os_err);

    return 0;
}

// 高优先级任务函数
void TaskHighPrio(void *p_arg) {
    while (1) {
        // 高优先级任务逻辑
        OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, NULL);
    }
}

// 中优先级任务函数
void TaskMediumPrio(void *p_arg) {
    while (1) {
        // 中优先级任务逻辑
        OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, NULL);
    }
}

// 低优先级任务函数
void TaskLowPrio(void *p_arg) {
    while (1) {
        // 低优先级任务逻辑
        OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_HMSM_STRICT, NULL);
    }
}

在这个示例中,我们使用了 cpu_cfg.h 中定义的宏来设置任务的优先级和堆栈大小。同时,任务函数中的 OSTimeDlyHMSM 函数用于模拟任务执行的延迟。这里只是一个简单的示例,实际的应用中,你需要根据具体的需求来编写任务函数和任务创建的逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/585169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis源码学习记录:列表 (ziplist)

ziplist redis 源码版本&#xff1a;6.0.9。ziplist 的代码均在 ziplist.c / ziplist.h 文件中。 定义 ziplist总体布局如下&#xff1a; <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend> zlbytes&#xff1a;uin…

stm32单片机开发一、中断之外部中断实验

stm32单片机的外部中断和定时器中断、ADC中断等都由stm32的内核中的NVIC模块控制&#xff0c;stm32的中断有很多中&#xff0c;比如供电不足中断&#xff0c;当供电不足时&#xff0c;会产生的一种中断&#xff0c;这么多中断如果都接在CPU上&#xff0c;或者说CPU去处理&#…

普乐蛙元宇宙VR体验馆设备集体亮相VR文旅景区展

普乐蛙全国巡展又双叒叕开始了! 这次来到的是“好客山东”↓↓ 山东2024休闲旅游产业展 4月25日至27日&#xff0c;2024休闲旅游产业展在临沂国际博览中心举办。本次展会以“潮购文旅好品&#xff0c;乐享时尚生活”为主题&#xff0c;汇聚全国文旅产业上下游500多家企业、上万…

基于FCN网络实现的多类别图像分割任务

1、前言 FCN 作为图像分割的开山之作&#xff0c;将分割任务作为逐个像素点的分类任务 之前完成了基于unet、resnetunet、deeplab等等网络的分割任务&#xff0c;具体的可以参考本专栏&#xff1a; 图像分割_听风吹等浪起的博客-CSDN博客 因为FCN网络的实现较为复杂&#xf…

【阿里笔试题汇总】[全网首发] 2024-04-29-阿里国际春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新阿里国际近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中&#xff0c;接收方多数都要求英文面试。如果导师的母语为非英语国家&#xff0c;将会带有口音&#xff0c;这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度&#xff0c;使自己的英语表达更加流利&#xff0c;知识人网小…

01数学建模 -线性规划

1.1线性规划–介绍 翻译翻译什么叫惊喜 1.2线性规划–原理 拉格朗日乘数法手算 最值化 f ( x , y ) , s . t . g ( x , y ) c , 引入参数 λ &#xff0c;有&#xff1a; F ( x , y , λ ) f ( x , y ) λ ( g ( x , y ) − c ) 再将其分别对 x , y , λ 求导&#xff0c…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

远程桌面的端口配置与优化

在现代企业环境中&#xff0c;远程桌面连接已成为日常工作中不可或缺的一部分。然而&#xff0c;随着网络攻击的增加&#xff0c;确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议&#xff08;RDP&#xff09;默…

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…

无人机反制:雷达探测+信号干扰器技术详解

固定翼无人机、旋翼无人机等&#xff0c;可折叠式无机、DIY无人机等。黑飞&#xff0c;监管困难给航空业带来了诸多隐患&#xff1b;给恐怖袭击及间谍侦察带来新的方式、引发了各国地区政府的忧虑&#xff0c;在中国存在的问题更加严峻。 反无人飞行器防御系统(AUDS)&#xff0…

positivessl通配符证书签发13个月仅400元

PositiveSSL是Sectigo旗下的数字证书品牌&#xff0c;旗下的数字证书产品不仅具有签发速度快、性价比高以及兼容性高等特点&#xff0c;还可以为网站提供传输信息加密服务&#xff0c;保护客户隐私安全&#xff0c;提升客户对网站的信任度。今天就随SSL盾小编了解PositiveSSL旗…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

C#基础|对象初始化器与构造方法对比总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 对象初始化器的作用 为了更加灵活的初始化对象的“属性”&#xff0c;是对构造化方法的补充。 02 构造方法总结 2.1、存在的必要性&#xff1a;一个类中&#xff0c;至少要有一个构造方法&#xff08;有无参数均…

公网ip申请ssl仅260

现在很多网站都已经绑定域名&#xff0c;因此使用的都是域名SSL证书保护网站传输信息安全&#xff0c;而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书&#xff0c;用来保护用户的隐私以及数据安全&…

本地运行测试 YOLOv8(20240423)

一、环境搭建请参考&#xff1a;Win10 搭建 YOLOv8 运行环境&#xff08;20240423&#xff09;-CSDN博客 二、安装 PyCham 1.1、下载安装 官网地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 阿里云盘&#xff08;社区…

免费的单片机物联网MQTT平台选择

目的是多设备接入中控&#xff0c;平台只做转发。 选择巴法云&#xff1a;巴法科技&巴法云-巴法设备云-巴法物联网云平台 clientId是私钥uid&#xff1a; 多设备 clientId 填同一个 uid 都是可以的。平台应该是加了后缀区分。 支持自定义topic&#xff0c;操作简单&#x…

Stable Diffusion使用ControlNet:IP-Adapter实现图片风格迁移

IP-Adapter 全称是 Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models&#xff08;文本到图像扩散模型的文本兼容图像提示适配器&#xff09;&#xff0c;是腾讯研究院出品的一个新的ControlNet模型&#xff0c;旨在使预训练的文本到图像扩散模型能够生…

【Qt之·控件·样式表】

系列文章目录 文章目录 前言一、Qt样式表的基础知识1.1 Qt样式表的定义和语法规则1.2 Qt样式表中的选择器和属性1.2.1 盒子模型1.2.2 border 1.3 Qt样式表中的伪类和伪元素 二、编写基本的Qt样式表2.1 在Qt应用程序中引入样式表文件的方式2.2 设置基本的背景色、字体样式等 三、…

Anomalib:用于异常检测的深度学习库!

大家好,今天给大家介绍了一个用于无监督异常检测和定位的新型库:anomalib,Github链接:https://github.com/openvinotoolkit/anomalib 简介 考虑到可重复性和模块化,这个开源库提供了文献中的算法和一组工具,以通过即插即用的方法设计自定义异常检测算法。 Anomalib 包…
最新文章