VxWorks中POSIX标准定时机制
来源:互联网 发布:开淘宝网店需要的软件 编辑:程序博客网 时间:2024/06/05 14:15
VxWorks中主要提供IEEE的POSIX1003.1b标准定时器和WatchDog两种定时机制。
其中,WatchDog定时器主要作为系统时钟中断服务程序(ISR)的一部分维护。定时器超时后,关联的超时函数将会在系统时钟中断上下文中运行,即单独于当前进程之外运行。这个时候,超时函数与中断服务程序具有同等的约束条件,限制很大。比如,不能有可能导致阻塞的函数(malloc...),无参数且返回类型为void,不可重复进入,禁止中断等等。
LZ实习项目为协议栈开发,所以,对于定时器超时处理,首先应当在当前协议进程中进行,并且超时处理是非常有可能需要发送消息,因此需要带回复消息参数等等,基于以上原因,主要就看了下对POSIX定时机制并记录。
POSIX定时器:
POSIX定时器建立在时钟与信号基础之上,任务程序在指定时间间隔后向自身发送信号并进行处理。程序自身可创建、设置以及删除定时器。
POSIX基本标准是只支持秒级分辨率。由于大多数实时操作系统对定时器有更高要求,因此POSIX的两种扩展:XSI扩展和TMR扩展,他们分别定义了微秒级和纳秒级的时间分辨率。比较诡异的是,VxWorks中没有XSI扩展的标准API,但是却又有XSI支持的微妙级的数据结构,我特别纳闷。
数据类型:
time_t:typedef long time_t; /* seconds */struct timeval { time_t tv_sec; /* seconds */ long tv_usec; /* microseconds */ };struct timespec{time_t tv_sec; /* seconds */long tv_nsec; /* nanoseconds */};
TMR扩展定时器:
TMR扩展定时器使用的数据结构及POSIX API:
timer_create() // 创建时钟timer_gettime() // 获得时钟器给定值的当前剩余值timer_settime() // 设定时钟值timer_connect() // 联系用户函数和时钟信号(非POSIX标准)timer_cancel() // 取消一个时钟timer_getoverrun() // 获取超限次数
API详情请参考《UNIX系统编程》
基本流程:
实例:
#include <vxWorks.h>#include <stdio.h>#include <taskLib.h>#include <time.h>void timeout_handler(timer_t timerid, int arg);int count = 0;timer_t mytimer = 0;struct itimerspec setting_time;void myTest(void){int time_count = 0;setting_time.it_interval.tv_sec = 2;setting_time.it_interval.tv_nsec = 0;setting_time.it_value.tv_sec = 0;setting_time.it_value.tv_nsec = 100000000;/* create timer */if (ERROR == timer_create(CLOCK_REALTIME, NULL, &mytimer)){printf("create failed!\n");return;}/* connect to application */if (ERROR == timer_connect(mytimer, (VOIDFUNCPTR)timeout_handler, 0)){printf("connect failed!\n");return;}/* set and start timer */if (ERROR == timer_settime(mytimer, 0, &setting_time, NULL)){printf("settime failed!\n");return;}for (;;){/* delay 1s */taskDelay(sysClkRateGet());printf("time_%d== ", time_count);if (10 == time_count){/* cancel timer */(void)timer_cancel(mytimer);break;}}/* delete timer */(void)timer_delete(mytimer);}void timeout_handler(timer_t timerid, int arg){// 接口参考timer_connect形参// static int over = 0;count++;printf("Oh, dear~~\n");printf("count_%d== ", count);/* test time overrun */// taskDelay(sysClkRateGet()*5);// over = timer_getoverrun(mytiemr);// printf("over_%d== ", over);}
- VxWorks中POSIX标准定时机制
- VXWORKS 几种定时机制
- VXWORKS 几种定时机制
- VxWorks中Timer机制
- VxWorks中Timer机制
- VxWorks信号、中断处理与定时机制
- VxWorks共享看门狗定时机制的设计与实现
- POSIX标准
- POSIX标准
- POSIX 标准
- POSIX标准
- Posix标准
- Posix标准
- POSIX标准
- vxWorks系统中vxbus机制总结
- spring中定时机制
- POSIX 标准介绍
- POSIX 最新标准下载
- poj 1326 Mileage Bank【四舍五入】
- 视频中直线像素采样(cvInitLineIterator )把每个像素点的三个值写入csv文件中
- 使用Eclipse Memory Analyzer
- [Bug]ArcSDE分区表报:ORA-01000 maximum open cursors exceeded
- 如何通过APPLESCRIPT来狂发imessage(最简单的流程)
- VxWorks中POSIX标准定时机制
- recv函数返回值说明
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
- Data Structures and Other Objects Using C++ (Chapter 2) 学习笔记四
- Unicode、UTF-8 和 ISO8859-1有什么区别?
- win7系统远程桌面无法最大化的解决办法
- Tomcat VS. Apache:您钟情于哪一款?
- jquery博客
- 【Futures】&【Laws】