浅析μC/OS-II OSTimeDly()函数和OSTimeTick()函数工作原理

UCOSII操作系统(五)--时间管理 1、UCOSII的定时中断 (1)绝大多数的内核要求提供定时中断,以实现延时与超时控制等功能。这个定时中断叫做时钟节拍。 (2)时钟的中断子程序ISR和时钟节拍函数OSTimeTick()该函数用于通知UCOSII,发生了时钟的节拍中断。 2、UCOSII的5个关键的时钟函数 (1)OSTimeDly(); 后面的4个函数可以根据需要进行配置使用 (2)OSTimeHMSM(); (3)OSTimeDlyResume(); (4)OSTimeGet(); (5)OSTimeSet(); 3、关键的时钟延 阅读详情
浅析μC/OS-II v2.85内核OSTimeDly()函数工作原理

文章来源:http://gliethttp.cublog.cn[转载请声明出处]

//----------------------------------------------------------------------
//1.OSTimeDly()函数
void OSTimeDly (INT16U ticks)
{
    INT8U y;
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR cpu_sr = 0;
#endif
    if (OSIntNesting > 0) {
        return;//在中断处理函数中调用了OSTimeDly(),那么直接退出
    }
    if (ticks > 0) {
        OS_ENTER_CRITICAL();
//调用OSTimeDly()的进程自己把自己从就绪控制矩阵中拿下来,
//即:去掉调度器(x,y)矩形阵列(OSRdyTbl,OSRdyGrp)中该task对应的bit位,使得调度器不考虑
//该task的调度
        y = OSTCBCur->OSTCBY;
        OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
        if (OSRdyTbl[y] == 0) {
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        }
//延时ticks值,放入OSTCBDly单元,在os时钟滴答处理函数OSTimeTick()中,会处理该单元[gliethttp]
        OSTCBCur->OSTCBDly = ticks;
        OS_EXIT_CRITICAL();
//因为本task正在运行,所以本task现在的优先级最高,现在本task已经将自己从就绪控制矩阵中--调度器(x,y)矩形阵列
//把自己摘掉,所以调度函数OS_Sched()一定会切换到另一个task中执行新task的代码[gliethttp]
        OS_Sched();//具体参见《浅析μC/OS-II v2.85内核调度函数》
    }//ticks==0,那么什么也不做
}
//----------------------------------------------------------------------
//2.OSTimeTick()--在定时中断里引用的系统滴答函数
void OSTimeTick (void)
{
    OS_TCB *ptcb;
#if OS_TICK_STEP_EN > 0
    BOOLEAN step;
#endif
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR cpu_sr = 0;//该3方式将使中断状态寄存器放入堆栈中

#endif

#if OS_TIME_TICK_HOOK_EN > 0
    OSTimeTickHook();
#endif
#if OS_TIME_GET_SET_EN > 0
    OS_ENTER_CRITICAL();
    OSTime++;
    OS_EXIT_CRITICAL();
#endif
    if (OSRunning == OS_TRUE) {
#if OS_TICK_STEP_EN > 0
//控制内核的tick
        switch (OSTickStepState) {
            case OS_TICK_STEP_DIS:
                 step = OS_TRUE;
                 break;
            case OS_TICK_STEP_WAIT:
                 step = OS_FALSE;
                 break;
            case OS_TICK_STEP_ONCE:
//本次tick将将影响到task的OSTCBDly域
//但以后的tick将一直被屏蔽,不会影响到OSTCBDly域
//直到外部将OSTickStepState改变为止[gliethttp]
                 step = OS_TRUE;
                 OSTickStepState = OS_TICK_STEP_WAIT;
                 break;
            default:
                 step = OS_TRUE;//本次tick将影响到task的OSTCBDly域
                 OSTickStepState = OS_TICK_STEP_DIS;
                 break;
        }
        if (step == OS_FALSE) {
            return;
        }
#endif
        ptcb = OSTCBList;
//2007-09-08 gliethttp
//OSTCBList是一个按进程创建的先后顺序链接成的task单向链表,最后创建的task在最前面,最先创建的
//task在单向链表的尾端,
//所以OS_TaskIdle空闲进程在链表的最后,因为它最先创建
        while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) {
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0) {
                if (--ptcb->OSTCBDly == 0) {
//该task的延时时间已到,解析此次延时是OSTimeDly()引起的,还是OSQPend()之类超时引起的[gliethttp]
                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
                        //2007-09-08 gliethttp
                        //如:由OSSemPend (pevent,timeout,perr);定义的timeout已经到了,对应task需要运行了
                        //超时时间到,所以不论当前进程是在做什么,只要时间一到
                        //该task就可以运行了,所以清除所有事件标志,之后状态标示为OS_STAT_PEND_TO(超时)
                        ptcb->OSTCBStat &= ~(INT8U)OS_STAT_PEND_ANY;
                        ptcb->OSTCBStatPend = OS_STAT_PEND_TO;//超时异常
                    } else {
                        //2007-09-08 gliethttp
                        //说明该task调用的是OSTimeDly()
                        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;//正常结束
                    }
                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {
                        //2007-09-08 gliethttp
                        //如果该task没有suspend,那么把当前就绪的task加入到运行调度器的就绪控制矩阵中
                        //等待被调度
                        OSRdyGrp |= ptcb->OSTCBBitY;
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
            ptcb = ptcb->OSTCBNext;//继续运算下一个task的OSTCBDly时间域
            OS_EXIT_CRITICAL();
        }
    }
}
EMC案例:解决千兆网口RTL8211F EMI问题 摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。 阅读详情

