【uTenux实验】时间管理(系统时间/周期性处理/警报处理)
1、系统时间管理
系统时间管理函数用来对系统时间进行操作,是OS的一个基础性的东西。个人认为,设置系统时间和获取系统时间对OS来说基本是可有可无的。
uTenux提供了三个系统时间相关API。分别用于设置系统时间、获取系统时间和获取系统工作时间。其中,前两个比较蛋疼。时间的表示是从1985年1月1日0:00:00(GMT)开始以ms为单位的累加。要想获得可读的时分秒,还得手动转换。我最讨厌这个转换了,所以不想细做这个实验。
tk_get_otm获取的系统工作时间也是一ms表示的,只是这个数据比较直观,不需要再去转换了。
【实验说明】
我懒的去转换时间,本实验使用验证三个函数,用ms表示时间。
首先设置系统时间,然后读出十次otm,最后读出系统时间。看看读出的系统时间与写入的时间的差别。其实这时,板子上RTC功能没有打开,设置系统时钟这个功能基本等于没用。
我比较懒,这就就在例程的基础上添加几行代码。没有手动输入各个函数。
【代码及输出】
#include "TimeSample.h" EXPORT ER TimeSample( void )
{
B ostr[],hstr[],mstr[],sstr[];
UW i,hour,minute,second;
SYSTIM otm,systime;
ER ercd; //设置系统时间
systime.hi = ;
systime.lo = ;
tk_set_tim(&systime); tm_putstring((UB*)"Time sample is now starting!\n");
for(i=;i<;i++) {
ercd=tk_get_otm(&otm);
if(E_OK != ercd){
tm_putstring((UB*)"Time can't be got;\n");
PutErcd(ercd);
}
tm_putstring((UB*)"Now working up time is ");
second=otm.lo/;
minute=second/;
second=second%;
hour=minute/;
minute=minute%;
ltostr(otm.lo,ostr,,); /*put otm string */
tm_putstring((UB*)ostr);
tm_putstring((UB*)",");
ltostr(hour,hstr,,); /*put hour string */
tm_putstring((UB*)hstr);
tm_putstring((UB*)":");
ltostr(minute,mstr,,); /*put minute string */
tm_putstring((UB*)mstr);
tm_putstring((UB*)":");
ltostr(second,sstr,,); /*put second string */
tm_putstring((UB*)sstr);
tm_putstring((UB*)"\n"); Delay(0x1700000);
}
//获取系统时间并输出
tk_get_tim(&systime);
tm_putstring((UB*)"Now system time is ");
second=systime.lo/;
minute=second/;
second=second%;
hour=minute/;
minute=minute%;
ltostr(systime.lo,ostr,,); /*put otm string */
tm_putstring((UB*)ostr);
tm_putstring((UB*)",");
ltostr(hour,hstr,,); /*put hour string */
tm_putstring((UB*)hstr);
tm_putstring((UB*)":");
ltostr(minute,mstr,,); /*put minute string */
tm_putstring((UB*)mstr);
tm_putstring((UB*)":");
ltostr(second,sstr,,); /*put second string */
tm_putstring((UB*)sstr);
tm_putstring((UB*)"\n"); return E_OK;
}
输出:
----------------------------------------------------
micro Tenux Version 1.6.00(build 0180)
Supported MCU is ST STM32F407VG
Copyright(c) 2008-2013 by Dalian uLoong Co.,Ltd.
----------------------------------------------------
Time sample is now starting!
Now working up time is 0,0:0:0
Now working up time is 570,0:0:0
Now working up time is 1150,0:0:1
Now working up time is 1730,0:0:1
。。。。。。。。。。。。。。
Now working up time is 9230,0:0:9
Now working up time is 9810,0:0:9
Now working up time is 10390,0:0:10
Now working up time is 10960,0:0:10
Now system time is 12140,0:0:12
Push any key to shutdown the micro Tenux.
2、周期性处理
周期性处理程序是一个在规则的时间间隔内启动的时间事件处理程序。与任务不同,周期性处理函数不是死循环。执行一次就退出,但是不能单独存在。
建立好周期性处理函数之后,原任务就不用管了。OS会周期性地执行这个任务。这个周期性的函数,不受优先级限制。只要到期就会运行一次。不管多高优先级的任务在使用MCU。
在建立每个周期性处理程序时,会为它们设定程序启动时的时间间隔(周期时间)和周期相位。周期时间t就是每隔t时间会启动一次处理函数,周期相位m,是指每个周期的第m时间启动这个处理函数。
SVC描述
1、创建周期性处理程序
ID cycid=tk_cre_cyc(T_CCYC* pk_ccyc);
其中T_CCYC是创建结构体,定义如下
typedef struct t_ccyc {
VP exinf; /* Extended information */
ATR cycatr; /* Cycle handler attribute */
FP cychdr; /*处理程序入口地址*/
RELTIM cyctim; /* 处理周期*/
RELTIM cycphs; /* 相位*/
UB dsname[]; /* Object name */
} T_CCYC;
2、创建之后就实验tk_sta_cyc让周期函数可以运行了
3、停止周期运行tk_stp_cyc,删除周期处理tk_del_cyc,只要提供一个ID即可。
【实验描述】
1、创建一个周期运行程序并启动。
2、创建一个优先级较高的任务TaskA,启动后进入死循环。即不给初始任务再次运行的机会
3、周期处理函数,处理20次之后,自动停止并删除自己。
【代码及输出】
例子太简单了,自己加了点内容。
#include "CycSample.h" void CycHandler(void);
void CycTaskSampseA(W stacd,VP exinf);
void CycTaskSampseB(W stacd,VP exinf);
static B count;
static ID CycID;
static ID TaskA_ID; EXPORT ER CycSample( void )
{
ER ercd;
T_CCYC ccyc;
T_CTSK ctsk; ctsk.bufptr = NULL;
ctsk.exinf = (VP)NULL;;
ctsk.itskpri = ;
ctsk.stksz = ;
ctsk.task = CycTaskSampseA;
ctsk.tskatr = TA_HLNG | TA_RNG0;
TaskA_ID = tk_cre_tsk(&ctsk); //创建周期处理
ccyc.cycatr = TA_HLNG | TA_STA;
ccyc.cychdr = CycHandler;
ccyc.cycphs = ;
ccyc.cyctim = ;
ccyc.exinf = (VP)NULL;
CycID = tk_cre_cyc(&ccyc); if(E_OK<= CycID)
{
tm_putstring((UB*)"成功创建周期性处理\n");
}
else
{
}
if(E_OK <= tk_sta_cyc(CycID))
{
tm_putstring((UB*)"成功启动周期性处理\n");
} tk_sta_tsk(TaskA_ID,); return E_OK;
} //验证周期处理与任务优先级无关
void CycTaskSampseA(W stacd,VP exinf)
{
tm_putstring((UB*)"TaskA启动成功\n");
while();
} void CycHandler(void)
{
count++;
if(count == )
{
tm_putstring((UB*)"i will stop my cyc\n");
if(E_OK <= tk_stp_cyc(CycID))
{
tm_putstring((UB*)"sucess stop cyc\n");
}
tm_putstring((UB*)"i will delete my cyc\n");
if(E_OK <= tk_del_cyc(CycID))
{
tm_putstring((UB*)"sucess delete cyc\n");
}
return;
}
tm_putstring((UB*)"The times of cycle is: ");
tm_putchar(count+);
tm_putstring((UB*)" !\n");
}
输出:
----------------------------------------------------
micro Tenux Version 1.6.00(build 0180)
Supported MCU is ST STM32F407VG
Copyright(c) 2008-2013 by Dalian uLoong Co.,Ltd.
----------------------------------------------------
成功创建周期性处理
成功启动周期性处理
TaskA启动成功
The times of cycle is: 1 !
The times of cycle is: 2 !
The times of cycle is: 3 !
The times of cycle is: 4 !
The times of cycle is: 5 !
The times of cycle is: 6 !
The times of cycle is: 7 !
The times of cycle is: 8 !
The times of cycle is: 9 !
i will stop my cyc
sucess stop cyc
i will delete my cyc
sucess delete cyc
3、警报处理
警报处理程序是一个在特定时间启动的时间事件处理程序。警报处理也是有OS直接管理的。创建警报处理后,并不能立即激活警报,只有当调用了tk_sta_alm之后才能激活这个警报。
激活警报时,需要为警报处理提供警报持续时间。警报持续时间结束,或者手动调用tk_stp_alm停止警报时,警报停止。
这个就像大楼里边的火警,发生火情(事件)激活警报,警报开始工作。警报持续一段时间,该知道发生火情的人都知道了,警报就停止了。也可能是虚惊一场,然后大楼管理员按了停止按钮,警报就停止了。
uTenux提供的警报处理API:
1、创建警报:
ID almid=tk_cre_alm(T_CALM* pk_calm);
创建结构体如下:
typedef struct t_calm {
VP exinf; /* Extended information */
ATR almatr; /* Alarm handler attribute */
FP almhdr; /* Alarm handler address */
UB dsname[8]; /* Object name */
}T_CALM;
即只需要提供警报处理的函数入口和处理程序属性即可。
2、激活警报
ER ercd= tk_sta_alm(ID almid,RELTIM almtim);
提供警报处理的ID和警报持续时间。即可
3、停止警报
ER ercd= tk_stp_alm(ID almid);
将警报almid停止掉。
【实验描述】
1、创建一个警报,并启动
2、在警报处理函数中,输出一段信息
3、等待警报时间到,自动结束
4、删除警报,返回
【代码及输出】
#include "CycSample.h" void CycHandler(void);
void CycTaskSampseA(W stacd,VP exinf);
void CycTaskSampseB(W stacd,VP exinf);
static B count;
static ID CycID;
static ID TaskA_ID; EXPORT ER CycSample( void )
{
ER ercd;
T_CCYC ccyc;
T_CTSK ctsk; ctsk.bufptr = NULL;
ctsk.exinf = (VP)NULL;;
ctsk.itskpri = ;
ctsk.stksz = ;
ctsk.task = CycTaskSampseA;
ctsk.tskatr = TA_HLNG | TA_RNG0;
TaskA_ID = tk_cre_tsk(&ctsk); //创建周期处理
ccyc.cycatr = TA_HLNG | TA_STA;
ccyc.cychdr = CycHandler;
ccyc.cycphs = ;
ccyc.cyctim = ;
ccyc.exinf = (VP)NULL;
CycID = tk_cre_cyc(&ccyc); if(E_OK<= CycID)
{
tm_putstring((UB*)"成功创建周期性处理\n");
}
else
{
}
if(E_OK <= tk_sta_cyc(CycID))
{
tm_putstring((UB*)"成功启动周期性处理\n");
}
tk_sta_tsk(TaskA_ID,); return E_OK;
} //验证周期处理与任务优先级无关
void CycTaskSampseA(W stacd,VP exinf)
{
tm_putstring((UB*)"TaskA启动成功\n");
while();
} void CycHandler(void)
{
count++;
if(count == )
{
tm_putstring((UB*)"i will stop my cyc\n");
if(E_OK <= tk_stp_cyc(CycID))
{
tm_putstring((UB*)"sucess stop cyc\n");
}
tm_putstring((UB*)"i will delete my cyc\n");
if(E_OK <= tk_del_cyc(CycID))
{
tm_putstring((UB*)"sucess delete cyc\n");
}
return;
}
tm_putstring((UB*)"The times of cycle is: ");
tm_putchar(count+);
tm_putstring((UB*)" !\n");
}
输出:
----------------------------------------------------
micro Tenux Version 1.6.00(build 0180)
Supported MCU is ST STM32F407VG
Copyright(c) 2008-2013 by Dalian uLoong Co.,Ltd.
----------------------------------------------------
Start alarm sucess
Wait alarm stop
Wait alarm stop
Wait alarm stop
Wait alarm stop
Wait alarm stop
Wait alarm stop
Now alarm will delete
Delete alarm sucess
Push any key to shutdown the micro Tenux.
【uTenux实验】时间管理(系统时间/周期性处理/警报处理)的更多相关文章
- Linux的硬件时间、校正Linux系统时间及系统时间调用流程
第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时. ...
- ubuntu下的时间设定(硬件时间,系统时间,本地时间)
问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...
- java new Date()得到的时间和系统时间不一样
造成这种问题的原因是:操作系统时区跟JVM的时区不一致. [root@paas244 ~]# timedatectl Local time: Thu 2016-12-29 15:35:44 CST U ...
- Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出
1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...
- ftp上来显示的时间和系统时间不一致
ftp上来显示的时间和系统时间不一致,是因为默认情况下,vsftpd 是用GMT做为他的时间的,所以和系统的时间可能会不一致 修改也非常简单: vi /etc/vsftpd/vsftpd.conf 在 ...
- linux 系统文件类型、系统安装时间、系统启动时间、系统运行时间、设置及显示时间、系统时间和硬件时间
系统文件类型: 1) $mout 2) df -l:仅列出本地文件系统:-h (--human-readable):-T:文件系统类型 $df -lhf 3) file -s (--special-f ...
- IIS7日志中时间与系统时间不一致的原因
最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日 ...
- tomcat时间与系统时间不一致问题
我在部署应用到centos系统上的tomcat服务器中运行,发现操作系统的时间和tomcat中的访问日志的时间与系统时间不一致,但是查看当前操作系统的时区也是CST时区(中国标准时区). 查看系统的时 ...
- Centos7 修改硬件时间和系统时间
查看系统时间 [root@localhost ~]# date Tue Jun 13 10:20:13 CST 2017 查看硬件时间 [root@localhost ~]# hwclock --sh ...
- centos7系统日志时间与系统时间相差8小时
场景:当我们修改完系统时间的时区后,我们去查看我们的系统日志的时间发现时区还是在之前的系统时间时区. [root@vp-n ~]# ls -l /etc/localtime lrwxrwxrwx 1 ...
随机推荐
- github 使用教程初级版
github 是一个基于 git 的代码托管平台,付费用户可以建私人仓库,免费用户只能使用公共仓库.对于一般人来说公共仓库就已经足够了,而且也没多少代码来管理.下面简单介绍如何使用 github,供初 ...
- QML的一些基础的区分
什么时候用Item什么时候用Rectangle? 什么时候用Row什么时候用RowLayout? 这2个问题经常会让人迷糊. 什么时候用Item,就是你要做一个组件,这个组件是一个复合的组件,组件有部 ...
- 爱默生UPS并机系统:进入与退出操作方法
UPS并机系统的进入与退出: 进入:.合UPS的出线及进线开关:开启第一台UPS,等待整流指示灯常亮.然后Invert On,正常开机,此时UPS进入逆变状态 .合另外一台UPS的出线及进线开关,等待 ...
- 软件测试面试(2)LR篇
一:LoadRunner常见问题整理 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消掉 2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen. ...
- javascript笔记7-事件
主要讲事件流.事件捕获.事件冒泡.事件处理程序.事件属性.事件类型.内存和优化等. 由于本文已经在微信订阅号上发布,为了防止原创性冲突检测,因此本文在此处已经删除. 详细请扫描订阅号二维码,查看历史信 ...
- vitruviano
维特鲁威人(意大利语:Uomo vitruviano) 是列奥纳多·达·芬奇在1487年前后创作的世界著名素描. 它是钢笔和墨水绘制的手稿,规格为34.4 cm × 25.5 cm. 根据约1500年 ...
- Gym 100960G (set+树状数组)
Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...
- Linux TC基于CBQ队列的流量管理范例
参考了TC的很多文档,自己也整理了一篇配置记录.在实际使用过程中效果还不错,在此分享给大家以备参考.环境:局域网规模不是很大40多台机器. NAT共享上网(内网:eth0 外网:eth2)CBQ是通过 ...
- CodeBlocks 中fopen函数不支持命令 “r”
//codeblocks #include<stdio.h> #include<stdlib.h> void main(void) { FILE *fp=NULL; if((f ...
- Thrift 个人实战--Thrift RPC服务框架日志的优化
前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...