μC/OS-II---Task管理2(os_task.c)

目录

    • 改变Task优先级
    • Task挂起
    • Task恢复
    • Task信息获取
    • Task调度器上锁(os_core.c)
    • Task调度器开锁(os_core.c)

在这里插入图片描述

改变Task优先级

#if OS_TASK_CHANGE_PRIO_EN > 0u
INT8U  OSTaskChangePrio (INT8U  oldprio,
												 INT8U  newprio)
{
#if (OS_EVENT_EN)
	OS_EVENT  *pevent;
#if (OS_EVENT_MULTI_EN > 0u)
	OS_EVENT **pevents;
#endif
#endif
	OS_TCB    *ptcb;
	INT8U      y_new;
	INT8U      x_new;
	INT8U      y_old;
	OS_PRIO    bity_new;
	OS_PRIO    bitx_new;
	OS_PRIO    bity_old;
	OS_PRIO    bitx_old;
#if OS_CRITICAL_METHOD == 3u
	OS_CPU_SR  cpu_sr = 0u;                                 /* Storage for CPU status register         */
#endif
	/*$PAGE*/
#if OS_ARG_CHK_EN > 0u
	
	if (oldprio >= OS_LOWEST_PRIO)
	{
		if (oldprio != OS_PRIO_SELF)
		{
			return (OS_ERR_PRIO_INVALID);
		}
	}
	
	if (newprio >= OS_LOWEST_PRIO)
	{
		return (OS_ERR_PRIO_INVALID);
	}
	
#endif
	OS_ENTER_CRITICAL();
	
	if (OSTCBPrioTbl[newprio] != (OS_TCB *)0)               /* New priority must not already exist     */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_PRIO_EXIST);
	}
	
	if (oldprio == OS_PRIO_SELF)                            /* See if changing self                    */
	{
		oldprio = OSTCBCur->OSTCBPrio;                      /* Yes, get priority                       */
	}
	
	ptcb = OSTCBPrioTbl[oldprio];
	
	if (ptcb == (OS_TCB *)0)                                /* Does task to change exist?              */
	{
		OS_EXIT_CRITICAL();                                 /* No, can't change its priority!          */
		return (OS_ERR_PRIO);
	}
	
	if (ptcb == OS_TCB_RESERVED)                            /* Is task assigned to Mutex               */
	{
		OS_EXIT_CRITICAL();                                 /* No, can't change its priority!          */
		return (OS_ERR_TASK_NOT_EXIST);
	}
	
#if OS_LOWEST_PRIO <= 63u
	y_new                 = (INT8U) (newprio >> 3u);        /* Yes, compute new TCB fields             */
	x_new                 = (INT8U) (newprio & 0x07u);
#else
	y_new                 = (INT8U) ((INT8U) (newprio >> 4u) & 0x0Fu);
	x_new                 = (INT8U) (newprio & 0x0Fu);
#endif
	bity_new              = (OS_PRIO) (1uL << y_new);
	bitx_new              = (OS_PRIO) (1uL << x_new);
	OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                    /* Remove TCB from old priority            */
	OSTCBPrioTbl[newprio] =  ptcb;                          /* Place pointer to TCB @ new priority     */
	y_old                 =  ptcb->OSTCBY;
	bity_old              =  ptcb->OSTCBBitY;
	bitx_old              =  ptcb->OSTCBBitX;
	
	if ((OSRdyTbl[y_old] &   bitx_old) != 0u)               /* If task is ready make it not            */
	{
		OSRdyTbl[y_old] &= (OS_PRIO)~bitx_old;
		
		if (OSRdyTbl[y_old] == 0u)
		{
			OSRdyGrp &= (OS_PRIO)~bity_old;
		}
		
		OSRdyGrp        |= bity_new;                       /* Make new priority ready to run          */
		OSRdyTbl[y_new] |= bitx_new;
	}
	
#if (OS_EVENT_EN)
	pevent = ptcb->OSTCBEventPtr;
	
	if (pevent != (OS_EVENT *)0)
	{
		pevent->OSEventTbl[y_old] &= (OS_PRIO)~bitx_old;    /* Remove old task prio from wait list     */
		
		if (pevent->OSEventTbl[y_old] == 0u)
		{
			pevent->OSEventGrp    &= (OS_PRIO)~bity_old;
		}
		
		pevent->OSEventGrp        |= bity_new;              /* Add    new task prio to   wait list     */
		pevent->OSEventTbl[y_new] |= bitx_new;
	}
	
