uCOSii系统的中断管理

news2025/2/25 3:35:28

uCOSii系统的中断管理

1、在使用uCOSii系统时,中断服务程序需要调用两个函数OSIntEnter()和OSIntExit()。

OSIntEnter() 进入中断时,OSIntNesting来统计中断嵌套次数,告知uCOSii系统,当前中断服务程序正在执行;

OSIntExit()退出中断时,OSIntNesting来统计中断嵌套次数,告知uCOSii系统,当前的中断已经处理完成;
注意:切记上述两个函数必须成对出现中断服务程序中,这种用法和FreeRTOS不同。

2、OSIntEnter()函数

函数功能:在进入中断服务函数时,需要OSIntNesting来统计中断嵌套次数

void OSIntEnter (void)

{

if (OSRunning == OS_TRUE)

{

        if (OSIntNesting < 255u)

        {

            OSIntNesting++;/*中断嵌套次数加1*/

        }

    }

}

3、OSIntExit()函数

函数功能:在退出中断服务函数时,需要用OSIntNesting来统计中断嵌套次数

void  OSIntExit (void)

{

#if OS_CRITICAL_METHOD == 3u

    OS_CPU_SR  cpu_sr = 0u;

#endif

if (OSRunning == OS_TRUE)

{

        OS_ENTER_CRITICAL();//进入临界区(无法被中断打断),需要定义cpu_sr变量

        if (OSIntNesting > 0u)

        {/*防止OSIntNesting在做减法时由0x00变为0xFF*/

            OSIntNesting--;/*中断嵌套次数减1*/

        }

        if (OSIntNesting == 0u)

        {/*中断嵌套次数OSIntNesting =0*/

            if (OSLockNesting == 0u)

            {/*多任务上锁嵌套OSLockNesting=0表示没有上锁 */

                OS_SchedNew();

   //准备好的任务,找出优先级最高的任务的优先级,赋值给OSPrioHighRdy

                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

   //根据OSPrioHighRdy,读取最高优先级任务控制块的指针” ,保存到OSTCBHighRdy

                if (OSPrioHighRdy != OSPrioCur)

                {

   //OSPrioHighRdy为最高优先级任务的优先级

   //OSPrioCur为当前任务的优先级

   //如果当前任务的优先级最高优先级任务的优先级不等,则切换任务

   //在中断服务程序中,若出现更高优先级任务处于准备状态时,则执行任务切换功能

#if OS_TASK_PROFILE_EN > 0u

                    OSTCBHighRdy->OSTCBCtxSwCtr++;//切换任务次数计数器加1

#endif

                    OSCtxSwCtr++;//上下文切换次数计数器加1

                    OSIntCtxSw();

      /*OSIntCtxSw()表示在中断服务程序中执行任务切换,退出中断便执行新任务*/

                }

            }

        }

        OS_EXIT_CRITICAL();//退出临界区(可以被中断打断)

    }

}

4uCOSii中断引用举例

#include "Timer2_Task.h"

#include "includes.h"

#include "LED.h"

u16 MilliSecond;//毫秒计数器

void TIM2_Interrupt_Initializtion(u16 arr,u16 psc);

//通用定时器2中断初始化

//这里时钟选择为APB12倍,而APB136M

//arr:自动重装值。

//psc:时钟预分频数

//这里使用的是定时器2!

//TIM2_Interrupt_Initializtion(1000,36);

//arr=1000,psc=36,则为0.5ms,误差为0.5us;

//TIM2_Interrupt_Initializtion(2000,36);

//arr=2000,psc=36,则为1ms,误差为0.5us;

//TIM2_Interrupt_Initializtion(4000,36);

//arr=4000,psc=36,则为2ms,误差为0.5us;

void TIM2_Interrupt_Initializtion(u16 arr,u16 psc)

