blob: a2e314d0415e7d269e4cfc674468b2373166e893 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- This is broken by doc revisioning.
-->
<link rel="shortcut icon" href="../../../../img/favicon.ico">
<title>toc - Apache Mynewt</title>
<link href="../../../../css/bootstrap-3.0.3.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../../../css/highlight.css">
<link href="../../../../css/base.css" rel="stylesheet">
<link href="../../../../css/custom.css" rel="stylesheet">
<link href="../../../../css/v2.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="toc">
<div class="container">
<div class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released (April 4, 2024)
</div>
</div>
</div>
</div>
<nav id="navbar" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="150" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li
class=""
>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li
class="important"
>
<a href="/quick-start/">Quick Start</a>
</li>
<li
class=""
>
<a href="/about/">About</a>
</li>
<li
class=""
>
<a href="/talks/">Talks</a>
</li>
<li
class="active"
>
<a href="/documentation/">Documentation</a>
</li>
<li
class=""
>
<a href="/download/">Download</a>
</li>
<li
class=""
>
<a href="/community/">Community</a>
</li>
<li
class=""
>
<a href="/events/">Events</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-3 v2-sidebar sidebar-container"><div id="docSidebar" class="hidden-print" role="complementary">
<div class="top">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search documentation" />
</div>
</form>
</div>
</div>
<ul class="toc-nav">
<li class="doc-version"><select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest">
Version: master
</option>
<option value="/v1_12_0/" >
Version: 1.12.0
</option>
<option value="/v1_11_0/" >
Version: 1.11.0
</option>
<option value="/v1_10_0/" >
Version: 1.10.0
</option>
<option value="/v1_9_0/" >
Version: 1.9.0
</option>
<option value="/v1_8_0/" >
Version: 1.8.0
</option>
<option value="/v1_7_0/" >
Version: 1.7.0
</option>
<option value="/v1_6_0/" >
Version: 1.6.0
</option>
<option value="/v1_5_0/" >
Version: 1.5.0
</option>
<option value="/v1_4_0/" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" selected="selected" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select></li>
<li ><a href="../../../introduction/">Mynewt Documentation</a>
<ul>
<li ><a href="../../../get_started/get_started/">Basic Setup</a>
</li>
<li >
<a href="../../../get_started/vocabulary/">Concepts</a>
</li>
<li ><a href="../../../tutorials/tutorials/">Tutorials</a>
</li>
<li ><a href="../../../os_user_guide/">OS User Guide</a>
<ul>
<li ><a href="../../mynewt_os/">OS Core</a>
<ul>
<li><a href="
../../os_started/
">Functions</a>
</li>
<li ><a href="../../context_switch/context_switch/">Scheduler</a>
</li>
<li ><a href="../../cputime/os_cputime/">CPU Time</a>
</li>
<li class="active"><a href="./">OS Time</a>
<ul>
<li><a href="
../os_time_advance/
">Functions</a>
</li>
</ul>
</li>
<li ><a href="../../task/task/">Tasks</a>
</li>
<li ><a href="../../event_queue/event_queue/">Event Queues</a>
</li>
<li ><a href="../../semaphore/semaphore/">Semaphores</a>
</li>
<li ><a href="../../mutex/mutex/">Mutexes</a>
</li>
<li ><a href="../../memory_pool/memory_pool/">Memory Pools</a>
</li>
<li ><a href="../../heap/heap/">Heap</a>
</li>
<li><a href="
../../mbuf/mbuf/
">Memory Buffers</a>
</li>
<li ><a href="../../sanity/sanity/">Sanity</a>
</li>
<li ><a href="../../callout/callout/">Callouts</a>
</li>
</ul>
</li>
<li ><a href="../../porting/port_os/">Porting to your Platform</a>
</li>
<li ><a href="../../../modules/console/console/">Console</a>
</li>
<li ><a href="../../../modules/shell/shell/">Shell</a>
</li>
<li ><a href="../../../modules/split/split/">Split Images</a>
</li>
<li ><a href="../../../modules/bootloader/bootloader/">Bootloader</a>
</li>
<li><a href="
../../../modules/fs/fs/fs/
">File System</a>
</li>
<li ><a href="../../../modules/hal/hal/">Hardware Abstraction Layer</a>
</li>
<li ><a href="../../../modules/drivers/driver/">Drivers</a>
</li>
<li ><a href="../../../modules/testutil/testutil/">Test Utilities</a>
</li>
<li ><a href="../../../modules/devmgmt/newtmgr/">Device Management with Newt Manager</a>
</li>
<li ><a href="../../../modules/imgmgr/imgmgr/">Image Manager</a>
</li>
<li >
<a href="../../../modules/baselibc/">Baselibc library</a>
</li>
<li ><a href="../../../modules/json/json/">JSON</a>
</li>
<li ><a href="../../../modules/fcb/fcb/">Flash Circular Buffer</a>
</li>
<li ><a href="../../../modules/stats/stats/">Stats</a>
</li>
<li ><a href="../../../modules/logs/logs/">Logs</a>
</li>
<li ><a href="../../../modules/sysinitconfig/sysinitconfig/">System Configuration And Initialization</a>
</li>
</ul>
</li>
<li><a href="
../../../../network/ble/ble_intro/
">BLE User Guide</a>
</li>
<li ><a href="../../../../newt/newt_intro/">Newt Tool Guide</a>
</li>
<li ><a href="../../../../newtmgr/overview/">Newt Manager Guide</a>
</li>
<li >
<a href="../../../../known_issues/">Known Issues</a>
</li>
</ul>
</li>
<li><a href="
../../../../faq/go_env/
">Appendix</a>
</li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<div class="doc-header">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/documentation/">Docs</a></li>
<li>&raquo; OS Time</li>
<li>&raquo; <a href="os/core_os/mynewt_os/">OS Core</a></li>
<li>&raquo; <a href="os/os_user_guide/">OS User Guide</a></li>
<li>&raquo; <a href="os/introduction/">Mynewt Documentation</a></li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 1.0.0 is not the most recent version of the Apache Mynewt
documentation. Click <a href="/latest">here</a> to read the latest
version.
</p>
</div>
<h1 id="os_time">OS_Time</h1>
<p>The system time for the Mynewt OS.</p>
<h2 id="description">Description</h2>
<p>The Mynewt OS contains an incrementing time that drives the OS scheduler and time delays. The time is a fixed size (e.g. 32 bits) and will eventually wrap back to zero. The time to wrap from zero back to zero is called the <strong>OS time epoch</strong>. </p>
<p>The frequency of the OS time tick is specified in the architecture-specific OS code <code>os_arch.h</code> and is named <code>OS_TICKS_PER_SEC</code>.</p>
<p>The Mynewt OS also provides APIs for setting and retrieving the wallclock time (also known as local time or time-of-day in other operating systems).</p>
<h2 id="data-structures">Data Structures</h2>
<p>Time is stored in Mynewt as an <code>os_time_t</code> value. </p>
<p>Wallclock time is represented using the <code>struct os_timeval</code> and <code>struct os_timezone</code> tuple.</p>
<p><code>struct os_timeval</code> represents the number of seconds elapsed since the epoch (00:00:00 Jan 1, 1970 UTC).</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code><span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timeval</span> {
<span style="color: #A90D91">int64_t</span> <span style="color: #000000">tv_sec</span>; <span style="color: #177500">/* seconds since Jan 1 1970 UTC */</span>
<span style="color: #A90D91">int32_t</span> <span style="color: #000000">tv_usec</span>; <span style="color: #177500">/* fractional seconds */</span>
};
<span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timeval</span> <span style="color: #000000">tv</span> <span style="color: #000000">=</span> { <span style="color: #1C01CE">1457400000</span>, <span style="color: #1C01CE">0</span> }; <span style="color: #177500">/* 01:20:00 Mar 8 2016 UTC */</span>
</code></pre></div>
<p><code>struct os_timezone</code> is used to specify the offset of local time from UTC and whether daylight savings is in effect. Note that <code>tz_minuteswest</code> is a positive number if the local time is <em>behind</em> UTC and a negative number if the local time is <em>ahead</em> of UTC.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code><span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timezone</span> {
<span style="color: #A90D91">int16_t</span> <span style="color: #000000">tz_minuteswest</span>;
<span style="color: #A90D91">int16_t</span> <span style="color: #000000">tz_dsttime</span>;
};
<span style="color: #177500">/* Pacific Standard Time is 08:00 hours west of UTC */</span>
<span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timezone</span> <span style="color: #000000">PST</span> <span style="color: #000000">=</span> { <span style="color: #1C01CE">480</span>, <span style="color: #1C01CE">0</span> };
<span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timezone</span> <span style="color: #000000">PDT</span> <span style="color: #000000">=</span> { <span style="color: #1C01CE">480</span>, <span style="color: #1C01CE">1</span> };
<span style="color: #177500">/* Indian Standard Time is 05:30 hours east of UTC */</span>
<span style="color: #A90D91">struct</span> <span style="color: #3F6E75">os_timezone</span> <span style="color: #000000">IST</span> <span style="color: #000000">=</span> { <span style="color: #1C01CE">-330</span>, <span style="color: #1C01CE">0</span> };
</code></pre></div>
<h2 id="list-of-functions">List of Functions</h2>
<p>The functions available in time are:</p>
<table>
<thead>
<tr>
<th><strong>Function</strong></th>
<th><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="../os_time_advance/">os_time_advance</a></td>
<td>Increments the OS time tick for the system.</td>
</tr>
<tr>
<td><a href="../os_time_delay/">os_time_delay</a></td>
<td>Put the current task to sleep for the given number of ticks.</td>
</tr>
<tr>
<td><a href="../os_time_get/">os_time_get</a></td>
<td>Get the current value of OS time.</td>
</tr>
<tr>
<td><a href="../os_time_ms_to_ticks/">os_time_ms_to_ticks</a></td>
<td>Converts milliseconds to os ticks.</td>
</tr>
<tr>
<td><a href="../os_get_uptime_usec/">os_get_uptime_usec</a></td>
<td>Gets the time duration since boot.</td>
</tr>
<tr>
<td><a href="../os_gettimeofday/">os_gettimeofday</a></td>
<td>Populate the given timeval and timezone structs with current time data.</td>
</tr>
<tr>
<td><a href="../os_settimeofday/">os_settimeofday</a></td>
<td>Set the current time of day to the given time structs.</td>
</tr>
</tbody>
</table>
<h2 id="list-of-macros">List of Macros</h2>
<p>Several macros help with the evalution of times with respect to each other.</p>
<ul>
<li><code>OS_TIME_TICK_LT(t1,t2)</code> -- evaluates to true if t1 is before t2 in time.</li>
<li><code>OS_TIME_TICK_GT(t1,t2)</code> -- evaluates to true if t1 is after t2 in time </li>
<li><code>OS_TIME_TICK_GEQ(t1,t2)</code> -- evaluates to true if t1 is on or after t2 in time.</li>
</ul>
<p>NOTE: For all of these macros the calculations are done modulo 'os_time_t'. </p>
<p>Ensure that comparison of OS time always uses the macros above (to compensate for the possible wrap of OS time).</p>
<p>The following macros help adding or subtracting time when represented as <code>struct os_timeval</code>. All parameters to the following macros are pointers to <code>struct os_timeval</code>.</p>
<ul>
<li><code>os_timeradd(tvp, uvp, vvp)</code> -- Add <code>uvp</code> to <code>tvp</code> and store result in <code>vvp</code>.</li>
<li><code>os_timersub(tvp, uvp, vvp)</code> -- Subtract <code>uvp</code> from <code>tvp</code> and store result in <code>vvp</code>.</li>
</ul>
<h2 id="special-notes">Special Notes</h2>
<p>Its important to understand how quickly the time wraps especially when doing time comparison using the macros above (or by any other means). </p>
<p>For example, if a tick is 1 millisecond and <code>os_time_t</code> is 32-bits the OS time will wrap back to zero in about 49.7 days or stated another way, the OS time epoch is 49.7 days.</p>
<p>If two times are more than 1/2 the OS time epoch apart, any time comparison will be incorrect. Ensure at design time that comparisons will not occur between times that are more than half the OS time epoch.</p>
<div class="row">
<ul class="nav nav-pills" style="margin-bottom: 10px">
<li>
</li>
<li class="pull-right">
</li>
</ul>
</div>
<footer class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt (incubating) is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<a href="https://www.apache.org/">
<img src="/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
</a>
<p>
Copyright © 2015-2021 The Apache Software Foundation.<br>
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt
project logo are either registered trademarks or trademarks of the Apache
Software Foundation in the United States and other countries.
</small>
</p>
<a href="">
<img src="https://www.countit.com/images/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
<a href="https://www.apache.org/licenses/">
<button class="button-footer-asf">
License
</button>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html">
<button class="button-footer-asf">
Sponsorship
</button>
</a>
<a href="https://www.apache.org/foundation/thanks.html">
<button class="button-footer-asf">
Thanks
</button>
</a>
<a href="https://www.apache.org/security/">
<button class="button-footer-asf">
Security
</button>
</a>
<a href="https://apache.org/events/current-event">
<button class="button-footer-asf">
ASF Events
</button>
</a>
</footer>
</div>
</div>
</div>
<script src="../../../../js/jquery-1.10.2.min.js"></script>
<script src="../../../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../../../js/highlight.pack.js"></script>
<script src="../../../../js/base.js"></script>
<script src="../../../../js/custom.js"></script>
<script src="search/main.js"></script>
</body>
</html>