CMSIS-RTOS 时间管理之时间延迟Time Delay
时间管理 Time Management
此RTOS除了可以把你的应用代码作为线程运行,它还可以提供一些时间服务功能,使用这些功能你就可以访问RTOS的一些系统调用。
时间延迟Time Delay
在所有的时间服务功能中,最基本的一个就是延时函数。它可以在你的应用中提供非常简单易用的延时功能。也许你会觉得CMSIS-RTOS已经占用了5k字节的代码量,但是在非RTOS的应用中,我们也常会用到一些延时循环、简单的调度循环等,这些循环功能同样会占用一些字节,而我们的RTOS在这方面可能会占用更少的代码量。
void osDelay(uint32_t millisec)
上面这个调用会导致当前线程进入等待延时状态(WAIT_DELAY),延时时间由用户指定。与此同时调度器将会执行下一个处于准备状态(READY)的线程。
注:在线程的生命周期中,它会进入多种状态。这里一个处于运行状态(RUN)的线程被osDelay阻塞,然后它就会进入等待状态(WAIT)。当延时时间结束时,它就会进入准备状态(READY),调度器就会把它置于运行状态(RUN)。如果它的时间片结束了,它就会返回准备状态(READY)。
当定时时间结束时,线程会离开等待延时状态,进入READY状态。当调度器把线程移入RUNNING状态时,它就会继续运行。如果线程在以后的执行过程中没有任何阻塞调用,在它的时间片结束时就会被置于READY状态,同时另外一个同优先级的线程就会进入运行状态。
等待事件
除了单纯的时间延迟,同样可以使用事件等待让线程暂停并进入等待状态,当有另外一个RTOS事件出现时,就会触发线程继续运行。RTOS事件可以是一个信号,消息或者邮件。如果没有事件出现,就可以osWait()这个API,它有一个毫秒级别的超时机制,可以允许线程的唤醒和继续执行。
osStatus osWait(uint32_t millisec)//RTX不支持此函数
当设定的时间结束,线程就会由WAIT状态进入到READY状态,随后被调度器置于RUN状态。osWait在CMSIS RTOS里面是一个可选API。如果你打算使用这个函数,必须先确定你使用的RTOS是支持的。需要注意的是,CMSIS RTOS目前封装的keil RTX 是不支持这个API的。
通过STM32的simulaiton,我发现他的执行顺序是这样的:首先进入main函数,一系列初始化后,完成osKernelStart (); 后,马上进入led_Thread2,执行到osSemaphoreRelease(sem1);,转到led_Thread1,LED_On(1); osDelay(500);还没开始delay就又转到led_Thread2。恰好线程2又是delay,程序中没什么可执行,索性线程1和线程2就delay了500ms,然后又回到线程1执行led关,等待semaphore。
/*----------------------------------------------------------------------------
Designers Guide to the Cortex-M Family
Semaphore Example
*----------------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "cmsis_os.h"
#include "Board_LED.h"
void led_Thread1 (void const *argument);
void led_Thread2 (void const *argument);
osThreadDef(led_Thread1, osPriorityAboveNormal, , ); //note the raised priority for led_thread 1
osThreadDef(led_Thread2, osPriorityNormal, , );
osThreadId T_ledOn;
osThreadId T_ledOff;
/*----------------------------------------------------------------------------
Define the semaphore
*---------------------------------------------------------------------------*/
osSemaphoreId sem1;
osSemaphoreDef(sem1);
/*----------------------------------------------------------------------------
Wait to acquire a semaphore token from sem1 then flash LED 1
*---------------------------------------------------------------------------*/
void led_Thread1 (void const *argument)
{
for (;;)
{
osSemaphoreWait(sem1, osWaitForever);
LED_On();
osDelay();
LED_Off();
}
}
/*----------------------------------------------------------------------------
Flash LED 2 and 'release' a semaphore token to sem1
*---------------------------------------------------------------------------*/
void led_Thread2 (void const *argument)
{
for (;;)
{
LED_On();
osSemaphoreRelease(sem1);
osDelay();
LED_Off();
osDelay();
}
}
/*----------------------------------------------------------------------------
Initilise the LED's, Create the semaphore and start the threads
*---------------------------------------------------------------------------*/
int main (void)
{
osKernelInitialize (); // initialize CMSIS-RTOS
LED_Initialize ();
sem1 = osSemaphoreCreate(osSemaphore(sem1), );
T_ledOff = osThreadCreate(osThread(led_Thread2), NULL);
T_ledOn = osThreadCreate(osThread(led_Thread1), NULL);
osKernelStart (); // start thread execution
}
CMSIS-RTOS 时间管理之时间延迟Time Delay的更多相关文章
- liteos时间管理(九)
1. 时间管理 1.1 概述 1.1.1 概念 时间管理以系统时钟为基础.时间管理提供给应用程序所有和时间有关的服务. 系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数. ...
- 【uTenux实验】时间管理(系统时间/周期性处理/警报处理)
1.系统时间管理 系统时间管理函数用来对系统时间进行操作,是OS的一个基础性的东西.个人认为,设置系统时间和获取系统时间对OS来说基本是可有可无的. uTenux提供了三个系统时间相关API.分别用于 ...
- (笔记)Linux内核学习(八)之定时器和时间管理
一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系 ...
- linux设备驱动归纳总结(七):1.时间管理与内核延时【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxx ...
- 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】
在项目管理和团队作业中,经常面临的问题就是时间管理和优先级管理发生问题,项目被delay,团队工作延后,无法达到预期目标. 这个仿佛是每个人都会遇到的问题,特别是现在这么多的内容软件来分散我们的注意力 ...
- RTX——第12章 系统时钟节拍和时间管理
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 操作系统的时钟节拍和时间管理函数,其中时间管理函数是 RTX 的基本函数,初学 ...
- 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】
转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的 ...
随机推荐
- (转载)ListView与ScrollView冲突的4种解决方案
问题解决方案1.手动设置ListView高度 经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动 ...
- 如何用一个app操作另外一个app.比如微信群控那样的
如何实现一个app.控制另外的app,比如市面上群控微信的,是用测试工具的原理?还是什么模拟点击的原理? 如何用一个app操作另外一个app.比如微信群控那样的 >> android这个答 ...
- Python 计算相似度
#计算相似度 #欧式距离 # npvec1, npvec2 = np.array(det_a), np.array(det_b) # similirity=math.sqrt(((npvec1 - n ...
- js的运算小数点的问题
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这 ...
- 关于Python的装饰器
false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {m ...
- 微信小程序微信支付的一些坑
使用的是Node.js作为后端 统一下单: appid:这里的appid是调起微信支付的appid mch_id:商户号,需要注意的是商户号要与appid对应 nonce_str:Math.rando ...
- [Vijos P2000]A x B Problem
题目大意:叫你求A × B. 解题思路:高精度.你可千万别小看这道题,这是2017年7月27日的信息. 不过也不要怕,根据twd2的题解里写的,用普通的高精度加上一些小小的修改是可以过的. 那么直接上 ...
- Java基础学习总结(5)——多态
一.面向对象最核心的机制--动态绑定,也叫多态 1.1.通过下面的例子理解动态绑定,即多态 package javastudy.summary; class Animal { /** * 声明一个私有 ...
- ubuntu鼠标和触摸板的禁用
ubuntu鼠标和触摸板的禁用 学习了:http://www.2cto.com/os/201308/239403.html 在终端下直接执行以下命令来打开或关闭触摸板. sudo modprobe - ...
- SpringMVC+Jquery -页面异步载入数据
背景: 做项目时涉及到页面.当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新.这都是几百年前使用的技术了.你用 ...