【UCOS-III】自我学习笔记→第27讲→优先级翻转

news2024/9/21 5:21:07

文章目录

    • 前言
      • 实验步骤
        • 1.复制二值信号量工程,添加task2和task3,修改任务服务函数名称
        • 2.修改开始任务,任务1以及任务2、3的内容
        • 3.查看串口现象![在这里插入图片描述](https://img-blog.csdnimg.cn/efa5ee2d92b54fe8be5a419adcf92ead.png)
      • 测试代码
      • 工程文件
      • 总结

前言

无,仅作记录,不具有参考价值,所用开发板为STM32F411RET6nucleo开发板。

实验步骤

1.复制二值信号量工程,添加task2和task3,修改任务服务函数名称

在这里插入图片描述

2.修改开始任务,任务1以及任务2、3的内容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.查看串口现象在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

测试代码

us-os3_demo.c:

/**
 ****************************************************************************************************
 * @file        uc-os3_demo.c
 * @author      ÕýµãÔ­×ÓÍŶÓ(ALIENTEK)
 * @version     V1.0
 * @date        2022-04-13
 * @brief       uC/OS-III ÒÆֲʵÑé
 * @license     Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
 ****************************************************************************************************
 * @attention
 *
 * ʵÑéƽ̨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å
 * ÔÚÏßÊÓƵ:www.yuanzige.com
 * ¼¼ÊõÂÛ̳:www.openedv.com
 * ¹«Ë¾ÍøÖ·:www.alientek.com
 * ¹ºÂòµØÖ·:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#include "uc-os3_demo.h"
#include "./MALLOC/malloc.h"
/*uC/OS-III*********************************************************************************************/
#include "os.h"
#include "cpu.h"
#include "main.h"
#include "key.h"
#include "stdio.h"
#include "interrupt.h"
#include "./SYSTEM/delay/delay.h"
extern struct keys key[4];
/******************************************************************************************************/
/*uC/OS-IIIÅäÖÃ*/

/* START_TASK ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define START_TASK_PRIO				5
#define START_TASK_STACK_SIZE 256
CPU_STK start_task_stack[START_TASK_STACK_SIZE];
OS_TCB start_task_tcb;

void start_task(void * p_arg);

/* TASK1 ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define TASK1_PRIO				4
#define TASK1_STACK_SIZE 256
CPU_STK * task1_stack;
OS_TCB task1_tcb;

void low_task(void * p_arg);


/* TASK2 ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define TASK2_PRIO				3
#define TASK2_STACK_SIZE 256
CPU_STK * task2_stack;
OS_TCB task2_tcb;

void middle_task(void * p_arg);


/* TASK3 ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define TASK3_PRIO				2
#define TASK3_STACK_SIZE 256
CPU_STK * task3_stack;
OS_TCB task3_tcb;

void high_task(void * p_arg);

OS_SEM binary_sem;

/**
 * @brief       uC/OS-IIIÀý³ÌÈë¿Úº¯Êý
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void uc_os3_demo(void)
{
    OS_ERR err;
    
    /* ³õʼ»¯uC/OS-III */
    OSInit(&err);
    OSTaskCreate (  (OS_TCB        *) &start_task_tcb,
                    (CPU_CHAR      *) "start_task",
                    (OS_TASK_PTR    ) start_task,
                    (void          *) 0,
                    (OS_PRIO        ) START_TASK_PRIO,
                    (CPU_STK       *) start_task_stack,
                    (CPU_STK_SIZE   ) START_TASK_STACK_SIZE / 10,
                    (CPU_STK_SIZE   ) START_TASK_STACK_SIZE,
                    (OS_MSG_QTY     ) 0,
                    (OS_TICK        ) 0,
                    (void          *) 0,
                    (OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                    (OS_ERR        *) &err);
    /* ¿ªÊ¼ÈÎÎñµ÷¶È */
    OSStart(&err);
}

void start_task(void * p_arg)
{
	OS_ERR err;
	CPU_INT32U cnts = 0;
	CPU_Init();
	CPU_SR_ALLOC();
	

	cnts = HAL_RCC_GetSysClockFreq() / OS_CFG_TICK_RATE_HZ;
	OS_CPU_SysTickInit(cnts);
	
	/* ´´½¨¶þÖµÐźÅÁ¿ */
	OSSemCreate (&binary_sem, "binary_sem", 1, &err);
	
	CPU_CRITICAL_ENTER(); /* ½øÈëÁÙ½çÇø */
	task1_stack = mymalloc(SRAMIN, TASK1_STACK_SIZE * sizeof(CPU_STK));
	task2_stack = mymalloc(SRAMIN, TASK2_STACK_SIZE * sizeof(CPU_STK));
	task3_stack = mymalloc(SRAMIN, TASK3_STACK_SIZE * sizeof(CPU_STK));
	/* ´´½¨µÍÓÅÏȼ¶ÈÎÎñ */
	OSTaskCreate ((OS_TCB        *) &task1_tcb,
								(CPU_CHAR      *) "low_task",
								(OS_TASK_PTR    ) low_task,
								(void          *) 0,
								(OS_PRIO        ) TASK1_PRIO,
								(CPU_STK       *) task1_stack,
								(CPU_STK_SIZE   ) TASK1_STACK_SIZE / 10,
								(CPU_STK_SIZE   ) TASK1_STACK_SIZE,
								(OS_MSG_QTY     ) 0,
								(OS_TICK        ) 0,
								(void          *) 0,
								(OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
								(OS_ERR        *) &err);
								
	/* ´´½¨ÖеÈÓÅÏȼ¶ÈÎÎñ */
	OSTaskCreate ((OS_TCB        *) &task2_tcb,
								(CPU_CHAR      *) "middle_task",
								(OS_TASK_PTR    ) middle_task,
								(void          *) 0,
								(OS_PRIO        ) TASK2_PRIO,
								(CPU_STK       *) task2_stack,
								(CPU_STK_SIZE   ) TASK2_STACK_SIZE / 10,
								(CPU_STK_SIZE   ) TASK2_STACK_SIZE,
								(OS_MSG_QTY     ) 0,
								(OS_TICK        ) 0,
								(void          *) 0,
								(OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
								(OS_ERR        *) &err);
								
	/* ´´½¨¸ßÓÅÏȼ¶ÈÎÎñ */
	OSTaskCreate ((OS_TCB        *) &task3_tcb,
								(CPU_CHAR      *) "high_task",
								(OS_TASK_PTR    ) high_task,
								(void          *) 0,
								(OS_PRIO        ) TASK3_PRIO,
								(CPU_STK       *) task3_stack,
								(CPU_STK_SIZE   ) TASK3_STACK_SIZE / 10,
								(CPU_STK_SIZE   ) TASK3_STACK_SIZE,
								(OS_MSG_QTY     ) 0,
								(OS_TICK        ) 0,
								(void          *) 0,
								(OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
								(OS_ERR        *) &err);
		

		CPU_CRITICAL_EXIT(); /* Í˳öÁÙ½çÇø */
		printf("ÕýÔÚ´´½¨ÖÐ\r\n");
		OSTaskDel((OS_TCB*)0, &err); //±ðÍüÁËɾ³ýÈÎÎñStart
}

/* µÍÓÅÏȼ¶ÈÎÎñ */
void low_task(void * p_arg)
{
	OS_ERR err;
	while(1)
	{
		printf("low_task»ñÈ¡¶þÖµÐźÅÁ¿!!\r\n");
		OSSemPend(&binary_sem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
		printf("low_taskÕýÔÚÔËÐÐ!!\r\n");
		delay_ms(3000);
		printf("low_taskÊͷŶþÖµÐźÅÁ¿!!\r\n");
		OSSemPost(&binary_sem, OS_OPT_PEND_ABORT_1, &err);
		OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
	}
}

/* ÖеÈÓÅÏȼ¶ÈÎÎñ */
void middle_task(void * p_arg)
{
	OS_ERR err;
	while(1)
	{
		printf("middle_taskÕýÔÚÔËÐÐ!!!\r\n");
		OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
	}
}

/* ¸ßÓÅÏȼ¶ÈÎÎñ */
void high_task(void * p_arg)
{
	OS_ERR err;
	while(1)
	{
		printf("high_task»ñÈ¡¶þÖµÐźÅÁ¿!!\r\n");
		OSSemPend(&binary_sem, 0, OS_OPT_PEND_BLOCKING, 0, &err);
		printf("high_taskÕýÔÚÔËÐÐ!!\r\n");
		delay_ms(1000);
		printf("high_taskÊͷŶþÖµÐźÅÁ¿!!\r\n");
		OSSemPost(&binary_sem, OS_OPT_PEND_ABORT_1, &err);
		OSTimeDly(1000, OS_OPT_TIME_DLY, &err);
	}
}



工程文件

优先级翻转实验

总结

【正点原子】手把手教你学UCOS-III实时操作系统第27讲优先级翻转

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32速成笔记—DMA

文章目录 一、什么是DMA二、DMA有什么作用三、STM32的DMA3.1 DMA请求3.2 DMA通道3.3 仲裁器 四、DMA配置4.1 DMA配置步骤4.2 DMA结构体成员 五、DMA配置程序5.1 ADC1初始化程序5.2 DMA初始化程序 一、什么是DMA DMA全程Direct Memory Access,即直接存储器访问。简单…

如何保护阿里云服务器免受DDoS攻击和恶意访问?有哪些防护措施?

如何保护阿里云服务器免受DDoS攻击和恶意访问?有哪些防护措施?   [本文由阿里云代理商[聚搜云]撰写]   随着互联网技术的不断发展,网络安全问题日益严峻,保护服务器免受DDoS攻击和恶意访问成为了每个企业和网站建设者的关注重…

W3B x Sui Hacker House|深入了解Sui和Move语言

Web3 Builders(W3B)作为Hacker House的践行者,将于6月23日(周五)早上8点(GMT8)举办首期 W3B x Sui Hacker House 系列活动分享会。本期活动邀请到Sui联合创始人Sam Blackshear(Move语…

【机器学习】机器学习的基本概念

机器学习是我们现在接触人工智能领域首先要去掌握的知识,下面是我学习记录的一些关于机器学习的基础、常见的概念和定义。 目录 机器学习定义 机器学习过程 假设关系 训练数据 损失函数(正向传播) 优化(反向传播&#xff0…

PC市场:寒冬敲响警钟,蓄势待发的复兴之路

近年来,PC市场的增长确实放缓,但这并不意味着它已经进入了寒冬。相反,PC市场正在蓄势待发,寻找复兴之路。 首先,PC市场仍然是一个巨大的市场。尽管移动设备的普及使得一些用户更多地使用手机和平板电脑,但…

C++:虚函数

C面向对象的三个特性,封装继承多态。在继承的关系中,所有的东西都可以被继承下来,如数据可以被继承下来在内存,而函数的继承则是继承调用权。 虚函数主要是通过虚函数表来实现,每个类都有自己的虚表,当你创…

RevCol:大模型架构设计新范式,给神经网络架构增加了一个维度!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2212.11696.pdf 项目代码:https://github.com/megvii-research/RevCol 计…

把金融航母开进智能峡湾,总共分几步?

试想一下,有这么一家街头小店。夫妻两个勤奋经营,诚信待客,广受街里街坊的欢迎。他们流水稳定,蒸蒸日上,商业信誉很好,甚至是非物质文化遗产的传承者。这样一家店,在扩大经营,拓展业…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 …

C语言代码函数栈帧的创建与销毁(修炼内功)

目录 在前期的学习中我们可能有很多困惑 例如:局部变量是怎么创建的 为什么局部变量的值是随机值 函数是怎么样传参的 传参的顺序是什么 形参和实参的关系是什么 函数调用是怎么做的 函数掉调用结束后怎么返回的 这篇博客我们来修炼自己的内功,掌握好这篇…

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍 网格搜索、随机搜索和贝叶斯优化是寻找机器学习模型参数最佳组合、交叉验证每个参数并确定哪一个参数具有最佳性能的常用方法。 一、 评估指标 1、…

STM32F103基于HAL工程挂载FatFS驱动SD卡

STM32F103基于HAL工程挂载FatFS驱动SD卡 📌基于标准库驱动《STM32挂载SD卡基于Fatfs文件系统读取文件信息》 🎬驱动实验效果: 🔨通过STM32cubemx配置SPI1作为访问SD、TF卡通讯方式。 🔧在STM32cubemx配置中挂载中…

Scala入门【变量和数据类型】

目录 Scala基本认知 Hello Scala 方法的定义 伴生对象 Java: Scala: 2、变量和数据类型 2.1、注释 2.2、变量和常量 Java中的变量和常量 Scala基本语法 2.3、标识符 2.4、字符串 基本语法 2.5、标准输入输出 基本语法 2.6、文件的读写 …

6-8 二分查找

今天是端午节,祝大家端午节快乐~ 竟然这样,还不点点赞。 言归正传┏ (゜ω゜)☞ 目录 引入 二分查找算法思想 时间复杂度O(logN) 二分查找算法描述 二分查找算法的框架如下: 例题1: 例题2&#x…

秒懂SpringBoot之如何集成SpringDoc(全网目前最新最系统最全面的springdoc教程)

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 文章目录 概述概念解释SpringDoc使用简单集成配置文档信息配置文档分组使用注解TagOperationSchemaParameterParametersApiResponses 和ApiResponse 认证授权无需认证需要认证 总结源码 概述 近来颇为懈…

13. WebGPU 正交投影

在上一篇文章中,讨论了矩阵的工作原理。讨论了如何通过 1 个矩阵和一些神奇的矩阵数学来完成平移、旋转、缩放,甚至从像素到裁剪空间的投影。实现 3D 操作 只需要再向前迈一小步。 在之前的 2D 示例中,将 2D 点 (x, y) 乘以 3x3 矩阵。要实现…

【机器学习】——续上:卷积神经网络(CNN)与参数训练

目录 引入 一、CNN基本结构 1、卷积层 2、下采样层 3、全连接层 二、CNN参数训练 总结 引入 卷积神经网络(CNN)是一种有监督深度模型框架,尤其适合处理二维数据问题,如行人检测、人脸识别、信号处理等领域,是带…

19c rac添加节点

在正常的节点 [rootdb1 ~]# xhost access control disabled, clients can connect from any host [rootdb1 ~]# su - grid ASM1:/home/griddb1>export DISPLAY:1.0 ASM1:/home/griddb1>$ORACLE_HOME/gridSetup.sh [rootdb2 ~]# /tmp/GridSetupActions2021-09-16_…

基于Nginx1.22+PHP8+MySQL8安装Discuz! X3.5

基于Nginx1.22PHP8MySQL8安装Discuz! X3.5 1. 安装PHP82. 安装MySQL83. 配置Nginx1.224. 安装Discuz! X3.5 1. 安装PHP8 更新系统: yum update安装EPEL存储库: yum install epel-release安装Remi存储库(提供了最新的 PHP 版本)&…

【十三】druid 原理解析

druid 原理解析 先前写了一篇博客关于druid集成相关的,这里来分析一下druid原理,结合这两篇文章希望读者能够把druid理解透彻。 一、druid介绍 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能&…