UC/OS II 系统时钟

UCOS是一个实时的多任务任务基于优先级的操作系统,要运行多任务的话,在启动多任务之后,需要在每隔一段时间(一个滴答)内进行任务调度和相关数据的更新,以确保满足运行要求的最高优先级任务以便在下一次任务调度切换的时候能够得到一个及时的响应。
这个时间间隔是由时间中断来实现,而且每个中断的中断函数需要对相关的数据进行一个周期性更新。
在STM32中时间的中断由SysTick定时器(是cortexM3内核的定时器)实现。
系统时间中断函数OS_CPU_SysTickHandle 函数实现。
系统时钟中断
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(详情请见《CM3权威指南》8.7节)。
在SysTick定时器开始工作之前,需要对定时器进行 初始化,确定其中断时间间隔,以及相关寄存器的配置。其功能由OS_CPU_SysTickInit(os_cpu_c.c)函数实现。
这里配置没有用到st的官方库,而是直接使用的寄存器操作。
代码如下:
//对应寄存器的地址
#define  OS_CPU_CM3_NVIC_ST_CTRL    (*((volatile INT32U *)0xE000E010))   /* SysTick Ctrl & Status Reg. */
#define  OS_CPU_CM3_NVIC_ST_RELOAD  (*((volatile INT32U *)0xE000E014))   /* SysTick Reload  Value Reg. */
#define  OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))   /* SysTick Current Value Reg. */
#define  OS_CPU_CM3_NVIC_ST_CAL     (*((volatile INT32U *)0xE000E01C))   /* SysTick Cal     Value Reg. */
#define  OS_CPU_CM3_NVIC_PRIO_ST    (*((volatile INT8U  *)0xE000ED23))   /* SysTick Handler Prio  Reg. */

#define  OS_CPU_CM3_NVIC_ST_CTRL_COUNT                    0x00010000     /* Count flag.                */
#define  OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC                  0x00000004     /* Clock Source.              */
#define  OS_CPU_CM3_NVIC_ST_CTRL_INTEN                    0x00000002     /* Interrupt enable.          */
#define  OS_CPU_CM3_NVIC_ST_CTRL_ENABLE                   0x00000001     /* Counter mode.              */
#define  OS_CPU_CM3_NVIC_PRIO_MIN                               0xFF     /* Min handler prio.          */