#if (OS_EVENT_MULTI_EN > 0u)
	
	if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0)
	{
		pevents =  ptcb->OSTCBEventMultiPtr;
		pevent  = *pevents;
		
		while (pevent != (OS_EVENT *)0)
		{
			pevent->OSEventTbl[y_old] &= (OS_PRIO)~bitx_old;   /* Remove old task prio from wait lists */
			
			if (pevent->OSEventTbl[y_old] == 0u)
			{
				pevent->OSEventGrp    &= (OS_PRIO)~bity_old;
			}
			
			pevent->OSEventGrp        |= bity_new;          /* Add    new task prio to   wait lists    */
			pevent->OSEventTbl[y_new] |= bitx_new;
			pevents++;
			pevent                     = *pevents;
		}
	}
	
#endif
#endif
	ptcb->OSTCBPrio = newprio;                              /* Set new task priority                   */
	ptcb->OSTCBY    = y_new;
	ptcb->OSTCBX    = x_new;
	ptcb->OSTCBBitY = bity_new;
	ptcb->OSTCBBitX = bitx_new;
	OS_EXIT_CRITICAL();
	
	if (OSRunning == OS_TRUE)
	{
		OS_Sched();                                         /* Find new highest priority task          */
	}
	
	return (OS_ERR_NONE);
}
#endif

Task挂起

#if OS_TASK_SUSPEND_EN > 0u
INT8U  OSTaskSuspend (INT8U prio)
{
	BOOLEAN    self;
	OS_TCB    *ptcb;
	INT8U      y;
	#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
		OS_CPU_SR  cpu_sr = 0u;
	#endif
	#if OS_ARG_CHK_EN > 0u
		
		if (prio == OS_TASK_IDLE_PRIO)                              /* Not allowed to suspend idle task    */
		{
			return (OS_ERR_TASK_SUSPEND_IDLE);
		}
		
		if (prio >= OS_LOWEST_PRIO)                                 /* Task priority valid ?               */
		{
			if (prio != OS_PRIO_SELF)
			{
				return (OS_ERR_PRIO_INVALID);
			}
		}
		
	#endif
		OS_ENTER_CRITICAL();
		
		if (prio == OS_PRIO_SELF)                                   /* See if suspend SELF                 */
		{
			prio = OSTCBCur->OSTCBPrio;
			self = OS_TRUE;
		}
		
		else if (prio == OSTCBCur->OSTCBPrio)                       /* See if suspending self              */
		{
			self = OS_TRUE;
		}
		
		else
		{
			self = OS_FALSE;                                        /* No suspending another task          */
		}
		
		ptcb = OSTCBPrioTbl[prio];
		
		if (ptcb == (OS_TCB *)0)                                    /* Task to suspend must exist          */
		{
			OS_EXIT_CRITICAL();
			return (OS_ERR_TASK_SUSPEND_PRIO);
		}
		
		if (ptcb == OS_TCB_RESERVED)                                /* See if assigned to Mutex            */
		{
			OS_EXIT_CRITICAL();
			return (OS_ERR_TASK_NOT_EXIST);
		}
		
		y            = ptcb->OSTCBY;
		OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX;                   /* Make task not ready                 */
		
		if (OSRdyTbl[y] == 0u)
		{
			OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
		}
		
		ptcb->OSTCBStat |= OS_STAT_SUSPEND;                         /* Status of task is 'SUSPENDED'       */
		OS_EXIT_CRITICAL();
		
		if (self == OS_TRUE)                                        /* Context switch only if SELF         */
		{
			OS_Sched();                                             /* Find new highest priority task      */
		}
		
		return (OS_ERR_NONE);
}
#endif

Task恢复

#if OS_TASK_SUSPEND_EN > 0u
INT8U  OSTaskResume (INT8U prio)
{
	OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3u                                  /* Storage for CPU status register       */
	OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (prio >= OS_LOWEST_PRIO)                               /* Make sure task priority is valid      */
	{
		return (OS_ERR_PRIO_INVALID);
	}
	
#endif
	OS_ENTER_CRITICAL();
	ptcb = OSTCBPrioTbl[prio];
	
	if (ptcb == (OS_TCB *)0)                                  /* Task to suspend must exist            */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TASK_RESUME_PRIO);
	}
	
	if (ptcb == OS_TCB_RESERVED)                              /* See if assigned to Mutex              */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TASK_NOT_EXIST);
	}
	
	if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY)   /* Task must be suspended                */
	{
		ptcb->OSTCBStat &= (INT8U)~ (INT8U)OS_STAT_SUSPEND;   /* Remove suspension                     */
		
		if (ptcb->OSTCBStat == OS_STAT_RDY)                   /* See if task is now ready              */
		{
			if (ptcb->OSTCBDly == 0u)
			{
				OSRdyGrp               |= ptcb->OSTCBBitY;    /* Yes, Make task ready to run           */
				OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
				OS_EXIT_CRITICAL();
				
				if (OSRunning == OS_TRUE)
				{
					OS_Sched();                               /* Find new highest priority task        */
				}
			}
			
			else
			{
				OS_EXIT_CRITICAL();
			}
		}
		
		else                                                  /* Must be pending on event              */
		{
			OS_EXIT_CRITICAL();
		}
		
		return (OS_ERR_NONE);
	}
	
	OS_EXIT_CRITICAL();
	return (OS_ERR_TASK_NOT_SUSPENDED);
}
#endif