{

         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

         NVIC_InitTypeDef NVIC_InitStructure;

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //使能定时器TIM2APB1外设时钟

        

         //定时器TIM2初始化

         TIM_TimeBaseStructure.TIM_Period = arr-1;

    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         

         TIM_TimeBaseStructure.TIM_Prescaler =psc-1;

    //设置用来作为TIMx时钟频率除数的预分频值

         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    //设置时钟分割:TDTS = Tck_tim

         //计算公式:arr*psc/72000000/1,arr=1000,psc=72,则为1ms,误差为1us;

         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

    //TIM向上计数模式

         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    //根据指定的参数初始化TIMx的时间基数单位

        

        TIM_SetCounter(TIM2,0);                   //设置TIM2的计数器值为0;

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);  //清除TIM2溢出的待处理标志位

         TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIM2中断的待处理位

         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //允许TIM2溢出产生中断

         //中断优先级NVIC设置

         //NVIC_PriorityGroup_4设置NVIC中断分组4:表示抢占优先级为4,取值为0~15,没有响应优先级,取值为0

  //NVIC_PriorityGroup_3设置NVIC中断分组3:表示抢占优先级为3,取值为0~7,响应优先级只有1,取值为0~1

         //NVIC_PriorityGroup_2设置NVIC中断分组3:表示抢占优先级为2,取值为0~3,响应优先级只有2,取值为0~3

         //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4

         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断

         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11; 

    //设置抢占优先级为11

         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //设置响应优先级为0

         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //IRQ通道被使能

         NVIC_Init(&NVIC_InitStructure);

    //根据NVIC_InitStruct中指定的参数初始化NVIC嵌套向量中断控制寄存器

         TIM_Cmd(TIM2, ENABLE);//使能TIM2外设

  MilliSecond=0;//毫秒计数器

}

//函数功能:TIM21ms中断一次

void TIM2_IRQHandler()

{

         OSIntEnter();//在进入中断服务函数时,需要用OSIntNesting来统计中断嵌套次数

         if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET) //TIM2计数器溢出产生中断

         {

           MilliSecond++;//毫秒计数器加1

           if(MilliSecond>=1000)//TIM21ms中断一次,1000表示1

           {

                     MilliSecond=0;

                     LED0=!LED0;

           }

           TIM_ClearITPendingBit(TIM2,TIM_IT_Update);

     //清除TIM2计数器的溢出中断标志;

         }

         OSIntExit();//在退出中断服务函数时,需要用OSIntNesting来统计中断嵌套次数

}

5uCOSii系统不是免费的

    uCOSii是开源的,但不是免费的。如果你真想要用免费的系统,还是选择FreeRTOS吧。从技术角度或者从商业角度,同FreeRTOS相比,uCOSii没有任何优势。FreeRTOS是真正免费的系统。

 

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

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

相关文章

Java实战和面试宝典

这是一篇记录工作和学习过程中遇到的一些问题的文章&#xff0c;每个问题都很有代表性&#xff0c;值得不断回顾和深入思考的&#xff0c;答案未必十分准确&#xff0c;但可以作为一种参考&#xff0c;共勉&#xff01; 读了这篇不一样的八股文&#xff0c;你将至少拥有三年经…

社交媒体品牌:如何通过11个步骤提升您的战略

您是否正在努力在社交媒体上留下自己的印记&#xff1f;您是否觉得您的品牌在无尽的视频和表情包中迷失了方向&#xff1f;在本文中&#xff0c;我们将为您提供11个技巧&#xff0c;帮助您制定社交媒体品牌战略并脱颖而出。但首先&#xff0c;让我们探讨什么是社交媒体品牌&…

正版软件 | DaisyDisk:Mac 电脑一流的磁盘空间管理工具

使用 Mac 工作时&#xff0c;平时创建并下载大量文件&#xff0c;但很容易忘记或者很少删除这些内容。但是有一天&#xff0c;您发现启动磁盘已红&#xff0c;但是自己又好似没有安装啥软件&#xff0c;这时候就会想到底是哪些数据占用了这么大的空间&#xff1f;&#xff01; …

【TA 100】2.3 HLSL常用函数介绍

一、基本数学运算 ● max&#xff08;a&#xff0c;b&#xff09; ○ 返回较大的 ● min&#xff08;a&#xff0c;b&#xff09; ○ 返回较小的 ● mul&#xff08;a&#xff0c;b&#xff09; ○ 两向量相乘&#xff0c;常用于矩阵运算 ● abs&#xff08;a&#xff09; ○ …

ThreeJS教程:地图案例(包围盒、正投影)

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 地图案例(包围盒、正投影) 地图案例(包围盒、正投影) 地图案例会涉及到几何体、包围盒、正投影相机三方面知识点。 平面填充几何体ShapeGeometry包围盒Box3正投影相机Orthograph…

MTK开发板-4G/5G联发科开发板相关方案定制

开发板是用于嵌入式系统开发的电路板&#xff0c;包括中央处理器、存储器、输入设备、输出设备、数据通路 / 总线和外部资源接口等一系列硬件组件。一般来说&#xff0c;开发板由嵌入式系统开发者根据开发需求自主定制&#xff0c;也可以由用户自己研究设计。开发板不仅是初学者…

进阶篇丨链路追踪(Tracing)很简单:链路成本指南

广义上的链路成本&#xff0c;既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销&#xff0c;也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解&#xff0c;本小节将聚焦在狭义上的链路追踪机器资源成本&#xff0c;人力成本将在下一…