相关推荐

架构设计之架构治理

架构治理的本质是“用规则约束复杂性,用流程保障落地,用数据驱动优化”先定目标:明确量化的治理目标,避免盲目行动;立标准:建立覆盖分层、选型、接口、拆分的统一规范,奠定治理基础;强评审:通过架构评审把控设计环节,提前规避风险;全流程:将治理规则贯穿设计、开发、测试、部署、运维全生命周期;重保障:通过组织、流程、工具确保治理落地,而非“纸上谈兵”;持续迭代:随业务与技术演进优化治理规则,避免“一劳永逸”。

xiaolyuh的专栏 810

OSTimeTick()函数解析

ucos V2.52 OSTimeTick()函数解析 调用处:os_cpu_a.asm里_OSTickISR 函数所有源文件:os_core.c 代码: void OSTimeTick (void) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU stat

ARM+嵌入式 7229

5分钟搞定:用Pyannote和Whisper实现带说话人分离的语音转文字(附完整代码)

本文详细介绍了如何快速构建一个集成了说话人分离功能的语音转文字系统。通过结合OpenAI的Whisper模型进行高精度语音识别和Pyannote模型实现说话人分离,并提供了完整的代码实现、环境搭建指南以及核心的对齐与合并逻辑,帮助开发者高效处理会议录音、访谈等多说话人音频,实现自动化转录。

threejs5artist的博客 635

UCOSII-中断和时钟

中断和时钟在UCOSII操作系统中的应用至关重要,本文详细介绍了UCOSII的中断执行过程,并介绍了UCOSII时钟的产生以及时钟节拍中断,对于理解UCOSII系统的运行很有帮助,供大家参考,谢谢!

tutu_hu的博客 3300

开源网格划分软件-Gmsh二次开发教程 (4)网格生成与控制​

​本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。

ZQGG的博客 1472

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3720

OSTimeTick()

void OSTimeTick (void)   //这个节拍服务函数是在OSTickISR函数中调用的,目的是在时钟节拍到来时,检查每个任务的任务控制块中的.OSTCBDly-1后是否为0,如果是,那么表明这个任务刚才是挂起的状态,此时应改变为就绪态 {     OS_TCB *ptcb;     OSTimeTickHook();

