uCOSIII实时操作系统(重入函数,调度算法,嵌入式系统中断)

news2024/11/16 1:49:27

目录

可重入函数和不可重入函数:

基于优先级的调度算法:

嵌入式系统中断:


可重入函数和不可重入函数:

函数可重入是指一函数可以被多个任务调用,而不需要担心在任务切换的过程中,代码的执行会产生错误的结果。可重入函数任何时候都可以被中断,一段时间之后又可以运行,而相应的数据不会丢失。可重入函数或者只会使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以保护。

eg:

void strcpy(char *dest,char *src)
{
    while(*dest++ = *src++)
{

}
*dest = NULL;
}

函数Strcpy()做字符串复制。因为参数是存在堆栈中的,故函数Strcpy()可以被多个任务调用,而不必担心各任务调用函数期间会互相破坏对方的指针。

如果函数被多个任务调用,可能产生错误的结果,就是不可重入函数。

不可重入函数的例子,Swap()是一个简单函数,它使函数的两个形式变量的值互换。为便于讨论,假定使用的是可剥夺型内核,中断是开着的,Temp定义为整数全程变量。

eg:

int Temp;
void swap(int *x ,int *y)
{
    Temp = *x;//1
    *x = *y;//2
    *y =Temp;//3
}

把swap函数设置为任何函数可以调用,如果一个低优先级的任务正在执行swap()函数假设执行到

在第一个任务发生中断的时候全局变量这时候已经被赋值给了2,然后中断进入第二个任务第二个任务的函数当中因为也调用了swap函数,此时全局变量的Temp又被赋值为6,所以中断的第二个任务执行完的时候,程序又返回断点处继续执行,而此时的Temp值还是6与源程序所需要的数值发生错误,所以程序发生错误。

注意:

这只是一个简单的例子,如何能使代码具有可重入性一看就明白。然而有些情况下,问题并非那么易解。应用程序中的不可重入函数引起的错误很可能在测试时发现不了,直到产品到了现场问题才出现。如果在多任务上您还是把新手,使用不可重入型函数时,千万要当心。

如何解决避免这一问题?(以上边的swap函数为例)

  • 把Temp定义为局部变量
  • 调用Swap()函数之前关闭中断,调用之后在开启中断
  • 用信号量禁止该函数在使用过程中在此被调用

基于优先级的调度算法:

·在多任务系统中,内核负责管理各个任务,或者换说每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务时任务切换。之所以使用实时内核可以大大的简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理他们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加RAM的用量,但更重要的是,每个任务都有自己的栈空间,这一块吃内存是相当厉害的因此,STN89C51,52等性能有限单片机一般不能运行实时内核,因为单片机的RAM很有限。但是例如STM32单片机通过UCOSIII提供必不可缺少的系统服务,诸如信号量管理、消息队列、延时等,使得CPU的利用更为有效。

可剥夺型内核:

因为系统响应时间很重要,所以μC/OS使用的是一种基于优先级的可剥夺型内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务。使用可剥夺型内核,最高优先级的任务什么时候可以执行,可以得到CPU的控制权是可知的。使用可剥夺型内核使得任务级响应时间得以最优化。

使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用**不可重入型函数**时,要满足互斥条件,这一点可以用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。

在uC/OS中

可以同时有64个就绪任务,每个任务都有各自的优先级。优先级用无符号整数来表示,从0到63,数字越大则优先级越低。 μC/OS总是调度就绪了的,优先级最高的任务获得CPU的控制权,不管这个任务是什么,执行什么样的功能,也不管该任务是否已经等了很久。

嵌入式系统中断:

嵌入式实时操作系统的中断是指在任务的执行过程中,当出现异常情况或特殊请求时,停止任务的执行,转而对这些异常情况或
特殊请求进行处理,处理结束后程序回到:
● 在前后台系统中,程序回到后台程序(前台:中断。后台:用户)
● 对不可剥夺型内核而言,程序回到被中断了的任务
● 对可剥夺型内核而言,让进入就绪态的优先级最高的任务开始运

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

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

相关文章

实用网站合集

目录 1.工具网站合集2.技术类合集1.技术网站2.C3.计算机相关4.Java5.前端 收藏夹里有很多好用的网站,分类整理下,方便日后使用。 1.工具网站合集 阿里巴巴图标库:图标资源。pexels:壁纸、视频。unsplash:壁纸。pixabay…

基于cv2识别图像实现jd滑动块验证

这里写目录标题 出现条件:解决方案:获取滑动的距离滑动验证 本教程无任何意向,纯纯的技术娱乐 虽然小概率出现问题,加入重试机制后,基本没出现过问题 注意:这里获取的距离与实际的距离不相同,本…

mysql面试题1:MySQL有哪些常见存储引擎?MySQL默认是哪个存储引擎?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL有哪些常见存储引擎? MySQL有以下几种常见的存储引擎&#xff1…

