1 <!-- HTML header for doxygen 1.8.20-->
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml">
5 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
6 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
7 <meta name="generator" content="Doxygen 1.9.4"/>
8 <meta name="viewport" content="width=device-width, initial-scale=1"/>
9 <title>Raspberry Pi Pico SDK: hardware_sync</title>
10 <!-- <link href="tabs.css" rel="stylesheet" type="text/css"/> -->
11 <script type="text/javascript" src="jquery.js"></script>
12 <script type="text/javascript" src="dynsections.js"></script>
13 <link href="navtree.css" rel="stylesheet" type="text/css"/>
14 <script type="text/javascript" src="resize.js"></script>
15 <script type="text/javascript" src="navtreedata.js"></script>
16 <script type="text/javascript" src="navtree.js"></script>
17 <link href="search/search.css" rel="stylesheet" type="text/css"/>
18 <script type="text/javascript" src="search/searchdata.js"></script>
19 <script type="text/javascript" src="search/search.js"></script>
20 <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
21 <link href="doxygen.css" rel="stylesheet" type="text/css" />
22 <link href="normalise.css" rel="stylesheet" type="text/css"/>
23 <link href="main.css" rel="stylesheet" type="text/css"/>
24 <link href="styles.css" rel="stylesheet" type="text/css"/>
27 <div class="navigation-mobile">
28 <div class="logo--mobile">
29 <a href="/"><img src="logo-mobile.svg" alt="Raspberry Pi"></a>
31 <div class="navigation-toggle">
32 <span class="line-1"></span>
36 <span class="line-3"></span>
39 <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
41 <a href="index.html"> <img src="logo.svg" alt="Raspberry Pi"></a>
42 <span style="display: inline-block; margin-top: 10px;">
46 <div class="navigation-footer">
47 <img src="logo-mobile.svg" alt="Raspberry Pi">
48 <a href="https://www.raspberrypi.com/" target="_blank">By Raspberry Pi Ltd</a>
50 <!-- <div class="search">
52 <input type="search" name="search" id="search" placeholder="Search">
53 <input type="submit" value="Search">
56 <!-- Generated by Doxygen 1.9.4 -->
57 <script type="text/javascript">
58 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
59 var searchBox = new SearchBox("searchBox", "search",'Search','.html');
62 <script type="text/javascript" src="menudata.js"></script>
63 <script type="text/javascript" src="menu.js"></script>
64 <script type="text/javascript">
65 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
67 initMenu('',true,false,'search.php','Search');
68 $(document).ready(function() { init_search(); });
72 <div id="main-nav"></div>
74 <div id="side-nav" class="ui-resizable side-nav-resizable">
76 <div id="nav-tree-contents">
77 <div id="nav-sync" class="sync"></div>
80 <div id="splitbar" style="-moz-user-select:none;"
81 class="ui-resizable-handle">
84 <script type="text/javascript">
85 /* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
86 $(document).ready(function(){initNavTree('group__hardware__sync.html',''); initResizable(); });
89 <div id="doc-content">
90 <!-- window showing the filter options -->
91 <div id="MSearchSelectWindow"
92 onmouseover="return searchBox.OnSearchSelectShow()"
93 onmouseout="return searchBox.OnSearchSelectHide()"
94 onkeydown="return searchBox.OnSearchSelectKey(event)">
97 <!-- iframe showing the search results (closed by default) -->
98 <div id="MSearchResultsWindow">
99 <iframe src="javascript:void(0)" frameborder="0"
100 name="MSearchResults" id="MSearchResults">
105 <div class="summary">
106 <a href="#define-members">Macros</a> |
107 <a href="#func-members">Functions</a> </div>
108 <div class="headertitle"><div class="title">hardware_sync<div class="ingroups"><a class="el" href="group__hardware.html">Hardware APIs</a></div></div></div>
110 <div class="contents">
112 <p>Low level hardware spin locks, barrier and processor event APIs.
113 <a href="#details">More...</a></p>
114 <table class="memberdecls">
115 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
116 Macros</h2></td></tr>
117 <tr class="memitem:gae73045822d06a1733a5bbfbda7895998"><td class="memItemLeft" align="right" valign="top"><a id="gae73045822d06a1733a5bbfbda7895998" name="gae73045822d06a1733a5bbfbda7895998"></a>
118 #define </td><td class="memItemRight" valign="bottom"><b>SW_SPIN_LOCK_TYPE</b>   volatile uint8_t</td></tr>
119 <tr class="memdesc:gae73045822d06a1733a5bbfbda7895998"><td class="mdescLeft"> </td><td class="mdescRight">A spin lock identifier. <br /></td></tr>
120 <tr class="separator:gae73045822d06a1733a5bbfbda7895998"><td class="memSeparator" colspan="2"> </td></tr>
121 </table><table class="memberdecls">
122 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
123 Functions</h2></td></tr>
124 <tr class="memitem:ga9442d73d817ec600c67a632edf8c6668"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga9442d73d817ec600c67a632edf8c6668">__nop</a> (void)</td></tr>
125 <tr class="memdesc:ga9442d73d817ec600c67a632edf8c6668"><td class="mdescLeft"> </td><td class="mdescRight">Insert a NOP instruction in to the code path. <a href="group__hardware__sync.html#ga9442d73d817ec600c67a632edf8c6668">More...</a><br /></td></tr>
126 <tr class="separator:ga9442d73d817ec600c67a632edf8c6668"><td class="memSeparator" colspan="2"> </td></tr>
127 <tr class="memitem:ga486eada32246494118f8273a80ae6856"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga486eada32246494118f8273a80ae6856">__sev</a> (void)</td></tr>
128 <tr class="memdesc:ga486eada32246494118f8273a80ae6856"><td class="mdescLeft"> </td><td class="mdescRight">Insert a SEV instruction in to the code path. <a href="group__hardware__sync.html#ga486eada32246494118f8273a80ae6856">More...</a><br /></td></tr>
129 <tr class="separator:ga486eada32246494118f8273a80ae6856"><td class="memSeparator" colspan="2"> </td></tr>
130 <tr class="memitem:ga7799a0b9fc6444d463170266392f5fcd"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga7799a0b9fc6444d463170266392f5fcd">__wfe</a> (void)</td></tr>
131 <tr class="memdesc:ga7799a0b9fc6444d463170266392f5fcd"><td class="mdescLeft"> </td><td class="mdescRight">Insert a WFE instruction in to the code path. <a href="group__hardware__sync.html#ga7799a0b9fc6444d463170266392f5fcd">More...</a><br /></td></tr>
132 <tr class="separator:ga7799a0b9fc6444d463170266392f5fcd"><td class="memSeparator" colspan="2"> </td></tr>
133 <tr class="memitem:gaaf83973c85c4d0987d34f31ff9590ec5"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gaaf83973c85c4d0987d34f31ff9590ec5">__wfi</a> (void)</td></tr>
134 <tr class="memdesc:gaaf83973c85c4d0987d34f31ff9590ec5"><td class="mdescLeft"> </td><td class="mdescRight">Insert a WFI instruction in to the code path. <a href="group__hardware__sync.html#gaaf83973c85c4d0987d34f31ff9590ec5">More...</a><br /></td></tr>
135 <tr class="separator:gaaf83973c85c4d0987d34f31ff9590ec5"><td class="memSeparator" colspan="2"> </td></tr>
136 <tr class="memitem:ga577b1aba04c5e961c151c2b5d116618d"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga577b1aba04c5e961c151c2b5d116618d">__dmb</a> (void)</td></tr>
137 <tr class="memdesc:ga577b1aba04c5e961c151c2b5d116618d"><td class="mdescLeft"> </td><td class="mdescRight">Insert a DMB instruction in to the code path. <a href="group__hardware__sync.html#ga577b1aba04c5e961c151c2b5d116618d">More...</a><br /></td></tr>
138 <tr class="separator:ga577b1aba04c5e961c151c2b5d116618d"><td class="memSeparator" colspan="2"> </td></tr>
139 <tr class="memitem:gaf9544395481cc10fe75df2e8fe58d52a"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gaf9544395481cc10fe75df2e8fe58d52a">__dsb</a> (void)</td></tr>
140 <tr class="memdesc:gaf9544395481cc10fe75df2e8fe58d52a"><td class="mdescLeft"> </td><td class="mdescRight">Insert a DSB instruction in to the code path. <a href="group__hardware__sync.html#gaf9544395481cc10fe75df2e8fe58d52a">More...</a><br /></td></tr>
141 <tr class="separator:gaf9544395481cc10fe75df2e8fe58d52a"><td class="memSeparator" colspan="2"> </td></tr>
142 <tr class="memitem:gae516e592b0d308fe5b032e34109b0057"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gae516e592b0d308fe5b032e34109b0057">__isb</a> (void)</td></tr>
143 <tr class="memdesc:gae516e592b0d308fe5b032e34109b0057"><td class="mdescLeft"> </td><td class="mdescRight">Insert a ISB instruction in to the code path. <a href="group__hardware__sync.html#gae516e592b0d308fe5b032e34109b0057">More...</a><br /></td></tr>
144 <tr class="separator:gae516e592b0d308fe5b032e34109b0057"><td class="memSeparator" colspan="2"> </td></tr>
145 <tr class="memitem:gaac3457fdba1624e5f45e7f936ad68049"><td class="memItemLeft" align="right" valign="top"><a id="gaac3457fdba1624e5f45e7f936ad68049" name="gaac3457fdba1624e5f45e7f936ad68049"></a>
146 static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><b>__mem_fence_acquire</b> (void)</td></tr>
147 <tr class="memdesc:gaac3457fdba1624e5f45e7f936ad68049"><td class="mdescLeft"> </td><td class="mdescRight">Acquire a memory fence. <br /></td></tr>
148 <tr class="separator:gaac3457fdba1624e5f45e7f936ad68049"><td class="memSeparator" colspan="2"> </td></tr>
149 <tr class="memitem:ga1a9f3cba87fe49a3907a1535b9adfa3f"><td class="memItemLeft" align="right" valign="top"><a id="ga1a9f3cba87fe49a3907a1535b9adfa3f" name="ga1a9f3cba87fe49a3907a1535b9adfa3f"></a>
150 static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><b>__mem_fence_release</b> (void)</td></tr>
151 <tr class="memdesc:ga1a9f3cba87fe49a3907a1535b9adfa3f"><td class="mdescLeft"> </td><td class="mdescRight">Release a memory fence. <br /></td></tr>
152 <tr class="separator:ga1a9f3cba87fe49a3907a1535b9adfa3f"><td class="memSeparator" colspan="2"> </td></tr>
153 <tr class="memitem:ga15ada9cfb92615e5bb05a29aa3fc7ad8"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga15ada9cfb92615e5bb05a29aa3fc7ad8">save_and_disable_interrupts</a> (void)</td></tr>
154 <tr class="memdesc:ga15ada9cfb92615e5bb05a29aa3fc7ad8"><td class="mdescLeft"> </td><td class="mdescRight">Save and disable interrupts. <a href="group__hardware__sync.html#ga15ada9cfb92615e5bb05a29aa3fc7ad8">More...</a><br /></td></tr>
155 <tr class="separator:ga15ada9cfb92615e5bb05a29aa3fc7ad8"><td class="memSeparator" colspan="2"> </td></tr>
156 <tr class="memitem:ga863cdac424a18c8ebfcc62107a4c2ad2"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga863cdac424a18c8ebfcc62107a4c2ad2">restore_interrupts</a> (uint32_t status)</td></tr>
157 <tr class="memdesc:ga863cdac424a18c8ebfcc62107a4c2ad2"><td class="mdescLeft"> </td><td class="mdescRight">Restore interrupts to a specified state. <a href="group__hardware__sync.html#ga863cdac424a18c8ebfcc62107a4c2ad2">More...</a><br /></td></tr>
158 <tr class="separator:ga863cdac424a18c8ebfcc62107a4c2ad2"><td class="memSeparator" colspan="2"> </td></tr>
159 <tr class="memitem:ga4bb69d1717ab90105ea05b82291fc0c7"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga4bb69d1717ab90105ea05b82291fc0c7">restore_interrupts_from_disabled</a> (uint32_t status)</td></tr>
160 <tr class="memdesc:ga4bb69d1717ab90105ea05b82291fc0c7"><td class="mdescLeft"> </td><td class="mdescRight">Restore interrupts to a specified state with restricted transitions. <a href="group__hardware__sync.html#ga4bb69d1717ab90105ea05b82291fc0c7">More...</a><br /></td></tr>
161 <tr class="separator:ga4bb69d1717ab90105ea05b82291fc0c7"><td class="memSeparator" colspan="2"> </td></tr>
162 <tr class="memitem:ga8f4578aa492d4d37dfbdab5c99ab5b1c"><td class="memItemLeft" align="right" valign="top">uint </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga8f4578aa492d4d37dfbdab5c99ab5b1c">next_striped_spin_lock_num</a> (void)</td></tr>
163 <tr class="memdesc:ga8f4578aa492d4d37dfbdab5c99ab5b1c"><td class="mdescLeft"> </td><td class="mdescRight">Return a spin lock number from the <em>striped</em> range. <a href="group__hardware__sync.html#ga8f4578aa492d4d37dfbdab5c99ab5b1c">More...</a><br /></td></tr>
164 <tr class="separator:ga8f4578aa492d4d37dfbdab5c99ab5b1c"><td class="memSeparator" colspan="2"> </td></tr>
165 <tr class="memitem:ga50945cb4c33c3263b69e1fce81c474c7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga50945cb4c33c3263b69e1fce81c474c7">spin_lock_claim</a> (uint lock_num)</td></tr>
166 <tr class="memdesc:ga50945cb4c33c3263b69e1fce81c474c7"><td class="mdescLeft"> </td><td class="mdescRight">Mark a spin lock as used. <a href="group__hardware__sync.html#ga50945cb4c33c3263b69e1fce81c474c7">More...</a><br /></td></tr>
167 <tr class="separator:ga50945cb4c33c3263b69e1fce81c474c7"><td class="memSeparator" colspan="2"> </td></tr>
168 <tr class="memitem:ga41304e0ee0aed1b5c20b0fd8c2adf9e6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga41304e0ee0aed1b5c20b0fd8c2adf9e6">spin_lock_claim_mask</a> (uint32_t lock_num_mask)</td></tr>
169 <tr class="memdesc:ga41304e0ee0aed1b5c20b0fd8c2adf9e6"><td class="mdescLeft"> </td><td class="mdescRight">Mark multiple spin locks as used. <a href="group__hardware__sync.html#ga41304e0ee0aed1b5c20b0fd8c2adf9e6">More...</a><br /></td></tr>
170 <tr class="separator:ga41304e0ee0aed1b5c20b0fd8c2adf9e6"><td class="memSeparator" colspan="2"> </td></tr>
171 <tr class="memitem:ga177efc085451e4eabfc726897a59ca57"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga177efc085451e4eabfc726897a59ca57">spin_lock_unclaim</a> (uint lock_num)</td></tr>
172 <tr class="memdesc:ga177efc085451e4eabfc726897a59ca57"><td class="mdescLeft"> </td><td class="mdescRight">Mark a spin lock as no longer used. <a href="group__hardware__sync.html#ga177efc085451e4eabfc726897a59ca57">More...</a><br /></td></tr>
173 <tr class="separator:ga177efc085451e4eabfc726897a59ca57"><td class="memSeparator" colspan="2"> </td></tr>
174 <tr class="memitem:ga157bccb525bdfd90255490558cbeb9c0"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga157bccb525bdfd90255490558cbeb9c0">spin_lock_claim_unused</a> (bool required)</td></tr>
175 <tr class="memdesc:ga157bccb525bdfd90255490558cbeb9c0"><td class="mdescLeft"> </td><td class="mdescRight">Claim a free spin lock. <a href="group__hardware__sync.html#ga157bccb525bdfd90255490558cbeb9c0">More...</a><br /></td></tr>
176 <tr class="separator:ga157bccb525bdfd90255490558cbeb9c0"><td class="memSeparator" colspan="2"> </td></tr>
177 <tr class="memitem:ga9c66da8cbd0916461d6de2af4340ec4f"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga9c66da8cbd0916461d6de2af4340ec4f">spin_lock_is_claimed</a> (uint lock_num)</td></tr>
178 <tr class="memdesc:ga9c66da8cbd0916461d6de2af4340ec4f"><td class="mdescLeft"> </td><td class="mdescRight">Determine if a spin lock is claimed. <a href="group__hardware__sync.html#ga9c66da8cbd0916461d6de2af4340ec4f">More...</a><br /></td></tr>
179 <tr class="separator:ga9c66da8cbd0916461d6de2af4340ec4f"><td class="memSeparator" colspan="2"> </td></tr>
180 <tr class="memitem:ga87b2474d96a8de8cdc6e083680a05bb9"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> spin_lock_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga87b2474d96a8de8cdc6e083680a05bb9">spin_lock_instance</a> (uint lock_num)</td></tr>
181 <tr class="memdesc:ga87b2474d96a8de8cdc6e083680a05bb9"><td class="mdescLeft"> </td><td class="mdescRight">Get HW Spinlock instance from number. <a href="group__hardware__sync.html#ga87b2474d96a8de8cdc6e083680a05bb9">More...</a><br /></td></tr>
182 <tr class="separator:ga87b2474d96a8de8cdc6e083680a05bb9"><td class="memSeparator" colspan="2"> </td></tr>
183 <tr class="memitem:gad86f015d3ed475401bf83d9a0e449ab1"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gad86f015d3ed475401bf83d9a0e449ab1">spin_lock_get_num</a> (spin_lock_t *lock)</td></tr>
184 <tr class="memdesc:gad86f015d3ed475401bf83d9a0e449ab1"><td class="mdescLeft"> </td><td class="mdescRight">Get HW Spinlock number from instance. <a href="group__hardware__sync.html#gad86f015d3ed475401bf83d9a0e449ab1">More...</a><br /></td></tr>
185 <tr class="separator:gad86f015d3ed475401bf83d9a0e449ab1"><td class="memSeparator" colspan="2"> </td></tr>
186 <tr class="memitem:gac4c9286f66d9dbe5287904d481f3b1e3"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gac4c9286f66d9dbe5287904d481f3b1e3">spin_lock_unsafe_blocking</a> (spin_lock_t *lock)</td></tr>
187 <tr class="memdesc:gac4c9286f66d9dbe5287904d481f3b1e3"><td class="mdescLeft"> </td><td class="mdescRight">Acquire a spin lock without disabling interrupts (hence unsafe) <a href="group__hardware__sync.html#gac4c9286f66d9dbe5287904d481f3b1e3">More...</a><br /></td></tr>
188 <tr class="separator:gac4c9286f66d9dbe5287904d481f3b1e3"><td class="memSeparator" colspan="2"> </td></tr>
189 <tr class="memitem:ga1cc04df1f5717292b279eb197ff5b4af"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga1cc04df1f5717292b279eb197ff5b4af">spin_unlock_unsafe</a> (spin_lock_t *lock)</td></tr>
190 <tr class="memdesc:ga1cc04df1f5717292b279eb197ff5b4af"><td class="mdescLeft"> </td><td class="mdescRight">Release a spin lock without re-enabling interrupts. <a href="group__hardware__sync.html#ga1cc04df1f5717292b279eb197ff5b4af">More...</a><br /></td></tr>
191 <tr class="separator:ga1cc04df1f5717292b279eb197ff5b4af"><td class="memSeparator" colspan="2"> </td></tr>
192 <tr class="memitem:ga091e88a7608ed8dbf3e1e984bae54602"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602">spin_lock_blocking</a> (spin_lock_t *lock)</td></tr>
193 <tr class="memdesc:ga091e88a7608ed8dbf3e1e984bae54602"><td class="mdescLeft"> </td><td class="mdescRight">Acquire a spin lock safely. <a href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602">More...</a><br /></td></tr>
194 <tr class="separator:ga091e88a7608ed8dbf3e1e984bae54602"><td class="memSeparator" colspan="2"> </td></tr>
195 <tr class="memitem:gada2be3ad9fabcda77e8bec99e12333fd"><td class="memItemLeft" align="right" valign="top">static bool </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gada2be3ad9fabcda77e8bec99e12333fd">is_spin_locked</a> (spin_lock_t *lock)</td></tr>
196 <tr class="memdesc:gada2be3ad9fabcda77e8bec99e12333fd"><td class="mdescLeft"> </td><td class="mdescRight">Check to see if a spinlock is currently acquired elsewhere. <a href="group__hardware__sync.html#gada2be3ad9fabcda77e8bec99e12333fd">More...</a><br /></td></tr>
197 <tr class="separator:gada2be3ad9fabcda77e8bec99e12333fd"><td class="memSeparator" colspan="2"> </td></tr>
198 <tr class="memitem:ga281ce69786da23cab7ba6c42537d4e87"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#ga281ce69786da23cab7ba6c42537d4e87">spin_unlock</a> (spin_lock_t *lock, uint32_t saved_irq)</td></tr>
199 <tr class="memdesc:ga281ce69786da23cab7ba6c42537d4e87"><td class="mdescLeft"> </td><td class="mdescRight">Release a spin lock safely. <a href="group__hardware__sync.html#ga281ce69786da23cab7ba6c42537d4e87">More...</a><br /></td></tr>
200 <tr class="separator:ga281ce69786da23cab7ba6c42537d4e87"><td class="memSeparator" colspan="2"> </td></tr>
201 <tr class="memitem:gad38821cab3d935b009c6551d5ff70c4c"><td class="memItemLeft" align="right" valign="top">spin_lock_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__hardware__sync.html#gad38821cab3d935b009c6551d5ff70c4c">spin_lock_init</a> (uint lock_num)</td></tr>
202 <tr class="memdesc:gad38821cab3d935b009c6551d5ff70c4c"><td class="mdescLeft"> </td><td class="mdescRight">Initialise a spin lock. <a href="group__hardware__sync.html#gad38821cab3d935b009c6551d5ff70c4c">More...</a><br /></td></tr>
203 <tr class="separator:gad38821cab3d935b009c6551d5ff70c4c"><td class="memSeparator" colspan="2"> </td></tr>
204 <tr class="memitem:ga667a78000c57bdfb3585cbc56fccbe0b"><td class="memItemLeft" align="right" valign="top"><a id="ga667a78000c57bdfb3585cbc56fccbe0b" name="ga667a78000c57bdfb3585cbc56fccbe0b"></a>
205 void </td><td class="memItemRight" valign="bottom"><b>spin_locks_reset</b> (void)</td></tr>
206 <tr class="memdesc:ga667a78000c57bdfb3585cbc56fccbe0b"><td class="mdescLeft"> </td><td class="mdescRight">Release all spin locks. <br /></td></tr>
207 <tr class="separator:ga667a78000c57bdfb3585cbc56fccbe0b"><td class="memSeparator" colspan="2"> </td></tr>
209 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
210 <p >Low level hardware spin locks, barrier and processor event APIs. </p>
211 <h2><a class="anchor" id="autotoc_md1"></a>
213 <p >The RP-series microcontrollers provide 32 hardware spin locks, which can be used to manage mutually-exclusive access to shared software and hardware resources.</p>
214 <p >Generally each spin lock itself is a shared resource, i.e. the same hardware spin lock can be used by multiple higher level primitives (as long as the spin locks are neither held for long periods, nor held concurrently with other spin locks by the same core - which could lead to deadlock). A hardware spin lock that is exclusively owned can be used individually without more flexibility and without regard to other software. Note that no hardware spin lock may be acquired re-entrantly (i.e. hardware spin locks are not on their own safe for use by both thread code and IRQs) however the default spinlock related methods here (e.g. <a class="el" href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602">spin_lock_blocking</a>) always disable interrupts while the lock is held as use by IRQ handlers and user code is common/desirable, and spin locks are only expected to be held for brief periods.</p>
215 <p >RP2350 Warning. Due to erratum RP2350-E2, writes to new SIO registers above an offset of +0x180 alias the spinlocks, causing spurious lock releases. This SDK by default uses atomic memory accesses to implement the hardware_sync_spin_lock API, as a workaround on RP2350 A2. </p>
216 <p >The SDK uses the following default spin lock assignments, classifying which spin locks are reserved for exclusive/special purposes vs those suitable for more general shared use:</p>
217 <table class="markdownTable">
218 <tr class="markdownTableHead">
219 <th class="markdownTableHeadCenter">Number (ID) </th><th class="markdownTableHeadNone">Description </th></tr>
220 <tr class="markdownTableRowOdd">
221 <td class="markdownTableBodyCenter">0-13 </td><td class="markdownTableBodyNone">Currently reserved for exclusive use by the SDK and other libraries. If you use these spin locks, you risk breaking SDK or other library functionality. Each reserved spin lock used individually has its own PICO_SPINLOCK_ID so you can search for those. </td></tr>
222 <tr class="markdownTableRowEven">
223 <td class="markdownTableBodyCenter">14,15 </td><td class="markdownTableBodyNone">(PICO_SPINLOCK_ID_OS1 and PICO_SPINLOCK_ID_OS2). Currently reserved for exclusive use by an operating system (or other system level software) co-existing with the SDK. </td></tr>
224 <tr class="markdownTableRowOdd">
225 <td class="markdownTableBodyCenter">16-23 </td><td class="markdownTableBodyNone">(PICO_SPINLOCK_ID_STRIPED_FIRST - PICO_SPINLOCK_ID_STRIPED_LAST). Spin locks from this range are assigned in a round-robin fashion via <a class="el" href="group__hardware__sync.html#ga8f4578aa492d4d37dfbdab5c99ab5b1c">next_striped_spin_lock_num()</a>. These spin locks are shared, but assigning numbers from a range reduces the probability that two higher level locking primitives using <em>striped</em> spin locks will actually be using the same spin lock. </td></tr>
226 <tr class="markdownTableRowEven">
227 <td class="markdownTableBodyCenter">24-31 </td><td class="markdownTableBodyNone">(PICO_SPINLOCK_ID_CLAIM_FREE_FIRST - PICO_SPINLOCK_ID_CLAIM_FREE_LAST). These are reserved for exclusive use and are allocated on a first come first served basis at runtime via <a class="el" href="group__hardware__sync.html#ga157bccb525bdfd90255490558cbeb9c0">spin_lock_claim_unused()</a> </td></tr>
229 <h2 class="groupheader">Function Documentation</h2>
230 <a id="ga577b1aba04c5e961c151c2b5d116618d" name="ga577b1aba04c5e961c151c2b5d116618d"></a>
231 <h2 class="memtitle"><span class="permalink"><a href="#ga577b1aba04c5e961c151c2b5d116618d">◆ </a></span>__dmb()</h2>
233 <div class="memitem">
234 <div class="memproto">
235 <table class="mlabels">
237 <td class="mlabels-left">
238 <table class="memname">
240 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __dmb </td>
242 <td class="paramtype">void </td>
243 <td class="paramname"></td><td>)</td>
248 <td class="mlabels-right">
249 <span class="mlabels"><span class="mlabel">static</span></span> </td>
252 </div><div class="memdoc">
254 <p>Insert a DMB instruction in to the code path. </p>
255 <p >The DMB (data memory barrier) acts as a memory barrier, all memory accesses prior to this instruction will be observed before any explicit access after the instruction. </p>
259 <a id="gaf9544395481cc10fe75df2e8fe58d52a" name="gaf9544395481cc10fe75df2e8fe58d52a"></a>
260 <h2 class="memtitle"><span class="permalink"><a href="#gaf9544395481cc10fe75df2e8fe58d52a">◆ </a></span>__dsb()</h2>
262 <div class="memitem">
263 <div class="memproto">
264 <table class="mlabels">
266 <td class="mlabels-left">
267 <table class="memname">
269 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __dsb </td>
271 <td class="paramtype">void </td>
272 <td class="paramname"></td><td>)</td>
277 <td class="mlabels-right">
278 <span class="mlabels"><span class="mlabel">static</span></span> </td>
281 </div><div class="memdoc">
283 <p>Insert a DSB instruction in to the code path. </p>
284 <p >The DSB (data synchronization barrier) acts as a special kind of data memory barrier (DMB). The DSB operation completes when all explicit memory accesses before this instruction complete. </p>
288 <a id="gae516e592b0d308fe5b032e34109b0057" name="gae516e592b0d308fe5b032e34109b0057"></a>
289 <h2 class="memtitle"><span class="permalink"><a href="#gae516e592b0d308fe5b032e34109b0057">◆ </a></span>__isb()</h2>
291 <div class="memitem">
292 <div class="memproto">
293 <table class="mlabels">
295 <td class="mlabels-left">
296 <table class="memname">
298 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __isb </td>
300 <td class="paramtype">void </td>
301 <td class="paramname"></td><td>)</td>
306 <td class="mlabels-right">
307 <span class="mlabels"><span class="mlabel">static</span></span> </td>
310 </div><div class="memdoc">
312 <p>Insert a ISB instruction in to the code path. </p>
313 <p >ISB acts as an instruction synchronization barrier. It flushes the pipeline of the processor, so that all instructions following the ISB are fetched from cache or memory again, after the ISB instruction has been completed. </p>
317 <a id="ga9442d73d817ec600c67a632edf8c6668" name="ga9442d73d817ec600c67a632edf8c6668"></a>
318 <h2 class="memtitle"><span class="permalink"><a href="#ga9442d73d817ec600c67a632edf8c6668">◆ </a></span>__nop()</h2>
320 <div class="memitem">
321 <div class="memproto">
322 <table class="mlabels">
324 <td class="mlabels-left">
325 <table class="memname">
327 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __nop </td>
329 <td class="paramtype">void </td>
330 <td class="paramname"></td><td>)</td>
335 <td class="mlabels-right">
336 <span class="mlabels"><span class="mlabel">static</span></span> </td>
339 </div><div class="memdoc">
341 <p>Insert a NOP instruction in to the code path. </p>
342 <p >NOP does nothing for one cycle. On RP2350 Arm binaries this is forced to be a 32-bit instruction to avoid dual-issue of NOPs. </p>
346 <a id="ga486eada32246494118f8273a80ae6856" name="ga486eada32246494118f8273a80ae6856"></a>
347 <h2 class="memtitle"><span class="permalink"><a href="#ga486eada32246494118f8273a80ae6856">◆ </a></span>__sev()</h2>
349 <div class="memitem">
350 <div class="memproto">
351 <table class="mlabels">
353 <td class="mlabels-left">
354 <table class="memname">
356 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __sev </td>
358 <td class="paramtype">void </td>
359 <td class="paramname"></td><td>)</td>
364 <td class="mlabels-right">
365 <span class="mlabels"><span class="mlabel">static</span></span> </td>
368 </div><div class="memdoc">
370 <p>Insert a SEV instruction in to the code path. </p>
371 <p >The SEV (send event) instruction sends an event to both cores. </p>
375 <a id="ga7799a0b9fc6444d463170266392f5fcd" name="ga7799a0b9fc6444d463170266392f5fcd"></a>
376 <h2 class="memtitle"><span class="permalink"><a href="#ga7799a0b9fc6444d463170266392f5fcd">◆ </a></span>__wfe()</h2>
378 <div class="memitem">
379 <div class="memproto">
380 <table class="mlabels">
382 <td class="mlabels-left">
383 <table class="memname">
385 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __wfe </td>
387 <td class="paramtype">void </td>
388 <td class="paramname"></td><td>)</td>
393 <td class="mlabels-right">
394 <span class="mlabels"><span class="mlabel">static</span></span> </td>
397 </div><div class="memdoc">
399 <p>Insert a WFE instruction in to the code path. </p>
400 <p >The WFE (wait for event) instruction waits until one of a number of events occurs, including events signalled by the SEV instruction on either core. </p>
404 <a id="gaaf83973c85c4d0987d34f31ff9590ec5" name="gaaf83973c85c4d0987d34f31ff9590ec5"></a>
405 <h2 class="memtitle"><span class="permalink"><a href="#gaaf83973c85c4d0987d34f31ff9590ec5">◆ </a></span>__wfi()</h2>
407 <div class="memitem">
408 <div class="memproto">
409 <table class="mlabels">
411 <td class="mlabels-left">
412 <table class="memname">
414 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void __wfi </td>
416 <td class="paramtype">void </td>
417 <td class="paramname"></td><td>)</td>
422 <td class="mlabels-right">
423 <span class="mlabels"><span class="mlabel">static</span></span> </td>
426 </div><div class="memdoc">
428 <p>Insert a WFI instruction in to the code path. </p>
429 <p >The WFI (wait for interrupt) instruction waits for a interrupt to wake up the core. </p>
433 <a id="gada2be3ad9fabcda77e8bec99e12333fd" name="gada2be3ad9fabcda77e8bec99e12333fd"></a>
434 <h2 class="memtitle"><span class="permalink"><a href="#gada2be3ad9fabcda77e8bec99e12333fd">◆ </a></span>is_spin_locked()</h2>
436 <div class="memitem">
437 <div class="memproto">
438 <table class="mlabels">
440 <td class="mlabels-left">
441 <table class="memname">
443 <td class="memname">static bool is_spin_locked </td>
445 <td class="paramtype">spin_lock_t * </td>
446 <td class="paramname"><em>lock</em></td><td>)</td>
451 <td class="mlabels-right">
452 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
455 </div><div class="memdoc">
457 <p>Check to see if a spinlock is currently acquired elsewhere. </p>
458 <dl class="params"><dt>Parameters</dt><dd>
459 <table class="params">
460 <tr><td class="paramname">lock</td><td>Spinlock instance </td></tr>
467 <a id="ga8f4578aa492d4d37dfbdab5c99ab5b1c" name="ga8f4578aa492d4d37dfbdab5c99ab5b1c"></a>
468 <h2 class="memtitle"><span class="permalink"><a href="#ga8f4578aa492d4d37dfbdab5c99ab5b1c">◆ </a></span>next_striped_spin_lock_num()</h2>
470 <div class="memitem">
471 <div class="memproto">
472 <table class="memname">
474 <td class="memname">uint next_striped_spin_lock_num </td>
476 <td class="paramtype">void </td>
477 <td class="paramname"></td><td>)</td>
481 </div><div class="memdoc">
483 <p>Return a spin lock number from the <em>striped</em> range. </p>
484 <p >Returns a spin lock number in the range PICO_SPINLOCK_ID_STRIPED_FIRST to PICO_SPINLOCK_ID_STRIPED_LAST in a round robin fashion. This does not grant the caller exclusive access to the spin lock, so the caller must:</p>
486 <li>Abide (with other callers) by the contract of only holding this spin lock briefly (and with IRQs disabled - the default via <a class="el" href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602">spin_lock_blocking()</a>), and not whilst holding other spin locks.</li>
487 <li>Be OK with any contention caused by the - brief due to the above requirement - contention with other possible users of the spin lock.</li>
489 <dl class="section return"><dt>Returns</dt><dd>lock_num a spin lock number the caller may use (non exclusively) </dd></dl>
490 <dl class="section see"><dt>See also</dt><dd>PICO_SPINLOCK_ID_STRIPED_FIRST </dd>
492 PICO_SPINLOCK_ID_STRIPED_LAST </dd></dl>
496 <a id="ga863cdac424a18c8ebfcc62107a4c2ad2" name="ga863cdac424a18c8ebfcc62107a4c2ad2"></a>
497 <h2 class="memtitle"><span class="permalink"><a href="#ga863cdac424a18c8ebfcc62107a4c2ad2">◆ </a></span>restore_interrupts()</h2>
499 <div class="memitem">
500 <div class="memproto">
501 <table class="mlabels">
503 <td class="mlabels-left">
504 <table class="memname">
506 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void restore_interrupts </td>
508 <td class="paramtype">uint32_t </td>
509 <td class="paramname"><em>status</em></td><td>)</td>
514 <td class="mlabels-right">
515 <span class="mlabels"><span class="mlabel">static</span></span> </td>
518 </div><div class="memdoc">
520 <p>Restore interrupts to a specified state. </p>
521 <dl class="params"><dt>Parameters</dt><dd>
522 <table class="params">
523 <tr><td class="paramname">status</td><td>Previous interrupt status from <a class="el" href="group__hardware__sync.html#ga15ada9cfb92615e5bb05a29aa3fc7ad8" title="Save and disable interrupts.">save_and_disable_interrupts()</a> </td></tr>
530 <a id="ga4bb69d1717ab90105ea05b82291fc0c7" name="ga4bb69d1717ab90105ea05b82291fc0c7"></a>
531 <h2 class="memtitle"><span class="permalink"><a href="#ga4bb69d1717ab90105ea05b82291fc0c7">◆ </a></span>restore_interrupts_from_disabled()</h2>
533 <div class="memitem">
534 <div class="memproto">
535 <table class="mlabels">
537 <td class="mlabels-left">
538 <table class="memname">
540 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void restore_interrupts_from_disabled </td>
542 <td class="paramtype">uint32_t </td>
543 <td class="paramname"><em>status</em></td><td>)</td>
548 <td class="mlabels-right">
549 <span class="mlabels"><span class="mlabel">static</span></span> </td>
552 </div><div class="memdoc">
554 <p>Restore interrupts to a specified state with restricted transitions. </p>
555 <p >This method should only be used when the interrupt state is known to be disabled, e.g. when paired with <a class="el" href="group__hardware__sync.html#ga15ada9cfb92615e5bb05a29aa3fc7ad8">save_and_disable_interrupts()</a></p>
556 <dl class="params"><dt>Parameters</dt><dd>
557 <table class="params">
558 <tr><td class="paramname">status</td><td>Previous interrupt status from <a class="el" href="group__hardware__sync.html#ga15ada9cfb92615e5bb05a29aa3fc7ad8" title="Save and disable interrupts.">save_and_disable_interrupts()</a> </td></tr>
565 <a id="ga15ada9cfb92615e5bb05a29aa3fc7ad8" name="ga15ada9cfb92615e5bb05a29aa3fc7ad8"></a>
566 <h2 class="memtitle"><span class="permalink"><a href="#ga15ada9cfb92615e5bb05a29aa3fc7ad8">◆ </a></span>save_and_disable_interrupts()</h2>
568 <div class="memitem">
569 <div class="memproto">
570 <table class="mlabels">
572 <td class="mlabels-left">
573 <table class="memname">
575 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint32_t save_and_disable_interrupts </td>
577 <td class="paramtype">void </td>
578 <td class="paramname"></td><td>)</td>
583 <td class="mlabels-right">
584 <span class="mlabels"><span class="mlabel">static</span></span> </td>
587 </div><div class="memdoc">
589 <p>Save and disable interrupts. </p>
590 <dl class="section return"><dt>Returns</dt><dd>The prior interrupt enable status for restoration later via <a class="el" href="group__hardware__sync.html#ga863cdac424a18c8ebfcc62107a4c2ad2" title="Restore interrupts to a specified state.">restore_interrupts()</a> </dd></dl>
594 <a id="ga091e88a7608ed8dbf3e1e984bae54602" name="ga091e88a7608ed8dbf3e1e984bae54602"></a>
595 <h2 class="memtitle"><span class="permalink"><a href="#ga091e88a7608ed8dbf3e1e984bae54602">◆ </a></span>spin_lock_blocking()</h2>
597 <div class="memitem">
598 <div class="memproto">
599 <table class="mlabels">
601 <td class="mlabels-left">
602 <table class="memname">
604 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint32_t spin_lock_blocking </td>
606 <td class="paramtype">spin_lock_t * </td>
607 <td class="paramname"><em>lock</em></td><td>)</td>
612 <td class="mlabels-right">
613 <span class="mlabels"><span class="mlabel">static</span></span> </td>
616 </div><div class="memdoc">
618 <p>Acquire a spin lock safely. </p>
619 <p >This function will disable interrupts prior to acquiring the spinlock</p>
620 <dl class="params"><dt>Parameters</dt><dd>
621 <table class="params">
622 <tr><td class="paramname">lock</td><td>Spinlock instance </td></tr>
626 <dl class="section return"><dt>Returns</dt><dd>interrupt status to be used when unlocking, to restore to original state </dd></dl>
630 <a id="ga50945cb4c33c3263b69e1fce81c474c7" name="ga50945cb4c33c3263b69e1fce81c474c7"></a>
631 <h2 class="memtitle"><span class="permalink"><a href="#ga50945cb4c33c3263b69e1fce81c474c7">◆ </a></span>spin_lock_claim()</h2>
633 <div class="memitem">
634 <div class="memproto">
635 <table class="memname">
637 <td class="memname">void spin_lock_claim </td>
639 <td class="paramtype">uint </td>
640 <td class="paramname"><em>lock_num</em></td><td>)</td>
644 </div><div class="memdoc">
646 <p>Mark a spin lock as used. </p>
647 <p >Method for cooperative claiming of hardware. Will cause a panic if the spin lock is already claimed. Use of this method by libraries detects accidental configurations that would fail in unpredictable ways.</p>
648 <dl class="params"><dt>Parameters</dt><dd>
649 <table class="params">
650 <tr><td class="paramname">lock_num</td><td>the spin lock number </td></tr>
657 <a id="ga41304e0ee0aed1b5c20b0fd8c2adf9e6" name="ga41304e0ee0aed1b5c20b0fd8c2adf9e6"></a>
658 <h2 class="memtitle"><span class="permalink"><a href="#ga41304e0ee0aed1b5c20b0fd8c2adf9e6">◆ </a></span>spin_lock_claim_mask()</h2>
660 <div class="memitem">
661 <div class="memproto">
662 <table class="memname">
664 <td class="memname">void spin_lock_claim_mask </td>
666 <td class="paramtype">uint32_t </td>
667 <td class="paramname"><em>lock_num_mask</em></td><td>)</td>
671 </div><div class="memdoc">
673 <p>Mark multiple spin locks as used. </p>
674 <p >Method for cooperative claiming of hardware. Will cause a panic if any of the spin locks are already claimed. Use of this method by libraries detects accidental configurations that would fail in unpredictable ways.</p>
675 <dl class="params"><dt>Parameters</dt><dd>
676 <table class="params">
677 <tr><td class="paramname">lock_num_mask</td><td>Bitfield of all required spin locks to claim (bit 0 == spin lock 0, bit 1 == spin lock 1 etc) </td></tr>
684 <a id="ga157bccb525bdfd90255490558cbeb9c0" name="ga157bccb525bdfd90255490558cbeb9c0"></a>
685 <h2 class="memtitle"><span class="permalink"><a href="#ga157bccb525bdfd90255490558cbeb9c0">◆ </a></span>spin_lock_claim_unused()</h2>
687 <div class="memitem">
688 <div class="memproto">
689 <table class="memname">
691 <td class="memname">int spin_lock_claim_unused </td>
693 <td class="paramtype">bool </td>
694 <td class="paramname"><em>required</em></td><td>)</td>
698 </div><div class="memdoc">
700 <p>Claim a free spin lock. </p>
701 <dl class="params"><dt>Parameters</dt><dd>
702 <table class="params">
703 <tr><td class="paramname">required</td><td>if true the function will panic if none are available </td></tr>
707 <dl class="section return"><dt>Returns</dt><dd>the spin lock number or -1 if required was false, and none were free </dd></dl>
711 <a id="gad86f015d3ed475401bf83d9a0e449ab1" name="gad86f015d3ed475401bf83d9a0e449ab1"></a>
712 <h2 class="memtitle"><span class="permalink"><a href="#gad86f015d3ed475401bf83d9a0e449ab1">◆ </a></span>spin_lock_get_num()</h2>
714 <div class="memitem">
715 <div class="memproto">
716 <table class="mlabels">
718 <td class="mlabels-left">
719 <table class="memname">
721 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint spin_lock_get_num </td>
723 <td class="paramtype">spin_lock_t * </td>
724 <td class="paramname"><em>lock</em></td><td>)</td>
729 <td class="mlabels-right">
730 <span class="mlabels"><span class="mlabel">static</span></span> </td>
733 </div><div class="memdoc">
735 <p>Get HW Spinlock number from instance. </p>
736 <dl class="params"><dt>Parameters</dt><dd>
737 <table class="params">
738 <tr><td class="paramname">lock</td><td>The Spinlock instance </td></tr>
742 <dl class="section return"><dt>Returns</dt><dd>The Spinlock ID </dd></dl>
746 <a id="gad38821cab3d935b009c6551d5ff70c4c" name="gad38821cab3d935b009c6551d5ff70c4c"></a>
747 <h2 class="memtitle"><span class="permalink"><a href="#gad38821cab3d935b009c6551d5ff70c4c">◆ </a></span>spin_lock_init()</h2>
749 <div class="memitem">
750 <div class="memproto">
751 <table class="memname">
753 <td class="memname">spin_lock_t * spin_lock_init </td>
755 <td class="paramtype">uint </td>
756 <td class="paramname"><em>lock_num</em></td><td>)</td>
760 </div><div class="memdoc">
762 <p>Initialise a spin lock. </p>
763 <p >The spin lock is initially unlocked</p>
764 <dl class="params"><dt>Parameters</dt><dd>
765 <table class="params">
766 <tr><td class="paramname">lock_num</td><td>The spin lock number </td></tr>
770 <dl class="section return"><dt>Returns</dt><dd>The spin lock instance </dd></dl>
774 <a id="ga87b2474d96a8de8cdc6e083680a05bb9" name="ga87b2474d96a8de8cdc6e083680a05bb9"></a>
775 <h2 class="memtitle"><span class="permalink"><a href="#ga87b2474d96a8de8cdc6e083680a05bb9">◆ </a></span>spin_lock_instance()</h2>
777 <div class="memitem">
778 <div class="memproto">
779 <table class="mlabels">
781 <td class="mlabels-left">
782 <table class="memname">
784 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> spin_lock_t * spin_lock_instance </td>
786 <td class="paramtype">uint </td>
787 <td class="paramname"><em>lock_num</em></td><td>)</td>
792 <td class="mlabels-right">
793 <span class="mlabels"><span class="mlabel">static</span></span> </td>
796 </div><div class="memdoc">
798 <p>Get HW Spinlock instance from number. </p>
799 <dl class="params"><dt>Parameters</dt><dd>
800 <table class="params">
801 <tr><td class="paramname">lock_num</td><td>Spinlock ID </td></tr>
805 <dl class="section return"><dt>Returns</dt><dd>The spinlock instance </dd></dl>
809 <a id="ga9c66da8cbd0916461d6de2af4340ec4f" name="ga9c66da8cbd0916461d6de2af4340ec4f"></a>
810 <h2 class="memtitle"><span class="permalink"><a href="#ga9c66da8cbd0916461d6de2af4340ec4f">◆ </a></span>spin_lock_is_claimed()</h2>
812 <div class="memitem">
813 <div class="memproto">
814 <table class="memname">
816 <td class="memname">bool spin_lock_is_claimed </td>
818 <td class="paramtype">uint </td>
819 <td class="paramname"><em>lock_num</em></td><td>)</td>
823 </div><div class="memdoc">
825 <p>Determine if a spin lock is claimed. </p>
826 <dl class="params"><dt>Parameters</dt><dd>
827 <table class="params">
828 <tr><td class="paramname">lock_num</td><td>the spin lock number </td></tr>
832 <dl class="section return"><dt>Returns</dt><dd>true if claimed, false otherwise </dd></dl>
833 <dl class="section see"><dt>See also</dt><dd><a class="el" href="group__hardware__sync.html#ga50945cb4c33c3263b69e1fce81c474c7" title="Mark a spin lock as used.">spin_lock_claim</a> </dd>
835 <a class="el" href="group__hardware__sync.html#ga41304e0ee0aed1b5c20b0fd8c2adf9e6" title="Mark multiple spin locks as used.">spin_lock_claim_mask</a> </dd></dl>
839 <a id="ga177efc085451e4eabfc726897a59ca57" name="ga177efc085451e4eabfc726897a59ca57"></a>
840 <h2 class="memtitle"><span class="permalink"><a href="#ga177efc085451e4eabfc726897a59ca57">◆ </a></span>spin_lock_unclaim()</h2>
842 <div class="memitem">
843 <div class="memproto">
844 <table class="memname">
846 <td class="memname">void spin_lock_unclaim </td>
848 <td class="paramtype">uint </td>
849 <td class="paramname"><em>lock_num</em></td><td>)</td>
853 </div><div class="memdoc">
855 <p>Mark a spin lock as no longer used. </p>
856 <p >Method for cooperative claiming of hardware.</p>
857 <dl class="params"><dt>Parameters</dt><dd>
858 <table class="params">
859 <tr><td class="paramname">lock_num</td><td>the spin lock number to release </td></tr>
866 <a id="gac4c9286f66d9dbe5287904d481f3b1e3" name="gac4c9286f66d9dbe5287904d481f3b1e3"></a>
867 <h2 class="memtitle"><span class="permalink"><a href="#gac4c9286f66d9dbe5287904d481f3b1e3">◆ </a></span>spin_lock_unsafe_blocking()</h2>
869 <div class="memitem">
870 <div class="memproto">
871 <table class="mlabels">
873 <td class="mlabels-left">
874 <table class="memname">
876 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void spin_lock_unsafe_blocking </td>
878 <td class="paramtype">spin_lock_t * </td>
879 <td class="paramname"><em>lock</em></td><td>)</td>
884 <td class="mlabels-right">
885 <span class="mlabels"><span class="mlabel">static</span></span> </td>
888 </div><div class="memdoc">
890 <p>Acquire a spin lock without disabling interrupts (hence unsafe) </p>
891 <dl class="params"><dt>Parameters</dt><dd>
892 <table class="params">
893 <tr><td class="paramname">lock</td><td>Spinlock instance </td></tr>
900 <a id="ga281ce69786da23cab7ba6c42537d4e87" name="ga281ce69786da23cab7ba6c42537d4e87"></a>
901 <h2 class="memtitle"><span class="permalink"><a href="#ga281ce69786da23cab7ba6c42537d4e87">◆ </a></span>spin_unlock()</h2>
903 <div class="memitem">
904 <div class="memproto">
905 <table class="mlabels">
907 <td class="mlabels-left">
908 <table class="memname">
910 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void spin_unlock </td>
912 <td class="paramtype">spin_lock_t * </td>
913 <td class="paramname"><em>lock</em>, </td>
916 <td class="paramkey"></td>
918 <td class="paramtype">uint32_t </td>
919 <td class="paramname"><em>saved_irq</em> </td>
928 <td class="mlabels-right">
929 <span class="mlabels"><span class="mlabel">static</span></span> </td>
932 </div><div class="memdoc">
934 <p>Release a spin lock safely. </p>
935 <p >This function will re-enable interrupts according to the parameters.</p>
936 <dl class="params"><dt>Parameters</dt><dd>
937 <table class="params">
938 <tr><td class="paramname">lock</td><td>Spinlock instance </td></tr>
939 <tr><td class="paramname">saved_irq</td><td>Return value from the <a class="el" href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602">spin_lock_blocking()</a> function.</td></tr>
943 <dl class="section see"><dt>See also</dt><dd><a class="el" href="group__hardware__sync.html#ga091e88a7608ed8dbf3e1e984bae54602" title="Acquire a spin lock safely.">spin_lock_blocking()</a> </dd></dl>
947 <a id="ga1cc04df1f5717292b279eb197ff5b4af" name="ga1cc04df1f5717292b279eb197ff5b4af"></a>
948 <h2 class="memtitle"><span class="permalink"><a href="#ga1cc04df1f5717292b279eb197ff5b4af">◆ </a></span>spin_unlock_unsafe()</h2>
950 <div class="memitem">
951 <div class="memproto">
952 <table class="mlabels">
954 <td class="mlabels-left">
955 <table class="memname">
957 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void spin_unlock_unsafe </td>
959 <td class="paramtype">spin_lock_t * </td>
960 <td class="paramname"><em>lock</em></td><td>)</td>
965 <td class="mlabels-right">
966 <span class="mlabels"><span class="mlabel">static</span></span> </td>
969 </div><div class="memdoc">
971 <p>Release a spin lock without re-enabling interrupts. </p>
972 <dl class="params"><dt>Parameters</dt><dd>
973 <table class="params">
974 <tr><td class="paramname">lock</td><td>Spinlock instance </td></tr>
981 </div><!-- contents -->
982 </div><!-- doc-content -->
984 <script src="main.js"></script>