Task信息获取

#if OS_TASK_QUERY_EN > 0u
INT8U  OSTaskQuery (INT8U    prio,
										OS_TCB  *p_task_data)
{
	OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (prio > OS_LOWEST_PRIO)                   /* Task priority valid ?                              */
	{
		if (prio != OS_PRIO_SELF)
		{
			return (OS_ERR_PRIO_INVALID);
		}
	}
	
	if (p_task_data == (OS_TCB *)0)              /* Validate 'p_task_data'                             */
	{
		return (OS_ERR_PDATA_NULL);
	}
	
#endif
	OS_ENTER_CRITICAL();
	
	if (prio == OS_PRIO_SELF)                    /* See if suspend SELF                                */
	{
		prio = OSTCBCur->OSTCBPrio;
	}
	
	ptcb = OSTCBPrioTbl[prio];
	
	if (ptcb == (OS_TCB *)0)                     /* Task to query must exist                           */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_PRIO);
	}
	
	if (ptcb == OS_TCB_RESERVED)                 /* Task to query must not be assigned to a Mutex      */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TASK_NOT_EXIST);
	}
	
	/* Copy TCB into user storage area                    */
	OS_MemCopy ((INT8U *)p_task_data, (INT8U *)ptcb, sizeof (OS_TCB));
	OS_EXIT_CRITICAL();
	return (OS_ERR_NONE);
}
#endif

Task调度器上锁(os_core.c)

#if OS_SCHED_LOCK_EN > 0u
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	
	if (OSRunning == OS_TRUE)                    /* Make sure multitasking is running                  */
	{
		OS_ENTER_CRITICAL();
		
		if (OSIntNesting == 0u)                  /* Can't call from an ISR                             */
		{
			if (OSLockNesting < 255u)            /* Prevent OSLockNesting from wrapping back to 0      */
			{
				OSLockNesting++;                 /* Increment lock nesting level                       */
			}
		}
		
		OS_EXIT_CRITICAL();
	}
}
#endif

Task调度器开锁(os_core.c)

#if OS_SCHED_LOCK_EN > 0u
void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	
	if (OSRunning == OS_TRUE)                              /* Make sure multitasking is running        */
	{
		OS_ENTER_CRITICAL();
		
		if (OSIntNesting == 0u)                            /* Can't call from an ISR                   */
		{
			if (OSLockNesting > 0u)                        /* Do not decrement if already 0            */
			{
				OSLockNesting--;                           /* Decrement lock nesting level             */
				
				if (OSLockNesting == 0u)                   /* See if scheduler is enabled              */
				{
					OS_EXIT_CRITICAL();
					OS_Sched();                            /* See if a HPT is ready                    */
				}
				
				else
				{
					OS_EXIT_CRITICAL();
				}
			}
			
			else
			{
				OS_EXIT_CRITICAL();
			}
		}
		
		else
		{
			OS_EXIT_CRITICAL();
		}
	}
}
#endif

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

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

相关文章

2023/11/14JAVA学习

主子线程每次执行顺序可能都不一样

什么猫罐头好吃?猫咪嘎嘎炫的5款猫主食罐头推荐!

想必铲屎官都知道给猫咪长期吃主食罐头的好处了吧&#xff01;主食罐头不仅营养丰富&#xff0c;还能让猫咪顺便补充水分。有时候猫咪食欲不佳&#xff0c;一罐猫主食罐头就能让它们胃口大开呢~ 作为家里有3只猫的铲屎官来说&#xff0c;养猫的这几年可以说血泪史了&#xff0…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

HTML5响应式网页设计(考试题:旅游项目)

效果图 .html代码 <!DOCTYPE html> <html><head><meta name"viewport"content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalableno" /><meta charset"utf-8" /><title></…

keil5暗色主题配置

在keil文件目录下找到global.prop 将以下内容替换至该文件即可 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page0 caretline.visible0 highlight.matchingbraces1 print.syntax.coloring1 use.tab.color1 crea…

leetcode刷题日记:121. Best Time to Buy and Sell Stock( 买卖股票的最佳时机)