南国有儿女 1891

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

对ucosii内核代码的理解

ucosii中的任务都是无返回值且不能有返回点的,换句话说任务就是一个无限循环。 每个任务都有自己的唯一性的优先级,和自己的堆栈空间,用来供内核进行上下文切换(见前面的汇编理解)。 内核根据优先级调度算法来执行任务的调度切换(见前面的数据结构理解): 任务在创建之后进入就绪态,任务等待的事件触发后也是进入就绪态,任务从被中断和调度锁状态恢复之后也是进入就绪态;内核从就绪任务列表中,永远提取最高优先级任务开始执行。 但是,ucosii也存在“优先级反转”的缺陷 :两个任务等待同一个事件时,会出现低优先

weixin_38743772的博客 516

MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。

ONEFPGA的博客 5625

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

2020-12-07

ucos Ⅱ 多道系统分析——任务管理 1 进程存储和识别   uCOS的进程被命名为task,由OSTCB作为封装其的数据结构;而其在系统中的唯一标识是task的优先级(TCB中的OSTCBPrio属性),即一个优先级代表着一个任务,没有相同的优先级存在。而优先级高低的判断准则是值越小优先级越高,0是最高优先级。因此系统中的进程的最大数量由优先级最低决定。在1992-1999的版本中,最低优先级默认是12;不过具体值可以根据需求自行修改,只要不要高于63。而不能高于63的原因是受就绪队列存储的方式和数据类

InsectOfJava的博客 275

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

UC/OS II 系统时钟