void  OS_CPU_SysTickInit (void)
{
    INT32U  cnts;
    cnts = OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC; //OS_CPU_SysTickClkFreq()是得到systick的时钟频率。则也就是说,计数器一秒钟能计数的次数。OS_TICKS_PER_SEC(os_cfg.h)表示的是一秒钟计数器需要清零的次数,这里配置为1000(可以根据系统的需求进行配置),也就是说1s/1000 = 1ms进行一次systick时间中断。那么1ms内定时器需要计数次数为OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC

    OS_CPU_CM3_NVIC_ST_RELOAD = (cnts - 1);//将cnts的值填进RELOAD寄存器中
                                                
    OS_CPU_CM3_NVIC_PRIO_ST   = OS_CPU_CM3_NVIC_PRIO_MIN; //设置systick中断的优先级

    OS_CPU_CM3_NVIC_ST_CTRL  |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC | OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;//定时器使能,开启内核时钟
                                      
    OS_CPU_CM3_NVIC_ST_CTRL  |= OS_CPU_CM3_NVIC_ST_CTRL_INTEN;   //定时器中断使能
}
系统时钟中断中断函数
在系统时间中断后,便会执行相应的中断函数void  OS_CPU_SysTickHandler (void)(os_cpu_c.c)
该函数的主要功能就是将中断状态标志全局变量OSIntNesting加1,然后调用OSTimeTick()进行调度。
在退出中断程序之前,调用OSIntExit,完成退出之前的最后处理。 该函数在之后的中断管理说明。
时间中断任务调度器OSTimeTick
OSTimeTick函数(os_core.c)的主要作用是在系统时钟中断的时候,由中断程序调用,对任务的时延、任务的状态进行修改,设置就绪状态,但是不会实现任务的切换。
函数的核心代码部分如下:
ptcb = OSTCBList;                                  //指向就绪任务控制块链表
        while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) {     //遍历链表
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0u) {                    //如果设置了任务时延或者等待事件时延
                ptcb->OSTCBDly--;                          //将时延时间减1
                if (ptcb->OSTCBDly == 0u) {                //若是时延时间为0

                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {  //如果任务等待事件有一个发生了
                        ptcb->OSTCBStat  &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;          //清除事件等待标志,因为时间已经到了,不管有没有事件发生,都得清零
                        ptcb->OSTCBStatPend = OS_STAT_PEND_TO;                 //表示等待事件以为时间超时不在等待
                    } else {
                        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;  //任务等待完成,或是因为是简单的任务延时,或者是因为任务等待事件已经发生
                    }

                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  //任务处于就绪状态,而不是阻塞状态(就绪链表中的任务状态只有三种,就绪,阻塞和运行态)
                        OSRdyGrp               |= ptcb->OSTCBBitY;             //更新就绪任务表和就绪任务数组
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list                */
            OS_EXIT_CRITICAL();
        }
在就绪任务链表中,若ptcb->OSTCBDly != 0u,说明该任务处于时延状态(任务时延或者等待时间时延),为阻塞态。(两者等价)
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: uC/OS-II是一种常见的实时操作系统,特别适用于嵌入式系统应用。以下是一些嵌入式系统中使用uC/OS-II的常见应用: 1. 通信设备:uC/OS-II可以帮助控制通信设备的操作,包括传输数据、管理缓冲区和处理错误。 2. 汽车电子系统:现代汽车中有许多电子设备需要管理,包括引擎控制、车载娱乐系统和车载导航系统uC/OS-II可以帮助管理这些设备,使它们能够协同工作。 3. 工业自动化:在工业自动化应用中,uC/OS-II可以协调多个任务,从而提高系统的吞吐量和响应速度。这种操作系统可以管理复杂的工业过程,并提供实时控制和监控。 4. 医疗设备:在医疗设备中,uC/OS-II可以管理多个任务和处理程序,从而确保设备能够及时、准确地响应患者的需要。 5. 智能家居:智能家居设备需要管理多个任务,包括控制照明、温度和安全系统uC/OS-II可以帮助这些设备实现实时响应和协调。 总的来说,uC/OS-II在嵌入式系统中的应用非常广泛,可以帮助嵌入式系统实现实时响应、多任务管理和复杂操作。 ### 回答2: uC/OS-II是一个广泛应用于嵌入式系统的实时操作系统(RTOS)。 嵌入式系统是一种特殊的计算机系统,通常是嵌入到其他设备中的计算机系统。嵌入式系统广泛应用于各种领域,如汽车、航空航天、医疗、家电、通讯等。而uC/OS-II作为嵌入式系统的操作系统,具有以下应用: 首先,uC/OS-II提供了实时任务调度和管理功能。嵌入式系统通常需要同时处理多个任务,如控制、通信、显示等。而uC/OS-II能够根据任务的优先级进行实时调度,确保高优先级任务能够及时响应,保证系统的实时性能。 其次,uC/OS-II提供了多任务之间的通信和同步机制。在嵌入式系统中,不同任务之间需要进行信息交换和共享资源。uC/OS-II提供了消息队列、信号量、互斥量等机制,确保不同任务之间的协同工作。 此外,uC/OS-II提供了中断管理和时钟服务功能。嵌入式系统通常需要对各种硬件设备进行中断处理,如按键、定时、通信设备等。uC/OS-II能够及时响应中断事件,并进行相应的处理。同时,它还提供了时钟服务,用于定时触发定时、任务延时等功能。 最后,uC/OS-II还具备可移植性和可扩展性。它可以运行在不同的硬件平台上,支持多种处理架构。此外,它还提供了丰富的组件和功能模块,可以方便地进行系统定制和扩展。 综上所述,uC/OS-II作为嵌入式系统中的操作系统,具有广泛的应用。它能够提供实时任务调度和管理、任务之间的通信和同步、中断管理和时钟服务等功能,使得嵌入式系统能够高效可靠地运行。 ### 回答3: 嵌入式系统uC/OS-II是一个非常流行和广泛应用的实时操作系统。嵌入式系统是指专门设计用于特定应用领域的计算机系统,例如汽车电子、医疗械和工业自动化等。这些系统通常具有实时性、可靠性和高效性的需求。而uC/OS-II就是为满足这些需求而开发的一款实时操作系统。 在嵌入式系统中,uC/OS-II可以应用于各种各样的领域。首先,它可以用于控制和监控系统。嵌入式系统需要对外部环境进行实时的监测和控制,以保证系统的正常运行。通过使用uC/OS-II,可以轻松实现传感数据的采集和实时控制,从而实现自动化控制系统。 其次,uC/OS-II也是无人机和机人控制系统的理想选择。无人机和机人通常需要高效的任务调度和实时响应能力。uC/OS-II提供了灵活的任务管理和实时调度机制,可以帮助开发人员快速构建高性能的无人机和机人控制系统。 此外,uC/OS-II还适用于网络通信系统。现代嵌入式系统通常需要与外部系统进行通信,以实现数据传输和远程控制。通过使用uC/OS-II提供的网络通信功能,可以轻松实现与外部设备的数据交互和通信连接。 总的来说,uC/OS-II在嵌入式系统中的应用非常广泛。它可以支持实时控制、任务调度、网络通信和数据交互等功能,满足各种不同领域嵌入式系统的需求。同时,uC/OS-II还具有可移植性和可扩展性,使得开发人员可以更加灵活地进行系统设计和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值