blob: 6acb37298be3ec49f20f108ade247a42e165612b [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">
<title>How to Use Event Queues to Manage Multiple Events &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../genindex.html"/>
<link rel="search" title="Search" href="../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../index.html"/>
<link rel="up" title="OS Fundamentals" href="os_fundamentals.html"/>
<link rel="next" title="Tasks and Priority Management" href="tasks_lesson.html"/>
<link rel="prev" title="OS Fundamentals" href="os_fundamentals.html"/>
<script src="../../_static/js/modernizr.min.js"></script>
<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="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../_static/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>
<header>
<nav id="navbar" class="navbar navbar-inverse" 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>
<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>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../tutorials.html">Tutorials</a> /
<a href="os_fundamentals.html">OS Fundamentals</a> /
How to Use Event Queues to Manage Multiple Events
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-documentation/edit/master/docs/tutorials/os_fundamentals/event_queue.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</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" selected="selected" >
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" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../concepts.html">Concepts</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../tutorials.html">Tutorials</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../blinky/blinky.html">Project Blinky</a></li>
<li class="toctree-l2"><a class="reference internal" href="../repo/add_repos.html">Working with repositories</a></li>
<li class="toctree-l2"><a class="reference internal" href="../slinky/project-slinky.html">Project Slinky for Remote Comms</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ble/ble.html">Bluetooth Low Energy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../lora/lorawanapp.html">LoRa</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="os_fundamentals.html">OS Fundamentals</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">Events and Event Queues</a></li>
<li class="toctree-l3"><a class="reference internal" href="tasks_lesson.html">Task and Priority Management</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../devmgmt/devmgmt.html">Remote Device Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sensors/sensors.html">Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tooling/tooling.html">Tooling</a></li>
<li class="toctree-l2"><a class="reference internal" href="../other/other.html">Other</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../os/os_user_guide.html">OS User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="alert alert-warning">
<p>
Version 1.7.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>
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="how-to-use-event-queues-to-manage-multiple-events">
<h1>How to Use Event Queues to Manage Multiple Events<a class="headerlink" href="#how-to-use-event-queues-to-manage-multiple-events" title="Permalink to this headline">¶</a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#introduction" id="id1">Introduction</a></p></li>
<li><p><a class="reference internal" href="#prerequisites" id="id2">Prerequisites</a></p></li>
<li><p><a class="reference internal" href="#example-application" id="id3">Example Application</a></p>
<ul>
<li><p><a class="reference internal" href="#create-the-project" id="id4">Create the Project</a></p></li>
<li><p><a class="reference internal" href="#create-the-application" id="id5">Create the Application</a></p></li>
<li><p><a class="reference internal" href="#application-task-generated-events" id="id6">Application Task Generated Events</a></p></li>
<li><p><a class="reference internal" href="#os-callout-timer-events" id="id7">OS Callout Timer Events</a></p></li>
<li><p><a class="reference internal" href="#interrupt-events" id="id8">Interrupt Events</a></p></li>
<li><p><a class="reference internal" href="#putting-it-all-together" id="id9">Putting It All Together</a></p></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="introduction">
<h2><a class="toc-backref" href="#id1">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
<p>The event queue mechanism allows you to serialize incoming events for
your task. You can use it to get information about hardware interrupts,
callout expirations, and messages from other tasks.</p>
<p>The benefit of using events for inter-task communication is that it can
reduce the number of resources that need to be shared and locked.</p>
<p>The benefit of processing interrupts in a task context instead of the
interrupt context is that other interrupts and high priority tasks are
not blocked waiting for the interrupt handler to complete processing. A
task can also access other OS facilities and sleep.</p>
<p>This tutorial assumes that you have read about <a class="reference internal" href="../../os/core_os/event_queue/event_queue.html"><span class="doc">Event Queues</span></a>, the <a class="reference internal" href="../../os/modules/hal/hal.html"><span class="doc">Hardware Abstraction Layer</span></a>, and <a class="reference internal" href="../../os/core_os/callout/callout.html"><span class="doc">OS Callouts</span></a> in the OS User’s Guide.</p>
<p>This tutorial shows you how to create an application that uses events
for:</p>
<ul class="simple">
<li><p>Inter-task communication</p></li>
<li><p>OS callouts for timer expiration</p></li>
<li><p>GPIO interrupts</p></li>
</ul>
<p>It also shows you how to:</p>
<ul class="simple">
<li><p>Use the Mynewt default event queue and application main task to
process your events.</p></li>
<li><p>Create a dedicated event queue and task for your events.</p></li>
</ul>
<p>To reduce an application’s memory requirement, we recommend that you use
the Mynewt default event queue if your application or package does not
have real-time timing requirements.</p>
</div>
<div class="section" id="prerequisites">
<h2><a class="toc-backref" href="#id2">Prerequisites</a><a class="headerlink" href="#prerequisites" title="Permalink to this headline">¶</a></h2>
<p>Ensure that you have met the following prerequisites before continuing
with this tutorial:</p>
<ul class="simple">
<li><p>Install the newt tool.</p></li>
<li><p>Install the newtmgr tool.</p></li>
<li><p>Have Internet connectivity to fetch remote Mynewt components.</p></li>
<li><p>Install the compiler tools to support native compiling to build the
project this tutorial creates.</p></li>
<li><p>Have a cable to establish a serial USB connection between the board
and the laptop.</p></li>
</ul>
</div>
<div class="section" id="example-application">
<h2><a class="toc-backref" href="#id3">Example Application</a><a class="headerlink" href="#example-application" title="Permalink to this headline">¶</a></h2>
<p>In this example, you will write an application, for the Nordic nRF52
board, that uses events from three input sources to toggle three GPIO
outputs and light up the LEDs. If you are using a different board, you
will need to adjust the GPIO pin numbers in the code example.</p>
<p>The application handles events from three sources on two event queues:</p>
<ul class="simple">
<li><p>Events generated by an application task at periodic intervals are
added to the Mynewt default event queue.</p></li>
<li><p>OS callouts for timer events are added to the
<code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code> event queue.</p></li>
<li><p>GPIO interrupt events are added to the <code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code>
event queue.</p></li>
</ul>
<div class="section" id="create-the-project">
<h3><a class="toc-backref" href="#id4">Create the Project</a><a class="headerlink" href="#create-the-project" title="Permalink to this headline">¶</a></h3>
<p>Follow the instructions in the <span class="xref std std-doc">nRF52 tutorial for Blinky</span> to create a project.</p>
</div>
<div class="section" id="create-the-application">
<h3><a class="toc-backref" href="#id5">Create the Application</a><a class="headerlink" href="#create-the-application" title="Permalink to this headline">¶</a></h3>
<p>Create the <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code> file for the application:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">pkg.name: apps/eventq_example</span>
<span class="go">pkg.type: app</span>
<span class="go">pkg.deps:</span>
<span class="go"> - kernel/os</span>
<span class="go"> - hw/hal</span>
<span class="go"> - sys/console/stub</span>
</pre></div>
</div>
</div>
<div class="section" id="application-task-generated-events">
<h3><a class="toc-backref" href="#id6">Application Task Generated Events</a><a class="headerlink" href="#application-task-generated-events" title="Permalink to this headline">¶</a></h3>
<p>The application creates a task that generates events, at periodic
intervals, to toggle the LED at pin <code class="docutils literal notranslate"><span class="pre">TASK_LED</span></code>. The event is queued on
the Mynewt default event queue and is processed in the context of the
application main task.</p>
<p>Declare and initialize the <code class="docutils literal notranslate"><span class="pre">gen_task_ev</span></code> event with the <code class="docutils literal notranslate"><span class="pre">my_ev_cb()</span></code>
callback function to process the event:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* Callback function for application task event */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="p">);</span>
<span class="cm">/* Initialize the event with the callback function */</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="n">gen_task_ev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ev_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">my_ev_cb</span><span class="p">,</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Implement the <code class="docutils literal notranslate"><span class="pre">my_ev_cb()</span></code> callback function to process a task
generated event and toggle the LED at pin <code class="docutils literal notranslate"><span class="pre">TASK_LED</span></code>:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* LED 1 (P0.17 on the board) */</span>
<span class="cp">#define TASK_LED 17</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for events generated by gen_task. It toggles</span>
<span class="cm"> * the LED at pin TASK_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">TASK_LED</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Create a task that generates an event at periodic intervals and adds,
using the <code class="docutils literal notranslate"><span class="pre">os_eventq_put()</span></code> function, the event to the Mynewt default
event queue:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#define GEN_TASK_PRIO 3</span>
<span class="cp">#define GEN_TASK_STACK_SZ 512</span>
<span class="k">static</span><span class="w"> </span><span class="n">os_stack_t</span><span class="w"> </span><span class="n">gen_task_stack</span><span class="p">[</span><span class="n">GEN_TASK_STACK_SZ</span><span class="p">];</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_task</span><span class="w"> </span><span class="n">gen_task_str</span><span class="p">;</span>
<span class="cm">/*</span>
<span class="cm"> * Task handler to generate an event to toggle the LED at pin TASK_LED.</span>
<span class="cm"> * The event is added to the Mynewt default event queue.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">gen_task</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_time_delay</span><span class="p">(</span><span class="n">OS_TICKS_PER_SEC</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">4</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_eventq_put</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">(),</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gen_task_ev</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">init_tasks</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Create a task to generate events to toggle the LED at pin TASK_LED */</span>
<span class="w"> </span><span class="n">os_task_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">gen_task_str</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;gen_task&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">gen_task</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">GEN_TASK_PRIO</span><span class="p">,</span>
<span class="w"> </span><span class="n">OS_WAIT_FOREVER</span><span class="p">,</span><span class="w"> </span><span class="n">gen_task_stack</span><span class="p">,</span><span class="w"> </span><span class="n">GEN_TASK_STACK_SZ</span><span class="p">);</span>
<span class="w"> </span><span class="p">...</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Implement the application <code class="docutils literal notranslate"><span class="pre">main()</span></code> function to call the
<code class="docutils literal notranslate"><span class="pre">os_eventq_run()</span></code> function to dequeue an event from the Mynewt default
event queue and call the callback function to process the event.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">sysinit</span><span class="p">();</span>
<span class="w"> </span><span class="n">init_tasks</span><span class="p">();</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="os-callout-timer-events">
<h3><a class="toc-backref" href="#id7">OS Callout Timer Events</a><a class="headerlink" href="#os-callout-timer-events" title="Permalink to this headline">¶</a></h3>
<p>Set up OS callout timer events. For this example, we use a dedicated
event queue for timer events to show you how to create a dedicated event
queue and a task to process the events.</p>
<p>Implement the <code class="docutils literal notranslate"><span class="pre">my_timer_ev_cb()</span></code> callback function to process a timer
event and toggle the LED at pin <code class="docutils literal notranslate"><span class="pre">CALLOUT_LED</span></code>:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* LED 2 (P0.18 on the board) */</span>
<span class="cp">#define CALLOUT_LED 18</span>
<span class="cm">/* The timer callout */</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_callout</span><span class="w"> </span><span class="n">my_callout</span><span class="p">;</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for timer events. It toggles the LED at pin CALLOUT_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_timer_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">CALLOUT_LED</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TICKS_PER_SEC</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>In the <code class="docutils literal notranslate"><span class="pre">init_tasks()</span></code> function, initialize the
<code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code> event queue, create a task to process
events from the queue, and initialize the OS callout for the timer:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#define MY_TIMER_INTERRUPT_TASK_PRIO 4</span>
<span class="cp">#define MY_TIMER_INTERRUPT_TASK_STACK_SZ 512</span>
<span class="k">static</span><span class="w"> </span><span class="n">os_stack_t</span><span class="w"> </span><span class="n">my_timer_interrupt_task_stack</span><span class="p">[</span><span class="n">MY_TIMER_INTERRUPT_TASK_STACK_SZ</span><span class="p">];</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_task</span><span class="w"> </span><span class="n">my_timer_interrupt_task_str</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">init_tasks</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Use a dedicate event queue for timer and interrupt events */</span>
<span class="w"> </span><span class="n">os_eventq_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Create the task to process timer and interrupt events from the</span>
<span class="cm"> * my_timer_interrupt_eventq event queue.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">os_task_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_task_str</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;timer_interrupt_task&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_interrupt_task</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span>
<span class="w"> </span><span class="n">MY_TIMER_INTERRUPT_TASK_PRIO</span><span class="p">,</span><span class="w"> </span><span class="n">OS_WAIT_FOREVER</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_interrupt_task_stack</span><span class="p">,</span>
<span class="w"> </span><span class="n">MY_TIMER_INTERRUPT_TASK_STACK_SZ</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Initialize the callout for a timer event.</span>
<span class="cm"> * The my_timer_ev_cb callback function processes the timer events.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">os_callout_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_ev_cb</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TICKS_PER_SEC</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Implement the <code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_task()</span></code> task handler to dispatch
events from the <code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code> event queue:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">my_timer_interrupt_task</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="interrupt-events">
<h3><a class="toc-backref" href="#id8">Interrupt Events</a><a class="headerlink" href="#interrupt-events" title="Permalink to this headline">¶</a></h3>
<p>The application toggles the LED each time button 1 on the board is
pressed. The interrupt handler generates an event when the GPIO for
button 1 (P0.13) changes state. The events are added to the
<code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code> event queue, the same queue as the timer
events.</p>
<p>Declare and initialize the <code class="docutils literal notranslate"><span class="pre">gpio_ev</span></code> event with the
<code class="docutils literal notranslate"><span class="pre">my_interrupt_ev_cb()</span></code> callback function to process the event:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="n">gpio_ev</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ev_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">my_interrupt_ev_cb</span><span class="p">,</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Implement the <code class="docutils literal notranslate"><span class="pre">my_interrupt_ev_cb()</span></code> callback function to process an
interrupt event and toggle the LED at pin <code class="docutils literal notranslate"><span class="pre">GPIO_LED</span></code>:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* LED 3 (P0.19 on the board) */</span>
<span class="cp">#define GPIO_LED 19</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for interrupt events. It toggles the LED at pin GPIO_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_interrupt_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">GPIO_LED</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Implement the <code class="docutils literal notranslate"><span class="pre">my_gpio_irq()</span></code> handler to post an interrupt event to
the <code class="docutils literal notranslate"><span class="pre">my_timer_interrupt_eventq</span></code> event queue:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">my_gpio_irq</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_put</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gpio_ev</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>In the <code class="docutils literal notranslate"><span class="pre">init_tasks()</span></code> function, add the code to set up and enable the
GPIO input pin for the button and initialize the GPIO output pins for
the LEDs:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* LED 1 (P0.17 on the board) */</span>
<span class="cp">#define TASK_LED 17</span>
<span class="cm">/* 2 (P0.18 on the board) */</span>
<span class="cp">#define CALLOUT_LED 18</span>
<span class="cm">/* LED 3 (P0.19 on the board) */</span>
<span class="cp">#define GPIO_LED 19</span>
<span class="cm">/* Button 1 (P0.13 on the board) */</span>
<span class="cp">#define BUTTON1_PIN 13</span>
<span class="kt">void</span>
<span class="n">init_tasks</span><span class="p">()</span>
<span class="w"> </span><span class="cm">/* Initialize OS callout for timer events. */</span>
<span class="w"> </span><span class="p">....</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Initialize and enable interrupts for the pin for button 1 and</span>
<span class="cm"> * configure the button with pull up resistor on the nrf52dk.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">hal_gpio_irq_init</span><span class="p">(</span><span class="n">BUTTON1_PIN</span><span class="p">,</span><span class="w"> </span><span class="n">my_gpio_irq</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">HAL_GPIO_TRIG_RISING</span><span class="p">,</span><span class="w"> </span><span class="n">HAL_GPIO_PULL_UP</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_irq_enable</span><span class="p">(</span><span class="n">BUTTON1_PIN</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/* Initialize the GPIO output pins. Value 1 is off for these LEDs. */</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">TASK_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">CALLOUT_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">GPIO_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="putting-it-all-together">
<h3><a class="toc-backref" href="#id9">Putting It All Together</a><a class="headerlink" href="#putting-it-all-together" title="Permalink to this headline">¶</a></h3>
<p>Here is the complete <code class="docutils literal notranslate"><span class="pre">main.c</span></code> source for your application. Build the
application and load it on your board. The task LED (LED1) blinks at an
interval of 250ms, the callout LED (LED2) blinks at an interval of
500ms, and the GPIO LED (LED3) toggles on or off each time you press
Button 1.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;os/os.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;bsp/bsp.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;hal/hal_gpio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;assert.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sysinit/sysinit.h&gt;</span>
<span class="cp">#define MY_TIMER_INTERRUPT_TASK_PRIO 4</span>
<span class="cp">#define MY_TIMER_INTERRUPT_TASK_STACK_SZ 512</span>
<span class="cp">#define GEN_TASK_PRIO 3</span>
<span class="cp">#define GEN_TASK_STACK_SZ 512</span>
<span class="cm">/* LED 1 (P0.17 on the board) */</span>
<span class="cp">#define TASK_LED 17</span>
<span class="cm">/* LED 2 (P0.18 on the board) */</span>
<span class="cp">#define CALLOUT_LED 18</span>
<span class="cm">/* LED 3 (P0.19 on the board) */</span>
<span class="cp">#define GPIO_LED 19</span>
<span class="cm">/* Button 1 (P0.13 on the board) */</span>
<span class="cp">#define BUTTON1_PIN 13</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_timer_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_interrupt_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_eventq</span><span class="w"> </span><span class="n">my_timer_interrupt_eventq</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="n">os_stack_t</span><span class="w"> </span><span class="n">my_timer_interrupt_task_stack</span><span class="p">[</span><span class="n">MY_TIMER_INTERRUPT_TASK_STACK_SZ</span><span class="p">];</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_task</span><span class="w"> </span><span class="n">my_timer_interrupt_task_str</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="n">os_stack_t</span><span class="w"> </span><span class="n">gen_task_stack</span><span class="p">[</span><span class="n">GEN_TASK_STACK_SZ</span><span class="p">];</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_task</span><span class="w"> </span><span class="n">gen_task_str</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="n">gen_task_ev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ev_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">my_ev_cb</span><span class="p">,</span>
<span class="p">};</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="n">gpio_ev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ev_cb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">my_interrupt_ev_cb</span><span class="p">,</span>
<span class="p">};</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_callout</span><span class="w"> </span><span class="n">my_callout</span><span class="p">;</span>
<span class="cm">/*</span>
<span class="cm"> * Task handler to generate an event to toggle the LED at pin TASK_LED.</span>
<span class="cm"> * The event is added to the Mynewt default event queue.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">gen_task</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_time_delay</span><span class="p">(</span><span class="n">OS_TICKS_PER_SEC</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">4</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_eventq_put</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">(),</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gen_task_ev</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for events generated by gen_task. It toggles the LED at pin TASK_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">TASK_LED</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for timer events. It toggles the LED at pin CALLOUT_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_timer_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">CALLOUT_LED</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TICKS_PER_SEC</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
<span class="p">}</span>
<span class="cm">/*</span>
<span class="cm"> * Event callback function for interrupt events. It toggles the LED at pin GPIO_LED.</span>
<span class="cm"> */</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">my_interrupt_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_toggle</span><span class="p">(</span><span class="n">GPIO_LED</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">my_gpio_irq</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_put</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">gpio_ev</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">my_timer_interrupt_task</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span>
<span class="nf">init_tasks</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Create a task to generate events to toggle the LED at pin TASK_LED */</span>
<span class="w"> </span><span class="n">os_task_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">gen_task_str</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;gen_task&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">gen_task</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">GEN_TASK_PRIO</span><span class="p">,</span>
<span class="w"> </span><span class="n">OS_WAIT_FOREVER</span><span class="p">,</span><span class="w"> </span><span class="n">gen_task_stack</span><span class="p">,</span><span class="w"> </span><span class="n">GEN_TASK_STACK_SZ</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/* Use a dedicate event queue for timer and interrupt events */</span>
<span class="w"> </span><span class="n">os_eventq_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Create the task to process timer and interrupt events from the</span>
<span class="cm"> * my_timer_interrupt_eventq event queue.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">os_task_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_timer_interrupt_task_str</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;timer_interrupt_task&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_interrupt_task</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span>
<span class="w"> </span><span class="n">MY_TIMER_INTERRUPT_TASK_PRIO</span><span class="p">,</span><span class="w"> </span><span class="n">OS_WAIT_FOREVER</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_interrupt_task_stack</span><span class="p">,</span>
<span class="w"> </span><span class="n">MY_TIMER_INTERRUPT_TASK_STACK_SZ</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Initialize the callout for a timer event.</span>
<span class="cm"> * The my_timer_ev_cb callback function processes the timer event.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">os_callout_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">my_timer_interrupt_eventq</span><span class="p">,</span>
<span class="w"> </span><span class="n">my_timer_ev_cb</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_callout</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TICKS_PER_SEC</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Initialize and enable interrupt for the pin for button 1 and</span>
<span class="cm"> * configure the button with pull up resistor on the nrf52dk.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">hal_gpio_irq_init</span><span class="p">(</span><span class="n">BUTTON1_PIN</span><span class="p">,</span><span class="w"> </span><span class="n">my_gpio_irq</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">HAL_GPIO_TRIG_RISING</span><span class="p">,</span><span class="w"> </span><span class="n">HAL_GPIO_PULL_UP</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_irq_enable</span><span class="p">(</span><span class="n">BUTTON1_PIN</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">TASK_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">CALLOUT_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="w"> </span><span class="n">hal_gpio_init_out</span><span class="p">(</span><span class="n">GPIO_LED</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span>
<span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">sysinit</span><span class="p">();</span>
<span class="w"> </span><span class="n">init_tasks</span><span class="p">();</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="tasks_lesson.html" class="btn btn-neutral float-right" title="Tasks and Priority Management" accesskey="n">Next: Tasks and Priority Management <span class="fa fa-arrow-circle-right"></span></a>
<a href="os_fundamentals.html" class="btn btn-neutral" title="OS Fundamentals" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: OS Fundamentals</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<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>
<a href="">
<img src="../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../_static/js/main.js"></script>
</body>
</html>