UCOS是一个实时的多任务任务基于优先级的操作系统,要运行多任务的话,在启动多任务之后,需要在每隔一段时间(一个滴答)内进行任务调度和相关数据的更新,以确保满足运行要求的最高优先级任务以便在下一次任务调度切换的时候能够得到一个及时的响应。 这个时间间隔是由时间中断来实现,而且每个中断的中断函数需要对相关的数据进行一个周期性更新。 在STM32中时间的中断由SysTick定时器(是cortexM

大树的专栏 3487

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

嵌入式实时操作系统uC/os-II(十)-任务时钟

uC/OS-II 用硬件定时器产生一个周期为毫秒(ms)级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍。 硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR()。其示意代码如下: Void OSTickISR(void) { OSIntEnter(); ...

weixin_41080308的博客 777

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

uCOSIII实时操作系统 七 中断与时钟管理

参数如果是0则不会阻塞任务。中断是一个硬件机制,主要用来向CPU通知一个异步事件发生了,这时CPU就会将当前CPU寄存器的值入栈,然后转而执行中断服务程序,在CPU执行中断服务程序的时候有可能有更高优先级的任务就绪,那么当退出中断服务程序的时候,CPU就会直接执行这个高优先级的任务。为0时,UCOSIII使用中断的方式来保护临界段代码,当设置为1的时候,就会采用给调度器上锁的方式来保护临界段代码。函数在任务中使用的非常多,每个任务都必须是死循环,并且必须需要有阻塞的情况,否则低优先级的任务就无法被运行了,

ttdffmm的博客 1427

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

uCOSIII基础知识

uCOSIII基础知识笔记 文章来源于正点原子:正点原子UCOSIII教程 一、RTOS背景简介 1.前后台系统  早期的时候嵌入式并没有“嵌入式操作系统”的概念,直接跑裸机(轮询系统)。“嵌入式操作系统”通常可以把程序分为前台系统和后台系统。(应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。前台程序通过中断来处理事件,后台程序则掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。即wihle(1)中为后台系统,中断为前台系统) 2. RT

weixin_44936844的博客 3628

关于 OSTimeTick()

OSTimeTick() basically consist of decrementing the OSTCBDly field for each OS_TCB (if it‘s nonzero). OSTimeTick() follows the chain of OS_TCB starting at OSTCBList L3.20(2) until it reaches the idle t

jtagjava的专栏 1628

ucOSII 学习之初识实时操作系统-时间管理

ucosII需要提供定时中断,以实现禅师和延时控制功能。这个定时中断叫做时钟节拍。时钟节拍的频率越高,系统的负荷越重。 OSTimeTick()用于通知ucosII发生了时钟节拍中断。 OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() 这些函数可以再OS_TIME.c文件中找到。必须通过OS_C

瘦子 1548

时钟中断技术

时钟中断技术1 系统中断与时钟节拍1.1 系统中断  中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被系统识别,CPU则保存部分(或全部)现场(context),即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后执行任务调度,程序回到就绪态优先级最高的任务开始运行(对于可剥夺型内核)。  中断使得CPU

千里冰封 1688

任务控制块os_tcb

typedrf struct os_tcb { 通常,操作系统会将当前所有任务控制块组成一个双向的链表OSTCBList,这个链表将在函数OSTimeTick中被用到。 OSTimeTick函数是系统的时钟处理函数,他负责系统各任务的延时工作,一般情况下,OSTimeTick会被周期性的调用,其本质是操作上面所说的OSTCBList,它遍历链表中的每一个任务控制块的OSTCBDly字段,并将需...

ROM7RAM的博客 3001

ucosIII 时钟节拍和时间管理

时钟节拍 时间管理器 软件定时器

本地服务器 7113

UCOS学习笔记——钩子函数及中断时间管理

UCOS学习笔记钩子函数空闲任务函数OSIdleTaskHook()注意!:中断管理中断处理过程直接发布与延迟发布直接发布延迟发布直接发布与延迟发布对比OSTimeTick()函数临界段代码保护时间管理OSTimeDly()函数OSTimeDlyHMSM()函数 钩子函数 空闲任务函数OSIdleTaskHook() 函数代码如下: void OSIdleTaskHook (void) { #if...

万里羊的博客 3748

与中断相关的问题

要弄清楚以下函数的意义:OSTimeTick()在OS_CORE.C中,为时钟管理函数。OSTickISR( )在OS_CPU_A.S中以汇编的形式编写。任何计算机系统都应该有一系统时钟,UCOS系统的系统时钟是通过硬件定时器产生中断来实现的,这个中断会产生一个时钟中断服务程序,时钟中断服务程序也叫做节拍服务。各个任务运行都需要一个周期性的信号指示,即每一个任务允许运行的时间片是多少,

silenceee的专栏 1612

ucos操作系统(2)——OSTimeDly

时间管理函数有OSTimeDly()和OSTimeDlyHMSM() 以前者为例,调用OSTimeDly()时: 1.取消当前任务的就绪态,使之进入等待态; 2.给OSTCBDly赋值,即将参数传至OSTCBDly,就是在等待态的时间; 3.调用函数OSSChed(),立即调用调度函数。 至于任务如何退出等待态,就需要进入每个节拍的中断服务函数OSTickISR(),当然此前需要先设置时钟中断向量以及时钟频率。对于OSTickISR()函数,其中调用OSTimeTick(),并在结束前调用中断退出函数OSI

脱去三千烦恼丝 2405

3-(时间管理)延时函数

UCOSIII 时间管理(延时函数) 系统频率设置方法及延时函数原理 各个函数参数用法介绍,及注意事项 栗子功能+代码 延时函数会涉及到系统滴答时钟,所以有必要介绍下系统滴答时钟的原理。系统里有一个计数变量OSTickCtr。系统滴答时钟是由滴答定时器产生的,其实也就是通过一个定时器来产生特定时间间隔的中断,每产生一个系统时钟中断这个变量就自加1。而延时函数就是用这个OSTick...

深蓝判官 3452
上一篇: 与中断相关的问题
下一篇: C语言 迷宫问题求解(顺序栈应用示例)
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值