智慧公厕自动化保洁系统,让公共厕所实现7*24 持续整洁

随着科技的不断进步,越来越多的创新方案应用于各个领域,公共厕所的智慧化也不例外。本文重点介绍智慧公厕源头厂家广州中期科技有限公司,大量案例项目中所使用的智慧公厕自动化保洁系统,能有效地节省人力,并保持公共厕…

抽象轻松的java——简单的购物车系统

public class GoodsShop {public static void main(String[] args) {System.out.println("欢迎来到购物车管理系统");obj [] arr new obj[50];//obj[50]为购物车的数量上限obj obj new obj();//调用objScanner scanner new Scanner(System.in);//输入while (true)…

【C++14保姆级教程】数位分割符、函数返回值推导

文章目录 前言一、数位分割符(Digit Separators)1.1 数位分割符是什么?1.2 作用1.3 示例代码11.4 示例代码21.5 数位分隔符的优势 二、函数返回值推导(Function Return Type Deduction)2.1 函数返回值推导是什么&#…

[NOIP2011 提高组] 铺地毯

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

【LeetCode热题100】--142.环形链表II

142.环形链表II 使用哈希表: 遍历链表中的每个节点,并将它记录下来,一旦遇到了此前遍历过的节点,就可以判定链表中存在环 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* …

Unity Urp无线延申的网格效果

无线延申的网格 该项目必须是再Urp项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

操作系统监控工具

在当今复杂、动态的网络环境中,服务器管理员根据其要求在各种操作系统上工作,操作系统是管理硬件和软件资源的基本系统软件,它是硬件与您运行的不同应用程序之间的接口,保持操作系统更新至关重要,最重要的是&#xff0…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信,不过是基于SDI-12协议,SDI-12时序和UART类似,故采用UART传输,原理图如下 其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR…

测试网页调用本地可执行程序(续1:解析参数中的中文编码)

学习测试网页调用本地可执行程序还遗留一个问题&#xff0c;即网页中调用带中文参数的命令时&#xff0c;本地可执行程序接收到的参数字符串里的中文都转换成了编码模式&#xff0c;看起来如下所示&#xff1a; <a href TestPageCall:-a你好>启动测试程序</a><…

destoon根据查询标题小于5个字符的数据进行删除

最近客户有个需求&#xff0c;就是他采集的时候&#xff0c;标题有些小于5字符的短标题的垃圾数据&#xff0c;进行清空处理&#xff0c;让我进行批量删除。废话不多说&#xff0c;接着干。 首先在dt根目录新建delmysql.php文件&#xff0c;代码如下&#xff1a; <?php r…

机器学习——KNN算法流程详解(以iris为例)

目 录 前情说明 问题陈述 数据说明 KNN算法流程概述 代码实现 前情说明 本书基于《特征工程入门与入门与实践》庄家盛 译版P53也K最近邻&#xff08;KNN&#xff09;算法进行讲解 问题陈述 Iris 鸢尾花数据集内包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09…

99%的亚马逊运营都不知道爆单小技巧——社媒促销代码

社交媒体促销代码是促进产品在亚马逊上销售的最有效推广方式之一&#xff0c;有了这个营销工具&#xff0c;卖家可以在社交媒体上宣传您的产品&#xff0c;并通过社交媒体和网红营销内容将促销代码分享给买家&#xff0c;进行更具针对性的促销。 一、什么是社交媒体促销代码 社…

BoxUVMap处理参考

该Shader的目标是让物体的位置作为UV&#xff0c;在物体自身UV没有正确展开的情况下保证物体各个面能够避免贴图拉伸&#xff0c;比较适合Box型的物体。本来Position节点和Normal Vector节点应该选择Object选项&#xff0c;但是当时选择了World选项&#xff0c;主要是应对项目的…

在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型

开源大型语言模型&#xff08;LLM&#xff09;已经变得流行起来&#xff0c;研究人员、开发人员和组织都可以使用这些模型来促进创新和实验。这促进了开源社区开展合作&#xff0c;从而为LLM的开发和改进做出贡献。开源LLM提供了模型架构、训练过程和训练数据的透明度&#xff…

超大表格组件滚动渲染优化

引用自 摸鱼wiki 背景 业务中需要渲染一个最多有100列的表格&#xff0c;由于表格使用原生dom实现&#xff0c;因此会出现同屏有近1000个单元格同时绘制&#xff0c;在快速滑动时页面会产生卡顿&#xff0c;影响用户体验。 方案 如下图所示&#xff0c;由于用户显示屏区域有…

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能…

opencv开发环境配置

一、下载安装 打开opencv官方网站&#xff0c;opencv管网地址&#xff0c;选择下载的版本 双击安装包&#xff0c;选择安装路径&#xff0c;进行安装 安装完毕后&#xff0c;打开 注意&#xff1a;环境变量配置的bin路径不是build/bin&#xff0c;而是build/x64/vc16/bin …