blob: ef6f65b1ecf1eea64e8a69a7a5ad4fd02f809ce9 [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.11.0, Apache NimBLE 1.6.0 </a> released (September 7, 2023)
</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_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" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" selected="selected" >
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 class="active"><a href="./">OS Core</a>
<ul>
<li><a href="
../os_init/
">System-level Functions</a>
</li>
<li ><a href="../context_switch/context_switch/">Scheduler</a>
</li>
<li ><a href="../time/os_time/">Time</a>
</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/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/testutil/testutil/">Test Utilities</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/elua/elua/">Embedded Lua</a>
</li>
<li ><a href="../../modules/json/json/">JSON</a>
</li>
<li ><a href="../../modules/stats/stats/">Stats</a>
</li>
<li ><a href="../../modules/logs/logs/">Logs</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/how_to_edit_docs/
">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 Core</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 0.9.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="mynewt-core-os">Mynewt Core OS</h1>
<p>The Mynewt Core OS is a multitasking, preemptive real-time operating system combining a scheduler with typical RTOS features such as mutexes, semaphores, memory pools, etc. The Mynewt Core OS also provides a number of useful utilities such as a task watchdog, networking stack memory buffers and time management API. Each of these features is described in detail in its own section of the manual.</p>
<p>A multitasking, preemptive operating system is one in which a number of different tasks can be instantiated and assigned a priority, with higher priority tasks running before lower priority tasks. Furthermore, if a lower priority task is running and a higher priority task wants to run, the lower priority task is halted and the higher priority task is allowed to run. In other words, the lower priority task is preempted by the higher priority task.</p>
<h3 id="why-use-an-os">Why use an OS?</h3>
<p>You may ask yourself "why do I need a multitasking preemptive OS"? The answer may indeed be that you do not. Some applications are simple and only require a polling loop. Others are more complex and may require that certain jobs are executed in a timely manner or before other jobs are executed. If you have a simple polling loop, you cannot move on to service a job until the current job is done being serviced. With the Mynewt OS, the application developer need not worry about certain jobs taking too long or not executing in a timely fashion; the OS provides mechanisms to deal with these situations. Another benefit of using an OS is that it helps shield application developers from other application code being written; the developer does not have to worry (or has to worry less) about other application code behaving badly and causing undesirable behavior or preventing their code from executing properly. Other benefits of using an OS (and the Mynewt OS in particular) is that it also provides features that the developer would otherwise need to create on his/her own. </p>
<h3 id="core-os-features">Core OS Features</h3>
<p><Insert basic feature descriptions, how the various pieces fit together etc., what's special in Mynewt OS></p>
<ul>
<li><a href="../context_switch/context_switch/">Scheduler/context switching</a></li>
<li><a href="../time/os_time/">Time</a></li>
<li><a href="../task/task/">Tasks</a></li>
<li><a href="../event_queue/event_queue/">Event queues/callouts</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/">Mbufs</a></li>
<li><a href="../sanity/sanity/">Sanity</a></li>
<li><a href="../callout/callout/">Callouts</a></li>
<li><a href="../porting/port_os/">Porting OS to other platforms</a></li>
</ul>
<h3 id="basic-os-application-creation">Basic OS Application Creation</h3>
<p>Creating an application using the Mynewt Core OS is a relatively simple task: once you have installed the basic Newt Tool structure (build structure) for your application and created your BSP (Board Support Package), the developer initializes the OS by calling <code>os_init()</code>, performs application specific initializations, and then starts the os by calling <code>os_start()</code>. </p>
<p>The <code>os_init()</code> API performs two basic functions: calls architecture and bsp specific setup and initializes the idle task of the OS. This is required before the OS is started. The OS start API initializes the OS time tick interrupt and starts the highest priority task running (i.e starts the scheduler). Note that <code>os_start()</code> never returns; once called the device is either running in an application task context or in idle task context.</p>
<p>Initializing application modules and tasks can get somewhat complicated with RTOS's similar to Mynewt. Care must be taken that the API provided by a task are initialized prior to being called by another (higher priority) task. </p>
<p>For example, take a simple application with two tasks (tasks 1 and 2, with task 1 higher priority than task 2). Task 2 provides an API which has a semaphore lock and this semaphore is initialized by task 2 when the task handler for task 2 is called. Task 1 is expected to call this API.</p>
<p>Consider the sequence of events when the OS is started. The scheduler starts running and picks the highest priority task (task 1 in this case). The task handler function for task 1 is called and will keep running until it yields execution. Before yielding, code in the task 1 handler function calls the API provided by task 2. The semaphore being accessed in the task 2 API has yet to be initialized since the task 2 handler function has not had a chance to run! This will lead to undesirable behavior and will need to be addressed by the application developer. Note that the Mynewt OS does guard against internal API being called before the OS has started (they will return error) but it does not safeguard application defined objects from access prior to initialization.</p>
<h3 id="example">Example</h3>
<p>One way to avoid initialization issues like the one described above is to perform task initializations prior to starting the OS. The code example shown below illustrates this concept. The application initializes the OS, calls an application specific "task initialization" function, and then starts the OS. The application task initialization function is responsible for initializing all the data objects that each task exposes to the other tasks. The tasks themselves are also initialized at this time (by calling <code>os_task_init()</code>). </p>
<p>In the example, each task works in a ping-pong like fashion: task 1 wakes up, adds a token to semaphore 1 and then waits for a token from semaphore 2. Task 2 waits for a token on semaphore 1 and once it gets it, adds a token to semaphore 2. Notice that the semaphores are initialized by the application specific task initialization functions and not inside the task handler functions. If task 2 (being lower in priority than task 1) had called os_sem_init() for task2_sem inside task2_handler(), task 1 would have called os_sem_pend() using task2_sem before task2_sem was initialized.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>/* Task 1 handler function */
void
task1_handler(void *arg)
{
while (1) {
/* Release semaphore to task 2 */
os_sem_release(&amp;task1_sem);
/* Wait for semaphore from task 2 */
os_sem_pend(&amp;task2_sem, OS_TIMEOUT_NEVER);
}
}
/* Task 2 handler function */
void
task2_handler(void *arg)
{
struct os_task *t;
while (1) {
/* Wait for semaphore from task1 */
os_sem_pend(&amp;task1_sem, OS_TIMEOUT_NEVER);
/* Release task2 semaphore */
os_sem_release(&amp;task2_sem);
}
}
/* Initialize task 1 exposed data objects */
void
task1_init(void)
{
/* Initialize task1 semaphore */
os_sem_init(&amp;task1_sem, 0);
}
/* Initialize task 2 exposed data objects */
void
task2_init(void)
{
/* Initialize task1 semaphore */
os_sem_init(&amp;task2_sem, 0);
}
/**
* init_app_tasks
*
* Called by main.c after os_init(). This function performs initializations
* that are required before tasks are running.
*
* @return int 0 success; error otherwise.
*/
static int
init_app_tasks(void)
{
/*
* Initialize tasks 1 and 2. Note that the task handlers are not called yet; they will
* be called when the OS is started.
*/
os_task_init(&amp;task1, &quot;task1&quot;, task1_handler, NULL, TASK1_PRIO,
OS_WAIT_FOREVER, task1_stack, TASK1_STACK_SIZE);
os_task_init(&amp;task2, &quot;task2&quot;, task2_handler, NULL, TASK2_PRIO,
OS_WAIT_FOREVER, task2_stack, TASK2_STACK_SIZE);
/* Call task specific initialization functions. */
task1_init();
task2_init();
return 0;
}
/**
* main
*
* The main function for the application. This function initializes the os, calls
* the application specific task initialization function. then starts the
* OS. We should not return from os start!
*/
int
main(void)
{
int i;
int rc;
uint32_t seed;
/* Initialize OS */
os_init();
/* Initialize application specific tasks */
init_app_tasks();
/* Start the OS */
os_start();
/* os start should never return. If it does, this should be an error */
assert(0);
return rc;
}
</code></pre></div>
<h3 id="os-functions">OS Functions</h3>
<p>The functions available at the OS level are:</p>
<ul>
<li><a href="../os_init/">os_init</a></li>
<li><a href="../os_start/">os_start</a></li>
<li><a href="../os_started/">os_started</a></li>
</ul>
<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>