十二、光照基础

第一部分概念 OpenGL ES的基础光照模型&#xff0c;目前opengl还无法模拟现实世界的复杂光照效果&#xff0c;但是为了效果上的逼真&#xff0c;还是引入了一些简单的模型来模拟光照效果&#xff0c; 这里介绍冯氏光照模型(Phong Lighting Model)模型&#xff0c;他是由三种元…

大数据:spark RDD编程,构建,RDD算子,map,flatmap,reduceByKey,mapValues,groupBy,

大数据&#xff1a;spark RDD编程 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

618有什么数码好物值得购买?2023值得入手的数码好物推荐

在618期间&#xff0c;有哪些值得入手的数码好物&#xff1f;很多人还不知道有哪些数码好物值得买的&#xff0c;本文推荐几款质量不错数码好物&#xff0c;助您尽情享受618购物买买买。 一、南卡OE不入耳蓝牙耳机 推荐理由&#xff1a; 南卡OE耳机是一款性价比超高的不入耳蓝…

进公司第一天当老板问:“测得怎么样了?”我懵逼了

当我入行做测试头两份年&#xff0c;觉的测试工作有时候似乎挺苦逼的&#xff0c;我太难了…… 前言 说实话&#xff0c;我真想从上面去掉"似乎"两个字&#xff0c;软件测试人&#xff0c;就是苦逼&#xff01;有的人曾抱怨过开发很糟糕&#xff0c;但我们没办法要求…

用AI生成思维导图的方法

写在前边&#xff1a; 这篇文章很简单&#xff0c;只为给自己做个记录。并且做一个简单的思考&#xff1a;明明很容易的东西&#xff0c;一旦陷入了思维困境中&#xff0c;就无法找到出去的路。这时候需要扩展思维或者他人提点。 正文&#xff1a; 就挺尴尬&#xff0c;之前…

计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现

文章目录 导文文章重点前言课题内容相关技术与方法介绍技术分析技术设计技术设计技术实现方面系统测试和优化总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现 文章重点 前言 本文介绍了一种基于Python的农业温室智…

玩过Tauri和Electron,最终我选择Flutter进行跨平台应用开发

Flutter、Tauri 和 Electron 都是现代桌面应用程序开发的流行选择&#xff0c;每种技术有其独特的优缺点&#xff0c;下面我们就来对它们进行一个全面的技术对比。 一、Flutter Flutter 是 Google 推出的一款开源的 UI 工具包&#xff0c;用于构建高性能、高保真度的移动、We…

2023年6月杭州/广州/深圳NPDP产品经理认证找这里

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

从搜索电商,社交电商到兴趣电商如何进化

【搜索电商】需求>联结>信任 淘宝、天猫、京东这些是属于什么电商&#xff1f; 答&#xff1a;这些都是属于搜索电商。 某宝&#xff0c;某东等用户有需求&#xff0c;才能产生主动寻找商品的触点&#xff0c;由第三方担保&#xff0c;产生信任。 试想一下&#xff0c;我…

高逼格的 SQL 写法:行行比较

码农code之路 2023-06-01 08:28 发表于天津 环境准备 需求背景 循环查询 OR 拼接 混查过滤 行行比较 总结 环境准备 数据库版本&#xff1a;MySQL 5.7.20-log 建表 SQL DROP TABLE IF EXISTS t_ware_sale_statistics; CREATE TABLE t_ware_sale_statistics (id bigin…

面向过程 VS 面向对象

学习编程&#xff0c; 基本功是掌握编程语言&#xff0c;但编程的本质是逻辑&#xff0c;所以编程思维的培养也很重要。面向过程和面向对象是两种重要的编程思想&#xff0c;下面讲述一下这两者的区别和优缺点比较。 1. 面向过程 面向过程是一种以事件为中心的编程思想&#…

cmake编译报错

CMake Error &#xff1a;The source.. 此处大概意思是一个文件地址does not match the 另外一个文件地址so used to generate cache. Rerun cmake...解决方法&#xff1a; vscode 快捷键ctrl shift P &#xff0c;点击第一行的删除cmake 缓存 或者将 build 下的 CMakeCac…

算法百花齐放:探索常见算法的精妙之道

在计算机科学的领域中&#xff0c;算法是一项关键而令人着迷的技术。它们是解决问题、优化效率以及创造智能系统的核心。从简单的排序和搜索任务到复杂的机器学习和深度学习应用&#xff0c;常见算法为我们提供了解决各种挑战的有力工具。在本篇博客中&#xff0c;我们将探索常…