μ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
#endifOS_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 == 3uOS_CPU_SR  cpu_sr = 0u;                                 /* Storage for CPU status register         */
#endif/*$PAGE*/
#if OS_ARG_CHK_EN > 0uif (oldprio >= OS_LOWEST_PRIO){if (oldprio != OS_PRIO_SELF){return (OS_ERR_PRIO_INVALID);}}if (newprio >= OS_LOWEST_PRIO){return (OS_ERR_PRIO_INVALID);}#endifOS_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 <= 63uy_new                 = (INT8U) (newprio >> 3u);        /* Yes, compute new TCB fields             */x_new                 = (INT8U) (newprio & 0x07u);
#elsey_new                 = (INT8U) ((INT8U) (newprio >> 4u) & 0x0Fu);x_new                 = (INT8U) (newprio & 0x0Fu);
#endifbity_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
#endifptcb->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 > 0uif (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);}}#endifOS_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 > 0uif (prio >= OS_LOWEST_PRIO)                               /* Make sure task priority is valid      */{return (OS_ERR_PRIO_INVALID);}#endifOS_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 > 0uif (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);}#endifOS_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;
#endifif (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;
#endifif (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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 本地zabbix结合内网穿透工具实现安全远程访问浏览器

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

spring-cloud-alibaba-nacos

spring cloud nacos 安装和启动nacos # 解压nacos安装包 # tar -zvxf nacos-server-1.4.1.tar.gz# nacos默认是以集群的模式启动&#xff0c;此处先用单机模式 # cd /usr/local/mysoft/nacos/bin # sh startup.sh -m standalone# nacos 日志 # tail -f /usr/local/mysoft/na…

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

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

吊打Fast Request还免费? 这款插件真心好用!

今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;比Fast Request更好用并且完全免费&#xff01;三大亮点功能&#xff1a;写完代码IDEA内一键生成API文档&#xff1b;写完代码IDEA内一键调试&#xff0c;&#xff1b;生成API目录树&#xff0c;双击即可快速…

linux下安装向日葵

https://sunlogin.oray.com/download/linux?typepersonal下载 在文件所在位置的空白处右键&#xff08;在此处打开终端&#xff09; 输入命令&#xff1a; sudo dpkg -i 文件名.deb &#xff08;文件名为下载的deb文件名字&#xff09;/usr/local/sunlogin/bin/sunlogincl…

应急响应练习1

目录 1. 提交攻击者的IP地址 2. 识别攻击者使用的操作系统 3. 找出攻击者资产收集所使用的平台 4. 提交攻击者目录扫描所使用的工具名称 5. 提交攻击者首次攻击成功的时间&#xff0c;格式&#xff1a;DD /MM/YY:HH:MM:SS 6. 找到攻击者写入的恶意后门文件&#xff0c;提…

身份证照片怎么弄成200k以内?超级好用!

一些网站为了限制大的文件上传&#xff0c;提出了一些大小限制的要求&#xff0c;那么身份证如何弄成200k呢&#xff1f;下面介绍三种方法。 方法一&#xff1a; 使用嗨格式压缩大师 1、在电脑上打开安装好的软件&#xff0c;在首界面中点击“图片压缩”。 2、进入后上传需要…

[工业自动化-11]:西门子S7-15xxx编程 - PLC从站 - 分布式IO从站/从机

目录 一、什么是以分布式IO从站/从机 二、分布式IO从站的意义 三、ET200分布式从站系列 一、什么是以分布式IO从站/从机 在工业自动化领域中&#xff0c;分布式 IO 系统是目前应用最为广泛的一种 I/O 系统&#xff0c;其中分布式 IO 从站是一个重要的组成部分。 分布式 IO …

jupyter lab配置列表清单

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

第十九章总结:Java绘图

19.1&#xff1a;Java绘图类 19.2&#xff1a;绘制图形 package nineteentn; import java.awt.*; import javax.swing.*;public class DrawCircle extends JFrame {private final int OVAL_WIDTH 80; // 圆形的宽private final int OVAL_HEIGHT 80; // 圆形的高public DrawC…

Mathtype公式自动转Word自带公式

Mathtype公式自动转Word自带公式 前言/word技巧探索过程参考资料&#xff08;有效与无效&#xff09;全自动方案/代码/教程 前言/word技巧 word公式 用ALT号可以输入简单latex显示公式&#xff1b;复杂度&#xff0c;需要引入latex包的不行&#xff1b;显示不出来的话按一下en…

kubernetes--pod详解

目录 一、pod简介&#xff1a; 1. Pod基础概念&#xff1a; 2. Kubrenetes集群中Pod的两种使用方式&#xff1a; 3. pod资源中包含的容器&#xff1a; 4. pause容器的两个核心功能&#xff1a; 5. Kubernetes中使用pause容器概念的用意&#xff1a; 二、pod的分类&#xff1…

微软允许OEM对Win10不提供关闭Secure Boot

用户可能将无法在Windows 10电脑上安装其它操作系统了&#xff0c;微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问…

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

【设计模式】策略模式

引例 方案一 说明&#xff1a; 不满足OCP&#xff0c;添加新的排序算法或修改某个已有排序算法需要重新编译整个类可复用性差&#xff0c;Sorting类不可被直接复用 方案二 将客户类和算法类分开 说明&#xff1a;Sorting类可复用&#xff0c;但Sorting类仍不满足OCP 方案三…

低代码平台是什么?具备哪些特性?

目录 一、低代码开发概念 二、低代码开发和零代码开发的区别 三、低代码和零代码的开发优势 四、低代码开发平台介绍 JNPF开发平台 1&#xff09;产品功能点 2&#xff09;产品功能模块 五、小结 低代码开发平台近两年发展迅猛&#xff0c;并迅速渗透到各个细分领域。本文简要介…

用placement label代替keep margin解决绕线问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 通常我们用keepout margin去降低多pin cell类型的密度&#xff0c;这里提供一种替代方案&#xff0c;即使用placement label。好处是只限制多pin cell彼此间距&#xff0c;不会…

node插件MongoDB(四)—— 库mongoose 的个性话读取(字段筛选、数据排序、数据截取)(四)

文章目录 一、字段筛选二、数据排序三、数据截取1. skip 跳过2. limit 限定![在这里插入图片描述](https://img-blog.csdnimg.cn/c7067b1984ee4c6686f8bbe07cae9176.png) 一、字段筛选 字段筛选&#xff1a;只读取指定的数据&#xff0c;比如集合&#xff08;表&#xff09;中有…

基于IGT-DSER智能网关实现GE的PAC/PLC与罗克韦尔(AB)的PLC之间通讯

工业自动化领域的IGT-DSER智能网关模块支持GE、西门子、三菱、欧姆龙、AB等各种品牌的PLC之间通讯(相关资料下载)&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需编程开发&#xff0c;只…