μC/OS-II 的系统时钟
简介
μC/OS-II 与大多数计算机系统一样,用硬件定时器产生一个周期为 ms 级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(Time Tick)。
硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做 OSTickISR( )。中断服务程序通过调用函数 OSTimeTick( ) 来完成系统在每个时钟节拍时需要做的工作。
系统时钟中断服务程序
void OSTickISR(void)
{
保存CPU寄存器;
调用OSIntEnter( );
if (OSIntNesting == 1;
{
OSTCBCur->OSTCBStkPtr = SP; //保存堆栈指针
}
调用OSTimeTick( );
清除中断;
开中断;
调用OSIntExit( );
恢复CPU寄存器;
中断返回;
}
时钟节拍服务函数
void OSTimeTick (void)
{
……
OSTimeTickHook( );
……
OSTime++; //记录节拍数
……
if (OSRunning == TRUE) {
ptcb = OSTCBList;
while (ptcb->OSTCBPrio != OS_IDLE_PRIO)
{
OS_ENTER_CRITICAL( );
if (ptcb->OSTCBDly != 0)
{
if (--ptcb->OSTCBDly == 0) //任务的延时时间减一
{
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND)
== OS_STAT_RDY)
{
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY]
|= ptcb->OSTCBBitX;
} else {
ptcb->OSTCBDly = 1;
}
}
}
ptcb = ptcb->OSTCBNext;
OS_EXIT_CRITICAL( );
}
}
}
函数 OSTimeTick( ) 的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。
任务的延时
由于嵌入式系统的任务是一个无限循环,并且 μC/OS-II 还是一个抢占式内核,所以为了使高优先级别的任务不至于独占 CPU,可以给其他任务优先级别较低的任务获得 CPU 使用权的机会,μC/OS-II 规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数 OSTimeDly( ),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出 CPU 的使用权。
系统提供的延时函数
void OSTimeDly (INT16U ticks)
{
INT8U y;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
if (ticks > 0) { /* 0 means no delay! */
OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY; /* Delay current task */
OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find next task to run! */
}
}
取消任务延时函数
INT8U OSTimeDlyResume (INT8U prio)
获得系统时间函数
INT32U OSTimeGet (void)
设置系统时间函数
void OSTimeSet (INT32U ticks)
参考自:《μC/OS-II 入门教程》
μC/OS-II 的系统时钟的更多相关文章
- Nios II 系统时钟timestamp的应用
在用Nios II做外设时序驱动的时候,经常会用延时函数.有时会常使用某个FPGA芯片和时钟,比如笔者一直使用的芯片是cyclone系列 EP2C35F484C8N,PLL输入SOPC时钟是50M.因 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 基于 OS X Mavericks 系统
基于 OS X Mavericks 系统远景论坛黑苹果区新手引导 常见疑难解答 以及必要知识普及帖 请善用论坛搜索功能 认真仔细地阅读置顶帖里的教程以及注意事项 前言:之前建立10.9区求助规范帖时, ...
- 【小梅哥SOPC学习笔记】系统时钟的使用
给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- Apache service named reported the following error(OS 10055)由于系统缓冲区空间不足或队列已满解决办法?
apache启动失败报错: The Apache service named reported the following error:>>> AH00451: no listeni ...
- windows 系统时钟
偶然发现了一个函数用以查询操作系统的时钟间隔: BOOL WINAPI GetSystemTimeAdjustment( _Out_ PDWORD lpTimeAdjustment, _Out_ PD ...
- Mac OS X双系统变回虚拟机
Mac OS X双系统变回虚拟机 自从装了双系统后,感觉不要太好,装了虚拟机就开始有工作的干劲了.不妙的是,我在Win7系统里并没有装office,用不了word文档就写不了笔记和总结.我不太想在Wi ...
- STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)
系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...
- mac 下获取 os x 的系统版本,使用 oc cocoa
mac 下获取 os x 的系统版本,使用 oc cocoa 1: #import <CoreServices/CoreServices.h> SInt32 major, minor, b ...
随机推荐
- 排序算法(sorting algorithm)之 插入排序(insertion sort)
https://en.wikipedia.org/wiki/Insertion_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 loop2: 4,6,1,3,7 -> ...
- Maths | 病态问题和条件数
目录 1. 概念定义 1.1. 病态/ 良态问题 1.2. 适定/ 非适定问题 1.3. 良态/ 病态矩阵和条件数 2. 病态的根源 3. 计算条件数的方法 3.1. 与特征值的关系 3.2. 与奇异 ...
- 与我们息息相关的internet服务(2)---WWW服务
在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的公司网站 网站,在初中,那时浏览一个网页可叫网上冲浪,听起来似乎比洗澡还爽快,可现在这词就是土鳖,网上冲浪火起来主要是应 ...
- XML生成XAMl扩展
所有的WPF控件列为枚举 代码如: 1 public enum ControlType 2 { 3 Window_Resources, 4 Page_Resources, 5 Grid, 6 Stac ...
- bzoj3110(整体二分)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- 对状压dp的一点理解
此dp可以理解为最暴力的dp,因为他需要遍历每个状态,所以将会出现2^n的情况数量,所以明显的标志就是数据不能太多(好像是<=15?),然后遍历所有状态的姿势就是用二进制来表示,01串,1表示 ...
- JAVA数据结构之链表
JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...
- 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 2
接上篇:个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 1 Step1 在主程序中设置连接数据库 从Model类库的 App.Config 把数据库字符串拷贝出来, ...
- 网络编程——I/O复用
int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timev ...
- Calendar and GregorianCalendar
1.GregorianCalendar是Calendar的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统 2.注意 (1)月份:1月到12月[0-11] (2)星期:周日到周六[1-7] ...