题目给了我们一组数prices&#xff0c;其中prices[i]表示第i天的股票价格&#xff0c;需要我们求出买卖股票所能获得的最大收益。 我们的第一想法就是从算出每一种买卖股票的情况然后求出里面的最大值&#xff0c;这样我们就能得到最大收益是多少&#xff0c;但是这种情况过于复…

LLM(四)| Chinese-LLaMA-Alpaca:包含中文 LLaMA 模型和经过指令微调的 Alpaca 大型模型

论文题目&#xff1a;《EFFICIENT AND EFFECTIVE TEXT ENCODING FOR CHINESE LL AMA AND ALPACA》 ​论文地址&#xff1a;https://arxiv.org/pdf/2304.08177v1.pdf Github地址&#xff1a;https://github.com/ymcui/Chinese-LLaMA-Alpaca 一、项目介绍 通过在原有的LLaMA词…

Lua的Resty-Request库写的一个简单爬虫

文章目录 准备工作编写爬虫运行爬虫代码分析拓展功能总结 &#x1f389;欢迎来到AIGC人工智能专栏~Lua的Resty-Request库写的一个简单爬虫 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;AIGC人工智…

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

HTTP代理与SOCKS5代理,有什么区别?

在数字通信领域&#xff0c;数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议&#xff0c;每种协议都有独特的优势和挑战。其中&#xff0c;SOCKS5 代理、HTTP代理最为广泛使用&#xff0c;下面给大家一起讨论&#xff0c;HTTP代理与SOCKS5代理&#xff0c…

[文件读取]coldfusion 文件读取 (CVE-2010-2861)

1.1漏洞描述 漏洞编号CVE-2010-2861漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品&#xff0c;其运行的CFML&#xff08;ColdFusion Markup Language&#xff09;是针对Web应用的一种程序设计语言。 A…

市场行情回暖、利好月来袭,Web3 广告业领头羊 Verasity 或迎爆发

随着区块链技术的普及和发展&#xff0c;越来越多的行业正在被区块链技术所重塑&#xff0c;例如金融、游戏行业等&#xff0c;而数字广告行业的结构和运作方式也正在被区块链技术所重塑。 众所周知&#xff0c;传统数字广告行业往往存在着信息不对称、广告欺诈、数字隐私等问题…

《008.SpringBoot之教务系统》【界面简洁功能简单】

《008.SpringBoot之教务系统》【界面简洁功能简单】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;JSPBootStrap; [2]功能模块展示&#xff1a; 管…

顺序表和链表

目录 1.线性表 2.顺序表 2.1 概念及结构 2.2 接口实现 2.3 顺序表的问题及思考 3.链表 3.1 链表的概念及结构 3.2 链表的分类 3.3 链表的实现 3.4双向链表的实现 4.顺序表和链表的区别和联系 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的…

OpenMediaVault控制台web页面密码重置

要重置 OpenMediaVault&#xff08;OMV&#xff09;Web 控制台的密码&#xff0c;可以使用 omv-firstaid 命令行工具中的相应选项。按照以下步骤进行操作&#xff1a; 以管理员权限登录到 OMV 的命令行界面&#xff08;通过 SSH 或直接登录&#xff09;。 ssh登陆到root用户 运…

在windows上利用vmware17 搭建centos7 mini版本服务器

安装centos7mini 修改名称和安装路径 也可以点击自定义硬件&#xff0c;进行硬件配置修改 设置内存 设置处理器 点击下图按钮进行设置 点击done 点击开始安装 点击设置root密码 设置成功&#xff0c;点击done &#xff0c;root密码设置的简单的话需要按两次done 等待安装完成…

软考系统分析师知识点集锦二:系统规划

一、系统规划的步骤 (1)初步调查:根据企业战略目标&#xff0c;分析企业现状以及系统运行状况。(2)确定系统目标:确定系统的服务范围质量等。(3)分析子系统的组成:做系统划分并指定子系统功能。(4)拟定系统的实施方案:分析子系统优先级,确定开发顺序。(5)进行可行性研究:编写可…

接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

如何利用IP代理进行海外推广?

在当今数字化的时代&#xff0c;网络营销已经成为企业策略的重要组成部分。而对于进去海外市场的跨境玩家来说&#xff0c;海外的推广推广是重中之重。然而&#xff0c;在开展推广的过程中&#xff0c;我们常常会遇到各种挑战&#xff0c;如地域限制、访问速度慢等。 为了解决…

提前编译:AOT

JIT与AOT的区别 IT和AOT这个名词是指两种不同的编译方式&#xff0c;这两种编译方式的主要区别在于是否在“运行时”进行编译 (1)JIT&#xff0c;Just-in-time,动态(即时)编译&#xff0c;边运行边编译 在程序运行时&#xff0c;根据算法计算出热点代码&#xff0c;然后进行JI…