(学习日记)2024.04.07:UCOSIII第三十五节:互斥量实验

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.04.07:UCOSIII第三十五节:互斥量实验

  • 四十九、UCOSIII:互斥量实验
    • 1、模拟优先级翻转实验
    • 2、模拟优先级翻转实验现象
    • 3、互斥量实验
    • 4、互斥量实验现象

四十九、UCOSIII:互斥量实验

1、模拟优先级翻转实验

模拟优先级翻转实验是在μC/OS中创建了三个任务与一个二值信号量,任务分别是高优先级任务AppTaskLed3,中优先级任务AppTaskLed2,低优先级任务AppTaskLed1, 用于模拟产生优先级翻转。
低优先级任务在获取信号量的时候,被中优先级打断,中优先级的任务开始执行,因为低优先级还未释放信号量, 那么高优先级任务就无法取得信号量继续运行,此时就发生了优先级翻转,任务在运行中,使用串口打印出相关信息,源码具体如下:

#include <includes.h>/*
****************************************************************
*                        LOCAL DEFINES
****************************************************************
*/OS_SEM TestSem;          //信号量/*
*********************************************************************
*                   TCB
*********************************************************************
*/static  OS_TCB   AppTaskStartTCB;
static  OS_TCB   AppTaskLed1TCB;
static  OS_TCB   AppTaskLed2TCB;
static  OS_TCB   AppTaskLed3TCB;/*
*************************************************************
*                    STACKS
*************************************************************
*/static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
static  CPU_STK  AppTaskLed1Stk [ APP_TASK_LED1_STK_SIZE ];
static  CPU_STK  AppTaskLed2Stk [ APP_TASK_LED2_STK_SIZE ];
static  CPU_STK  AppTaskLed3Stk [ APP_TASK_LED3_STK_SIZE ];/*
*********************************************************
*            FUNCTION PROTOTYPES
*********************************************************
*/static  void  AppTaskStart  (void *p_arg);
static  void  AppTaskLed1  ( void * p_arg );
static  void  AppTaskLed2  ( void * p_arg );
static  void  AppTaskLed3  ( void * p_arg );int  main (void)
{OS_ERR  err;OSInit(&err);           /* Init μC/OS-III.    */OSTaskCreate((OS_TCB    *)&AppTaskStartTCB,/* Create the start task*/(CPU_CHAR   *)"App Task Start",(OS_TASK_PTR ) AppTaskStart,(void       *) 0,(OS_PRIO     ) APP_TASK_START_PRIO,(CPU_STK    *)&AppTaskStartStk[0],(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);OSStart(&err);
}static  void  AppTaskStart (void *p_arg)
{CPU_INT32U  cpu_clk_freq;CPU_INT32U  cnts;OS_ERR      err;(void)p_arg;BSP_Init();              /* Initialize BSP functions  */CPU_Init();cpu_clk_freq = BSP_CPU_ClkFreq();cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;OS_CPU_SysTickInit(cnts);Mem_Init();#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);#endifCPU_IntDisMeasMaxCurReset();/* 创建信号量 TestSem */OSSemCreate((OS_SEM      *)&TestSem,    //指向信号量变量的指针(CPU_CHAR    *)"TestSem ",    //信号量的名字(OS_SEM_CTR   )1,//信号量这里是指示事件发生,所以赋值为0,表示事件还没有发生(OS_ERR      *)&err);         //错误类型/* Create the Led1 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed1TCB,(CPU_CHAR   *)"App Task Led1",(OS_TASK_PTR ) AppTaskLed1,(void       *) 0,(OS_PRIO     ) APP_TASK_LED1_PRIO,(CPU_STK    *)&AppTaskLed1Stk[0],(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);/* Create the Led2 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed2TCB,(CPU_CHAR   *)"App Task Led2",(OS_TASK_PTR ) AppTaskLed2,(void       *) 0,(OS_PRIO     ) APP_TASK_LED2_PRIO,(CPU_STK    *)&AppTaskLed2Stk[0],(CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);/* Create the Led3 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed3TCB,(CPU_CHAR   *)"App Task Led3",(OS_TASK_PTR ) AppTaskLed3,(void       *) 0,(OS_PRIO     ) APP_TASK_LED3_PRIO,(CPU_STK    *)&AppTaskLed3Stk[0],(CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);OSTaskDel ( & AppTaskStartTCB, & err );
}/*
***************************************************************
*                   LED1 TASK
**************************************************************
*/static  void  AppTaskLed1 ( void * p_arg )
{OS_ERR      err;static uint32_t i;CPU_TS         ts_sem_post;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed1 获取信号量\n");//获取二值信号量TestSem,没获取到则一直等待OSSemPend ((OS_SEM   *)&TestSem,             //等待该信号量被发布(OS_TICK   )0,                     //无期限等待(OS_OPT    )OS_OPT_PEND_BLOCKING,//如果没有信号量可用就等待(CPU_TS   *)&ts_sem_post,//获取信号量最后一次被发布的时间戳(OS_ERR   *)&err);                 //返回错误类型for (i=0; i<600000; i++)   //模拟低优先级任务占用信号量{OSSched();//发起任务调度}printf("AppTaskLed1 释放信号量!\n");OSSemPost((OS_SEM  *)&TestSem,//发布SemOfKey(OS_OPT   )OS_OPT_POST_1,//发布给所有等待任务(OS_ERR  *)&err);macLED1_TOGGLE ();OSTimeDlyHMSM (0,0,1,0,OS_OPT_TIME_PERIODIC,&err);}
}/*
*********************************************************
*                   LED2 TASK
*********************************************************
*/static  void  AppTaskLed2 ( void * p_arg )
{OS_ERR      err;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed2 Running\n");macLED2_TOGGLE ();OSTimeDlyHMSM (0,0,0,200,OS_OPT_TIME_PERIODIC,&err);}
}/*
*************************************************************
*                      LED3 TASK
*************************************************************
*/static  void  AppTaskLed3 ( void * p_arg )
{OS_ERR      err;CPU_TS         ts_sem_post;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed3 获取信号量\n");//获取二值信号量TestSem,没获取到则一直等待OSSemPend ((OS_SEM   *)&TestSem,             //等待该信号量被发布(OS_TICK   )0,                     //无期限等待(OS_OPT    )OS_OPT_PEND_BLOCKING,//如果没有信号量可用就等待(CPU_TS   *)&ts_sem_post,//获取信号量最后一次被发布的时间戳(OS_ERR   *)&err);                 //返回错误类型macLED3_TOGGLE ();printf("AppTaskLed3 释放信号量\n");//给出二值信号量OSSemPost((OS_SEM  *)&TestSem,//发布SemOfKey(OS_OPT   )OS_OPT_POST_1,(OS_ERR  *)&err);OSTimeDlyHMSM (0,0,1,0,OS_OPT_TIME_PERIODIC,&err);}
}

2、模拟优先级翻转实验现象

在计算机上打开串口调试助手,然后复位开发板就可以在调试助手中看到串口的打印信息,它里面输出了信息表明任务正在运行中, 并且很明确可以看到高优先级任务在等待低优先级任务运行完毕才能得到信号量继续运行,具体见图
在这里插入图片描述

3、互斥量实验

互斥量实验是基于优先级翻转实验进行修改的,将信号量改为互斥量,目的是为了测试互斥量的优先级继承机制是否有效,具体如下

#include <includes.h>/*
*****************************************************************
*                       LOCAL DEFINES
*****************************************************************
*/OS_SEM TestMutex;          //互斥量/*
*******************************************************************
*                      TCB
*******************************************************************
*/static  OS_TCB   AppTaskStartTCB;
static  OS_TCB   AppTaskLed1TCB;
static  OS_TCB   AppTaskLed2TCB;
static  OS_TCB   AppTaskLed3TCB;/*
********************************************************************
*                         STACKS
*******************************************************************
*/static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];
static  CPU_STK  AppTaskLed1Stk [ APP_TASK_LED1_STK_SIZE ];
static  CPU_STK  AppTaskLed2Stk [ APP_TASK_LED2_STK_SIZE ];
static  CPU_STK  AppTaskLed3Stk [ APP_TASK_LED3_STK_SIZE ];/*
********************************************************************
*                  FUNCTION PROTOTYPES
*******************************************************************
*/static  void  AppTaskStart  (void *p_arg);
static  void  AppTaskLed1  ( void * p_arg );
static  void  AppTaskLed2  ( void * p_arg );
static  void  AppTaskLed3  ( void * p_arg );int  main (void)
{OS_ERR  err;OSInit(&err);OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,(CPU_CHAR   *)"App Task Start",(OS_TASK_PTR ) AppTaskStart,(void       *) 0,(OS_PRIO     ) APP_TASK_START_PRIO,(CPU_STK    *)&AppTaskStartStk[0],(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);OSStart(&err);}static  void  AppTaskStart (void *p_arg)
{CPU_INT32U  cpu_clk_freq;CPU_INT32U  cnts;OS_ERR      err;(void)p_arg;BSP_Init();CPU_Init();cpu_clk_freq = BSP_CPU_ClkFreq();cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;OS_CPU_SysTickInit(cnts);Mem_Init();#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);
#endifCPU_IntDisMeasMaxCurReset();/* 创建互斥信号量 mutex */OSMutexCreate ((OS_MUTEX  *)&TestMutex,           //指向信号量变量的指针(CPU_CHAR  *)"Mutex For Test", //信号量的名字(OS_ERR    *)&err);            //错误类型/* Create the Led1 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed1TCB,(CPU_CHAR   *)"App Task Led1",(OS_TASK_PTR ) AppTaskLed1,(void       *) 0,(OS_PRIO     ) APP_TASK_LED1_PRIO,(CPU_STK    *)&AppTaskLed1Stk[0],(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);/* Create the Led2 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed2TCB,(CPU_CHAR   *)"App Task Led2",(OS_TASK_PTR ) AppTaskLed2,(void       *) 0,(OS_PRIO     ) APP_TASK_LED2_PRIO,(CPU_STK    *)&AppTaskLed2Stk[0],(CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED2_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);/* Create the Led3 task                                */OSTaskCreate((OS_TCB     *)&AppTaskLed3TCB,(CPU_CHAR   *)"App Task Led3",(OS_TASK_PTR ) AppTaskLed3,(void       *) 0,(OS_PRIO     ) APP_TASK_LED3_PRIO,(CPU_STK    *)&AppTaskLed3Stk[0],(CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE / 10,(CPU_STK_SIZE) APP_TASK_LED3_STK_SIZE,(OS_MSG_QTY  ) 5u,(OS_TICK     ) 0u,(void       *) 0,(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR     *)&err);OSTaskDel ( & AppTaskStartTCB, & err );
}/*
************************************************************************
*                      LED1 TASK
************************************************************************
*/static  void  AppTaskLed1 ( void * p_arg )
{OS_ERR      err;static uint32_t i;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed1 获取互斥量\n");//获取互斥量 ,没获取到则一直等待OSMutexPend ((OS_MUTEX  *)&TestMutex,          //申请互斥量(OS_TICK    )0,                       //无期限等待(OS_OPT     )OS_OPT_PEND_BLOCKING,//如果不能申请到信号量就阻塞任务(CPU_TS    *)0,                       //不想获得时间戳(OS_ERR    *)&err);                   //返回错误类型for (i=0; i<600000; i++)   //模拟低优先级任务占用互斥量{OSSched();//发起任务调度}printf("AppTaskLed1 释放互斥量\n");OSMutexPost ((OS_MUTEX  *)&TestMutex,          //释放互斥量(OS_OPT     )OS_OPT_POST_NONE,        //进行任务调度(OS_ERR    *)&err);                   //返回错误类型macLED1_TOGGLE ();OSTimeDlyHMSM (0,0,1,0,OS_OPT_TIME_PERIODIC,&err);}
}/*
**********************************************************************
*                    LED2 TASK
**********************************************************************
*/static  void  AppTaskLed2 ( void * p_arg )
{OS_ERR      err;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed2 Running\n");macLED2_TOGGLE ();OSTimeDlyHMSM (0,0,0,200,OS_OPT_TIME_PERIODIC,&err);}
}/*
*********************************************************************
*                       LED3 TASK
********************************************************************
*/static  void  AppTaskLed3 ( void * p_arg )
{OS_ERR      err;(void)p_arg;while (DEF_TRUE){printf("AppTaskLed3 获取互斥量\n");//获取互斥量 ,没获取到则一直等待OSMutexPend ((OS_MUTEX  *)&TestMutex,          //申请互斥量(OS_TICK    )0,                       //无期限等待(OS_OPT     )OS_OPT_PEND_BLOCKING,//如果不能申请到信号量就阻塞任务(CPU_TS    *)0,                       //不想获得时间戳(OS_ERR    *)&err);                   //返回错误类型macLED3_TOGGLE ();printf("AppTaskLed3 释放互斥量\n");OSMutexPost ((OS_MUTEX  *)&TestMutex,        //释放互斥量(OS_OPT     )OS_OPT_POST_NONE,        //进行任务调度(OS_ERR    *)&err);                   //返回错误类型OSTimeDlyHMSM (0,0,1,0,OS_OPT_TIME_PERIODIC,&err);}
}

4、互斥量实验现象

在计算机上打开串口调试助手,然后复位开发板就可以在调试助手中看到串口的打印信息,它里面输出了信息表明任务正在运行中, 并且很明确可以看到在低优先级任务运行的时候,中优先级任务无法抢占低优先级的任务,这是因为互斥量的优先级继承机制, 从而最大程度降低了优先级翻转产生的危害,具体见图
在这里插入图片描述

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

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

相关文章

前端学习<三>CSS进阶——0102-CSS布局样式

前言 css 进阶的主要内容如下。 1、css 非布局样式 html 元素的分类和特性 css 选择器 css 常见属性&#xff08;非布局样式&#xff09; 2、css 布局相关 css 布局属性和组合解析 常见布局方案 三栏布局案例 3、动画和效果 属于 css 中最出彩的内容。 多背景多投影特…

如何用putty通过ssh连接ubuntu

1. 下载和安装PuTTY 访问PuTTY官网下载PuTTY的最新版本。 2. 打开PuTTY 解压下载的文件后&#xff0c;找到PuTTY文件并双击打开。 3. 配置SSH连接 在ubuntu下安装ssh服务在安装ssh时&#xff0c;我一直遇到一个问题&#xff0c;原因是我的虚拟机连不上网&#xff0c;反复实…

深入理解 SQL 中的数据集合和数据关联

引言 在数据库管理系统中&#xff0c;数据集合和数据关联是 SQL 查询中常见的概念。它们是构建复杂查询和分析数据的基石。本文将深入探讨 SQL 中的数据集合和数据关联&#xff0c;包括它们的概念、常见用途以及实际示例。 首先引入一下数学中的集合 集合的基本概念&#x…

加速度:电子元器件营销网站的功能和开发周期

据工信部预计&#xff0c;到2023年&#xff0c;我国电子元器件销售总额将达到2.1万亿元。随着资本的涌入&#xff0c;在这个万亿级赛道&#xff0c;市场竞争变得更加激烈的同时&#xff0c;行业数字化发展已是大势所趋。电子元器件B2B商城平台提升数据化驱动能力&#xff0c;扩…

Flutter Don‘t use ‘BuildContext‘s across async gaps.

Flutter提示Don‘t use ‘BuildContext‘s across async gaps.的解决办法—flutter里state的mounted属性

[蓝桥杯 2019 国 C] 数正方形

[蓝桥杯 2019 国 C] 数正方形 题目描述 在一个 N N N \times N NN 的点阵上&#xff0c;取其中 4 4 4 个点恰好组成一个正方形的 4 4 4 个顶点&#xff0c;一共有多少种不同的取法&#xff1f; 由于结果可能非常大&#xff0c;你只需要输出模 1 0 9 7 10^9 7 1097 的…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.5

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量11.4 查准率和查全率之间的权衡11.5 机器学习的数据 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接…

leetcode.24. 两两交换链表中的节点

题目 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思路 创建虚拟头节点&#xff0c;画图&#xff0c;确认步骤。 实现 /*** Definition for singly-li…

docker安装、调试qsign签名服务器

go-cqhttp 在 Docker 里早就部署好了&#xff0c;由于没有搭建 qsign 签名服务器&#xff0c;所以迟迟不敢上线。今天终于搞定了在 Docker 下安装 qsign 签名服务器了。这次用的docker市场里找到的镜像&#xff0c;下次找时间制作一个自己的镜像。 1 拉取和运行镜像&#xff1a…

C# MES通信从入门到精通(9)——c#使用visual studio2019社区版部署webservice服务

前言 在上位机软件开发领域,我们经常使用调用webservice接口来和mes系统进行交互,我们在开发Mes程序之前也可以自己先模拟发布客户的webservice接口进行调用从而加快软件开发进度,本文就是详细介绍如何自己发布webservice接口。 1、创建 参考这篇博文:webservice服务创建…

图像处理与视觉感知---期末复习重点(6)

文章目录 一、图像分割二、间断检测2.1 概述2.2 点检测2.3 线检测2.4 边缘检测 三、边缘连接3.1 概述3.2 Hough变换3.3 例子3.4 Hough变换的具体步骤3.5 Hough变换的法线表示形式3.6 Hough变换的扩展 四、阈值处理4.1 概述4.2 计算基本全局阈值算法4.3 自适应阈值 五、基于区域…

LeetCode-131. 分割回文串【字符串 动态规划 回溯】

LeetCode-131. 分割回文串【字符串 动态规划 回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯&#xff0c; 回溯三部曲解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个…

常用软件架构模式优缺点及应用场景

1、分层架构模式 最常见的架构模式就是分层架构或者称为 n 层架构。大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉。尽管对于层的数量和类型没有具体限制&#xff0c;但大部分分层架构主要由四层组成&#xff1a;展现层、业务层、持久层和数据库层&#xff0c;如…

Peter算法小课堂—树状数组

大家好&#xff0c;我是人见人爱&#xff0c;花见花开&#xff0c;车见车爆胎的树状数组Peter Pan&#xff0c;hhh 讲正文前&#xff0c;先来一个长文警告⚠很重要的知识点&#xff1a;L SB&#xff08;SB&#xff1f;&#xff09; LSB 怎么算呢&#xff1f; 哦……懂了&…

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;回溯 回溯三部曲。这里比较关键的是给board做标记&#xff0c;防止之后搜索时重复访问。解题思路二&#xff1a;回溯算法 dfs,直接看代码,很容易理解。visited哈希&#xff0c;防止…

计算机网络——33多点访问协议

多点访问协议 多路访问链路和协议 两种类型的链路&#xff08;一个子网内部链路连接形式&#xff09; 点对点 拨号访问的PPP以太网交换机和主机之间的点对点链路 广播 传统以太网HFC上行链路802.11无线局域网 多路访问协议 单个共享的广播型链路 2个过更多结点同时传送&am…

c# 指数搜索(Exponential Search)

该搜索算法的名称可能会产生误导&#xff0c;因为它的工作时间为 O(Log n)。该名称来自于它搜索元素的方式。 给定一个已排序的数组和要 搜索的元素 x&#xff0c;找到 x 在数组中的位置。 输入&#xff1a;arr[] {10, 20, 40, 45, 55} x 45 输出&#xff1a;在索…

Aurora8b10b(1)IP核介绍并基于IP核进行设计

文章目录 前言一、IP核设置二、基于IP核进行设计2.1、设计框图2.2、aurora_8b10b_0模块2.3、aurora_8b10b_0_CLOCK_MODULE2.4、aurora_8b10b_0_SUPPORT_RESET_LOGIC2.5、aurora8b10b_channel模块2.6、IBUFDS_GTE2模块2.7、aurora_8b10b_0_gt_common_wrapper模块2.8、aurora8b10…

GIS水文分析填充伪洼地学习

1 基本操作 洼地是指流域内被较高高程所包围的局部区域&#xff1b; 分为自然洼地和伪洼地&#xff1b; 自然洼地是自然界实际存在的洼地&#xff1b; 在 DEM 数据中&#xff0c;由于数据处理的误差和不合适的插值方法所产生的洼地&#xff0c;称为伪洼地&#xff1b; DEM 数据…

文件服务器之二:SAMBA服务器

文章目录 什么是SAMBASAMBA的发展历史与名称的由来SAMBA常见的应用 SAMBA服务器基础配置配置共享资源Windows挂载共享Linux挂载共享 什么是SAMBA 下图来自百度百科 SAMBA的发展历史与名称的由来 Samba是一款开源的文件共享软件&#xff0c;它基于SMB&#xff08;Server Messa…