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: pico_platform</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__pico__platform.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">pico_platform<div class="ingroups"><a class="el" href="group__runtime.html">Runtime Infrastructure</a></div></div></div>
110 <div class="contents">
112 <p>Macros and definitions (and functions when included by non assembly code) for the RP2 family device / architecture to provide a common abstraction over low level compiler / platform specifics.
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:ga1f7eafa00361375ec15412f634ad67b7"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga1f7eafa00361375ec15412f634ad67b7">__fast_mul</a>(a, b)</td></tr>
118 <tr class="memdesc:ga1f7eafa00361375ec15412f634ad67b7"><td class="mdescLeft"> </td><td class="mdescRight">multiply two integer values using the fastest method possible <a href="group__pico__platform.html#ga1f7eafa00361375ec15412f634ad67b7">More...</a><br /></td></tr>
119 <tr class="separator:ga1f7eafa00361375ec15412f634ad67b7"><td class="memSeparator" colspan="2"> </td></tr>
120 <tr class="memitem:ga7a3538bc029b0e60c2f308008fc095c6"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga7a3538bc029b0e60c2f308008fc095c6">__isr</a></td></tr>
121 <tr class="memdesc:ga7a3538bc029b0e60c2f308008fc095c6"><td class="mdescLeft"> </td><td class="mdescRight">Marker for an interrupt handler. <a href="group__pico__platform.html#ga7a3538bc029b0e60c2f308008fc095c6">More...</a><br /></td></tr>
122 <tr class="separator:ga7a3538bc029b0e60c2f308008fc095c6"><td class="memSeparator" colspan="2"> </td></tr>
123 <tr class="memitem:ga23eadd8d1642fb8fe4600708c36e116a"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a>   __always_inline</td></tr>
124 <tr class="memdesc:ga23eadd8d1642fb8fe4600708c36e116a"><td class="mdescLeft"> </td><td class="mdescRight">Attribute to force inlining of a function regardless of optimization level. <a href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">More...</a><br /></td></tr>
125 <tr class="separator:ga23eadd8d1642fb8fe4600708c36e116a"><td class="memSeparator" colspan="2"> </td></tr>
126 <tr class="memitem:ga29022c0c92a05cf88ca5046c59d6f629"><td class="memItemLeft" align="right" valign="top"><a id="ga29022c0c92a05cf88ca5046c59d6f629" name="ga29022c0c92a05cf88ca5046c59d6f629"></a>
127 #define </td><td class="memItemRight" valign="bottom"><b>count_of</b>(a)   (sizeof(a)/sizeof((a)[0]))</td></tr>
128 <tr class="memdesc:ga29022c0c92a05cf88ca5046c59d6f629"><td class="mdescLeft"> </td><td class="mdescRight">Macro to determine the number of elements in an array. <br /></td></tr>
129 <tr class="separator:ga29022c0c92a05cf88ca5046c59d6f629"><td class="memSeparator" colspan="2"> </td></tr>
130 <tr class="memitem:gafa99ec4acc4ecb2dc3c2d05da15d0e3f"><td class="memItemLeft" align="right" valign="top"><a id="gafa99ec4acc4ecb2dc3c2d05da15d0e3f" name="gafa99ec4acc4ecb2dc3c2d05da15d0e3f"></a>
131 #define </td><td class="memItemRight" valign="bottom"><b>MAX</b>(a, b)   ((a)>(b)?(a):(b))</td></tr>
132 <tr class="memdesc:gafa99ec4acc4ecb2dc3c2d05da15d0e3f"><td class="mdescLeft"> </td><td class="mdescRight">Macro to return the maximum of two comparable values. <br /></td></tr>
133 <tr class="separator:gafa99ec4acc4ecb2dc3c2d05da15d0e3f"><td class="memSeparator" colspan="2"> </td></tr>
134 <tr class="memitem:ga3acffbd305ee72dcd4593c0d8af64a4f"><td class="memItemLeft" align="right" valign="top"><a id="ga3acffbd305ee72dcd4593c0d8af64a4f" name="ga3acffbd305ee72dcd4593c0d8af64a4f"></a>
135 #define </td><td class="memItemRight" valign="bottom"><b>MIN</b>(a, b)   ((b)>(a)?(a):(b))</td></tr>
136 <tr class="memdesc:ga3acffbd305ee72dcd4593c0d8af64a4f"><td class="mdescLeft"> </td><td class="mdescRight">Macro to return the minimum of two comparable values. <br /></td></tr>
137 <tr class="separator:ga3acffbd305ee72dcd4593c0d8af64a4f"><td class="memSeparator" colspan="2"> </td></tr>
138 <tr class="memitem:ga2d0b8227d9981a22692d5ef6aa1a386f"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga2d0b8227d9981a22692d5ef6aa1a386f">__check_type_compatible</a>(type_a, type_b)   static_assert(__builtin_types_compatible_p(type_a, type_b), __STRING(type_a) " is not compatible with " __STRING(type_b));</td></tr>
139 <tr class="memdesc:ga2d0b8227d9981a22692d5ef6aa1a386f"><td class="mdescLeft"> </td><td class="mdescRight">Utility macro to assert two types are equivalent. <a href="group__pico__platform.html#ga2d0b8227d9981a22692d5ef6aa1a386f">More...</a><br /></td></tr>
140 <tr class="separator:ga2d0b8227d9981a22692d5ef6aa1a386f"><td class="memSeparator" colspan="2"> </td></tr>
141 <tr class="memitem:ga88c6891ab226690c883f3396611d8dc9"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga88c6891ab226690c883f3396611d8dc9">__after_data</a>(group)   __attribute__((section(".after_data." group)))</td></tr>
142 <tr class="memdesc:ga88c6891ab226690c883f3396611d8dc9"><td class="mdescLeft"> </td><td class="mdescRight">Section attribute macro for placement in RAM after the <code>.data</code> section. <a href="group__pico__platform.html#ga88c6891ab226690c883f3396611d8dc9">More...</a><br /></td></tr>
143 <tr class="separator:ga88c6891ab226690c883f3396611d8dc9"><td class="memSeparator" colspan="2"> </td></tr>
144 <tr class="memitem:gad8b78e068558946081789ce1935528bf"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gad8b78e068558946081789ce1935528bf">__scratch_x</a>(group)   __attribute__((section(".scratch_x." group)))</td></tr>
145 <tr class="memdesc:gad8b78e068558946081789ce1935528bf"><td class="mdescLeft"> </td><td class="mdescRight">Section attribute macro for placement not in flash (i.e in RAM) <a href="group__pico__platform.html#gad8b78e068558946081789ce1935528bf">More...</a><br /></td></tr>
146 <tr class="separator:gad8b78e068558946081789ce1935528bf"><td class="memSeparator" colspan="2"> </td></tr>
147 <tr class="memitem:ga699cabffc3896ece6ec696e841146b3c"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga699cabffc3896ece6ec696e841146b3c">__scratch_y</a>(group)   __attribute__((section(".scratch_y." group)))</td></tr>
148 <tr class="memdesc:ga699cabffc3896ece6ec696e841146b3c"><td class="mdescLeft"> </td><td class="mdescRight">Section attribute macro for placement in the SRAM bank 5 (known as "scratch Y") <a href="group__pico__platform.html#ga699cabffc3896ece6ec696e841146b3c">More...</a><br /></td></tr>
149 <tr class="separator:ga699cabffc3896ece6ec696e841146b3c"><td class="memSeparator" colspan="2"> </td></tr>
150 <tr class="memitem:ga118d39a4ebb425b8bef29e7a1f8731c2"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga118d39a4ebb425b8bef29e7a1f8731c2">__uninitialized_ram</a>(group)   __attribute__((section(".uninitialized_data." #group))) group</td></tr>
151 <tr class="memdesc:ga118d39a4ebb425b8bef29e7a1f8731c2"><td class="mdescLeft"> </td><td class="mdescRight">Section attribute macro for data that is to be left uninitialized. <a href="group__pico__platform.html#ga118d39a4ebb425b8bef29e7a1f8731c2">More...</a><br /></td></tr>
152 <tr class="separator:ga118d39a4ebb425b8bef29e7a1f8731c2"><td class="memSeparator" colspan="2"> </td></tr>
153 <tr class="memitem:ga0f27b5a18b17ef82ff103825a3b7322d"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga0f27b5a18b17ef82ff103825a3b7322d">__in_flash</a>(group)   __attribute__((section(".flashdata." group)))</td></tr>
154 <tr class="memdesc:ga0f27b5a18b17ef82ff103825a3b7322d"><td class="mdescLeft"> </td><td class="mdescRight">Section attribute macro for placement in flash even in a COPY_TO_RAM binary. <a href="group__pico__platform.html#ga0f27b5a18b17ef82ff103825a3b7322d">More...</a><br /></td></tr>
155 <tr class="separator:ga0f27b5a18b17ef82ff103825a3b7322d"><td class="memSeparator" colspan="2"> </td></tr>
156 <tr class="memitem:gad9ab05c9a8f0ab455a5e11773d610787"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gad9ab05c9a8f0ab455a5e11773d610787">__no_inline_not_in_flash_func</a>(func_name)   __noinline __not_in_flash_func(func_name)</td></tr>
157 <tr class="memdesc:gad9ab05c9a8f0ab455a5e11773d610787"><td class="mdescLeft"> </td><td class="mdescRight">Indicates a function should not be stored in flash. <a href="group__pico__platform.html#gad9ab05c9a8f0ab455a5e11773d610787">More...</a><br /></td></tr>
158 <tr class="separator:gad9ab05c9a8f0ab455a5e11773d610787"><td class="memSeparator" colspan="2"> </td></tr>
159 </table><table class="memberdecls">
160 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
161 Functions</h2></td></tr>
162 <tr class="memitem:gab0d1ba75ceb64131e19f613d7a5313c9"><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__pico__platform.html#gab0d1ba75ceb64131e19f613d7a5313c9">tight_loop_contents</a> (void)</td></tr>
163 <tr class="memdesc:gab0d1ba75ceb64131e19f613d7a5313c9"><td class="mdescLeft"> </td><td class="mdescRight">No-op function for the body of tight loops. <a href="group__pico__platform.html#gab0d1ba75ceb64131e19f613d7a5313c9">More...</a><br /></td></tr>
164 <tr class="separator:gab0d1ba75ceb64131e19f613d7a5313c9"><td class="memSeparator" colspan="2"> </td></tr>
165 <tr class="memitem:ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f">busy_wait_at_least_cycles</a> (uint32_t minimum_cycles)</td></tr>
166 <tr class="memdesc:ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f"><td class="mdescLeft"> </td><td class="mdescRight">Helper method to busy-wait for at least the given number of cycles. <a href="group__pico__platform.html#ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f">More...</a><br /></td></tr>
167 <tr class="separator:ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f"><td class="memSeparator" colspan="2"> </td></tr>
168 <tr class="memitem:ga9837dbd9fd5cc43d4f0fc1f26d046955"><td class="memItemLeft" align="right" valign="top"><a id="ga9837dbd9fd5cc43d4f0fc1f26d046955" name="ga9837dbd9fd5cc43d4f0fc1f26d046955"></a>
169 static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void </td><td class="memItemRight" valign="bottom"><b>__breakpoint</b> (void)</td></tr>
170 <tr class="memdesc:ga9837dbd9fd5cc43d4f0fc1f26d046955"><td class="mdescLeft"> </td><td class="mdescRight">Execute a breakpoint instruction. <br /></td></tr>
171 <tr class="separator:ga9837dbd9fd5cc43d4f0fc1f26d046955"><td class="memSeparator" colspan="2"> </td></tr>
172 <tr class="memitem:ga58434ad816f519308ee02c639b7965bc"><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__pico__platform.html#ga58434ad816f519308ee02c639b7965bc">get_core_num</a> (void)</td></tr>
173 <tr class="memdesc:ga58434ad816f519308ee02c639b7965bc"><td class="mdescLeft"> </td><td class="mdescRight">Get the current core number. <a href="group__pico__platform.html#ga58434ad816f519308ee02c639b7965bc">More...</a><br /></td></tr>
174 <tr class="separator:ga58434ad816f519308ee02c639b7965bc"><td class="memSeparator" colspan="2"> </td></tr>
175 <tr class="memitem:ga1ebeac462e038d7e2ce341df8054f894"><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__pico__platform.html#ga1ebeac462e038d7e2ce341df8054f894">__get_current_exception</a> (void)</td></tr>
176 <tr class="memdesc:ga1ebeac462e038d7e2ce341df8054f894"><td class="mdescLeft"> </td><td class="mdescRight">Get the current exception level on this core. <a href="group__pico__platform.html#ga1ebeac462e038d7e2ce341df8054f894">More...</a><br /></td></tr>
177 <tr class="separator:ga1ebeac462e038d7e2ce341df8054f894"><td class="memSeparator" colspan="2"> </td></tr>
178 <tr class="memitem:ga66edd7569f5a42b0a2da43a5926cf064"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> bool </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga66edd7569f5a42b0a2da43a5926cf064">pico_processor_state_is_nonsecure</a> (void)</td></tr>
179 <tr class="memdesc:ga66edd7569f5a42b0a2da43a5926cf064"><td class="mdescLeft"> </td><td class="mdescRight">Return true if executing in the NonSecure state (Arm-only) <a href="group__pico__platform.html#ga66edd7569f5a42b0a2da43a5926cf064">More...</a><br /></td></tr>
180 <tr class="separator:ga66edd7569f5a42b0a2da43a5926cf064"><td class="memSeparator" colspan="2"> </td></tr>
181 <tr class="memitem:ga21200eb89a299a9b121d028ad1725fe3"><td class="memItemLeft" align="right" valign="top">uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga21200eb89a299a9b121d028ad1725fe3">rp2350_chip_version</a> (void)</td></tr>
182 <tr class="memdesc:ga21200eb89a299a9b121d028ad1725fe3"><td class="mdescLeft"> </td><td class="mdescRight">Returns the RP2350 chip revision number. <a href="group__pico__platform.html#ga21200eb89a299a9b121d028ad1725fe3">More...</a><br /></td></tr>
183 <tr class="separator:ga21200eb89a299a9b121d028ad1725fe3"><td class="memSeparator" colspan="2"> </td></tr>
184 <tr class="memitem:gac157772e2fa6f4c64e1c3e4d761089d9"><td class="memItemLeft" align="right" valign="top">static uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gac157772e2fa6f4c64e1c3e4d761089d9">rp2040_chip_version</a> (void)</td></tr>
185 <tr class="memdesc:gac157772e2fa6f4c64e1c3e4d761089d9"><td class="mdescLeft"> </td><td class="mdescRight">Returns the RP2040 chip revision number for compatibility. <a href="group__pico__platform.html#gac157772e2fa6f4c64e1c3e4d761089d9">More...</a><br /></td></tr>
186 <tr class="separator:gac157772e2fa6f4c64e1c3e4d761089d9"><td class="memSeparator" colspan="2"> </td></tr>
187 <tr class="memitem:gadcb55b507bb15fbe5a71bcb2f222b6e2"><td class="memItemLeft" align="right" valign="top">static uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gadcb55b507bb15fbe5a71bcb2f222b6e2">rp2040_rom_version</a> (void)</td></tr>
188 <tr class="memdesc:gadcb55b507bb15fbe5a71bcb2f222b6e2"><td class="mdescLeft"> </td><td class="mdescRight">Returns the RP2040 rom version number. <a href="group__pico__platform.html#gadcb55b507bb15fbe5a71bcb2f222b6e2">More...</a><br /></td></tr>
189 <tr class="separator:gadcb55b507bb15fbe5a71bcb2f222b6e2"><td class="memSeparator" colspan="2"> </td></tr>
190 <tr class="memitem:gab68b1653c84bff361bff5dc2baf2e7ea"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> int32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gab68b1653c84bff361bff5dc2baf2e7ea">__mul_instruction</a> (int32_t a, int32_t b)</td></tr>
191 <tr class="memdesc:gab68b1653c84bff361bff5dc2baf2e7ea"><td class="mdescLeft"> </td><td class="mdescRight">Multiply two integers using an assembly <code>MUL</code> instruction. <a href="group__pico__platform.html#gab68b1653c84bff361bff5dc2baf2e7ea">More...</a><br /></td></tr>
192 <tr class="separator:gab68b1653c84bff361bff5dc2baf2e7ea"><td class="memSeparator" colspan="2"> </td></tr>
193 <tr class="memitem:gac01ec0ae597f7572f8e298fa4f48c8e6"><td class="memItemLeft" align="right" valign="top">static __always_inline void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gac01ec0ae597f7572f8e298fa4f48c8e6">__compiler_memory_barrier</a> (void)</td></tr>
194 <tr class="memdesc:gac01ec0ae597f7572f8e298fa4f48c8e6"><td class="mdescLeft"> </td><td class="mdescRight">Ensure that the compiler does not move memory access across this method call. <a href="group__pico__platform.html#gac01ec0ae597f7572f8e298fa4f48c8e6">More...</a><br /></td></tr>
195 <tr class="separator:gac01ec0ae597f7572f8e298fa4f48c8e6"><td class="memSeparator" colspan="2"> </td></tr>
196 <tr class="memitem:ga29ba8f40ca0c961e04c7380a3665e612"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#ga29ba8f40ca0c961e04c7380a3665e612">panic_unsupported</a> (void)</td></tr>
197 <tr class="memdesc:ga29ba8f40ca0c961e04c7380a3665e612"><td class="mdescLeft"> </td><td class="mdescRight">Panics with the message "Unsupported". <a href="group__pico__platform.html#ga29ba8f40ca0c961e04c7380a3665e612">More...</a><br /></td></tr>
198 <tr class="separator:ga29ba8f40ca0c961e04c7380a3665e612"><td class="memSeparator" colspan="2"> </td></tr>
199 <tr class="memitem:gad1f1a1dc0581a11b597453f148106393"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pico__platform.html#gad1f1a1dc0581a11b597453f148106393">panic</a> (const char *fmt,...)</td></tr>
200 <tr class="memdesc:gad1f1a1dc0581a11b597453f148106393"><td class="mdescLeft"> </td><td class="mdescRight">Displays a panic message and halts execution. <a href="group__pico__platform.html#gad1f1a1dc0581a11b597453f148106393">More...</a><br /></td></tr>
201 <tr class="separator:gad1f1a1dc0581a11b597453f148106393"><td class="memSeparator" colspan="2"> </td></tr>
203 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
204 <p >Macros and definitions (and functions when included by non assembly code) for the RP2 family device / architecture to provide a common abstraction over low level compiler / platform specifics. </p>
205 <p >Macros and definitions (and functions when included by non assembly code) to adapt for different compilers.</p>
206 <p >Macros and definitions for accessing the CPU registers.</p>
207 <p >This header may be included by assembly code </p>
208 <h2 class="groupheader">Macro Definition Documentation</h2>
209 <a id="ga88c6891ab226690c883f3396611d8dc9" name="ga88c6891ab226690c883f3396611d8dc9"></a>
210 <h2 class="memtitle"><span class="permalink"><a href="#ga88c6891ab226690c883f3396611d8dc9">◆ </a></span>__after_data</h2>
212 <div class="memitem">
213 <div class="memproto">
214 <table class="memname">
216 <td class="memname">#define __after_data</td>
218 <td class="paramtype"> </td>
219 <td class="paramname">group</td><td>)</td>
220 <td>   __attribute__((section(".after_data." group)))</td>
223 </div><div class="memdoc">
225 <p>Section attribute macro for placement in RAM after the <code>.data</code> section. </p>
226 <p >For example a 400 element <code>uint32_t</code> array placed after the .data section </p><pre class="fragment">uint32_t __after_data("my_group_name") a_big_array[400];
227 </pre><p> The section attribute is <code>.after_data.<group></code></p>
228 <dl class="params"><dt>Parameters</dt><dd>
229 <table class="params">
230 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently </td></tr>
237 <a id="ga2d0b8227d9981a22692d5ef6aa1a386f" name="ga2d0b8227d9981a22692d5ef6aa1a386f"></a>
238 <h2 class="memtitle"><span class="permalink"><a href="#ga2d0b8227d9981a22692d5ef6aa1a386f">◆ </a></span>__check_type_compatible</h2>
240 <div class="memitem">
241 <div class="memproto">
242 <table class="memname">
244 <td class="memname">#define __check_type_compatible</td>
246 <td class="paramtype"> </td>
247 <td class="paramname">type_a, </td>
250 <td class="paramkey"></td>
252 <td class="paramtype"> </td>
253 <td class="paramname">type_b </td>
258 <td></td><td>   static_assert(__builtin_types_compatible_p(type_a, type_b), __STRING(type_a) " is not compatible with " __STRING(type_b));</td>
261 </div><div class="memdoc">
263 <p>Utility macro to assert two types are equivalent. </p>
264 <p >This macro can be useful in other macros along with <code>typeof</code> to assert that two parameters are of equivalent type (or that a single parameter is of an expected type) </p>
268 <a id="ga1f7eafa00361375ec15412f634ad67b7" name="ga1f7eafa00361375ec15412f634ad67b7"></a>
269 <h2 class="memtitle"><span class="permalink"><a href="#ga1f7eafa00361375ec15412f634ad67b7">◆ </a></span>__fast_mul</h2>
271 <div class="memitem">
272 <div class="memproto">
273 <table class="memname">
275 <td class="memname">#define __fast_mul</td>
277 <td class="paramtype"> </td>
278 <td class="paramname">a, </td>
281 <td class="paramkey"></td>
283 <td class="paramtype"> </td>
284 <td class="paramname">b </td>
292 </div><div class="memdoc">
293 <b>Value:</b><div class="fragment"><div class="line"> __builtin_choose_expr(__builtin_constant_p(b) && !__builtin_constant_p(a), \</div>
294 <div class="line"> (__builtin_popcount(b) >= 2 ? <a class="code hl_function" href="group__pico__platform.html#gab68b1653c84bff361bff5dc2baf2e7ea">__mul_instruction</a>(a,b) : (a)*(b)), \</div>
295 <div class="line"> (a)*(b))</div>
296 <div class="ttc" id="agroup__pico__platform_html_gab68b1653c84bff361bff5dc2baf2e7ea"><div class="ttname"><a href="group__pico__platform.html#gab68b1653c84bff361bff5dc2baf2e7ea">__mul_instruction</a></div><div class="ttdeci">static __force_inline int32_t __mul_instruction(int32_t a, int32_t b)</div><div class="ttdoc">Multiply two integers using an assembly MUL instruction.</div><div class="ttdef"><b>Definition:</b> platform.h:247</div></div>
297 </div><!-- fragment -->
298 <p>multiply two integer values using the fastest method possible </p>
299 <p >Efficiently multiplies value a by possibly constant value b.</p>
300 <p >If b is known to be constant and not zero or a power of 2, then a mul instruction is used rather than gcc's default which is often a slow combination of shifts and adds. If b is a power of 2 then a single shift is of course preferable and will be used</p>
301 <dl class="params"><dt>Parameters</dt><dd>
302 <table class="params">
303 <tr><td class="paramname">a</td><td>the first operand </td></tr>
304 <tr><td class="paramname">b</td><td>the second operand </td></tr>
308 <dl class="section return"><dt>Returns</dt><dd>a * b </dd></dl>
312 <a id="ga23eadd8d1642fb8fe4600708c36e116a" name="ga23eadd8d1642fb8fe4600708c36e116a"></a>
313 <h2 class="memtitle"><span class="permalink"><a href="#ga23eadd8d1642fb8fe4600708c36e116a">◆ </a></span>__force_inline</h2>
315 <div class="memitem">
316 <div class="memproto">
317 <table class="memname">
319 <td class="memname">#define __force_inline   __always_inline</td>
322 </div><div class="memdoc">
324 <p>Attribute to force inlining of a function regardless of optimization level. </p>
325 <p >For example my_function here will always be inlined: </p><pre class="fragment">int __force_inline my_function(int x) {
329 <a id="ga0f27b5a18b17ef82ff103825a3b7322d" name="ga0f27b5a18b17ef82ff103825a3b7322d"></a>
330 <h2 class="memtitle"><span class="permalink"><a href="#ga0f27b5a18b17ef82ff103825a3b7322d">◆ </a></span>__in_flash</h2>
332 <div class="memitem">
333 <div class="memproto">
334 <table class="memname">
336 <td class="memname">#define __in_flash</td>
338 <td class="paramtype"> </td>
339 <td class="paramname">group</td><td>)</td>
340 <td>   __attribute__((section(".flashdata." group)))</td>
343 </div><div class="memdoc">
345 <p>Section attribute macro for placement in flash even in a COPY_TO_RAM binary. </p>
346 <p >For example a <code>uint32_t</code> variable explicitly placed in flash (it will hard fault if you attempt to write it!) </p><pre class="fragment">uint32_t __in_flash("my_group_name") foo = 23;
347 </pre><p> The section attribute is <code>.flashdata.<group></code></p>
348 <dl class="params"><dt>Parameters</dt><dd>
349 <table class="params">
350 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently </td></tr>
357 <a id="ga7a3538bc029b0e60c2f308008fc095c6" name="ga7a3538bc029b0e60c2f308008fc095c6"></a>
358 <h2 class="memtitle"><span class="permalink"><a href="#ga7a3538bc029b0e60c2f308008fc095c6">◆ </a></span>__isr</h2>
360 <div class="memitem">
361 <div class="memproto">
362 <table class="memname">
364 <td class="memname">#define __isr</td>
366 <td class="paramtype"> </td>
367 <td class="paramname">void</td><td>)</td>
371 </div><div class="memdoc">
373 <p>Marker for an interrupt handler. </p>
374 <p >For example an IRQ handler function called my_interrupt_handler: </p><pre class="fragment">void __isr my_interrupt_handler(void) {
378 <a id="gad9ab05c9a8f0ab455a5e11773d610787" name="gad9ab05c9a8f0ab455a5e11773d610787"></a>
379 <h2 class="memtitle"><span class="permalink"><a href="#gad9ab05c9a8f0ab455a5e11773d610787">◆ </a></span>__no_inline_not_in_flash_func</h2>
381 <div class="memitem">
382 <div class="memproto">
383 <table class="memname">
385 <td class="memname">#define __no_inline_not_in_flash_func</td>
387 <td class="paramtype"> </td>
388 <td class="paramname">func_name</td><td>)</td>
389 <td>   __noinline __not_in_flash_func(func_name)</td>
392 </div><div class="memdoc">
394 <p>Indicates a function should not be stored in flash. </p>
395 <p >Decorates a function name, such that the function will execute from RAM (assuming it is not inlined into a flash function by the compiler)</p>
396 <p >For example a function called my_func taking an int parameter: </p><pre class="fragment">void __not_in_flash_func(my_func)(int some_arg) {
397 </pre><p> The function is placed in the <code>.time_critical.<func_name></code> linker section</p>
398 <dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pico__platform.html#gad9ab05c9a8f0ab455a5e11773d610787" title="Indicates a function should not be stored in flash.">__no_inline_not_in_flash_func</a></dd></dl>
399 <p>Indicates a function is time/latency critical and should not run from flash</p>
400 <p >Decorates a function name, such that the function will execute from RAM (assuming it is not inlined into a flash function by the compiler) to avoid possible flash latency. Currently this macro is identical in implementation to <code>__not_in_flash_func</code>, however the semantics are distinct and a <code>__time_critical_func</code> may in the future be treated more specially to reduce the overhead when calling such function from a flash function.</p>
401 <p >For example a function called my_func taking an int parameter: </p><pre class="fragment">void __time_critical(my_func)(int some_arg) {
402 </pre><p> The function is placed in the <code>.time_critical.<func_name></code> linker section</p>
403 <dl class="section see"><dt>See also</dt><dd>__not_in_flash_func</dd></dl>
404 <p>Indicate a function should not be stored in flash and should not be inlined</p>
405 <p >Decorates a function name, such that the function will execute from RAM, explicitly marking it as noinline to prevent it being inlined into a flash function by the compiler</p>
406 <p >For example a function called my_func taking an int parameter: </p><pre class="fragment">void __no_inline_not_in_flash_func(my_func)(int some_arg) {
407 </pre><p> The function is placed in the <code>.time_critical.<func_name></code> linker section </p>
411 <a id="gad8b78e068558946081789ce1935528bf" name="gad8b78e068558946081789ce1935528bf"></a>
412 <h2 class="memtitle"><span class="permalink"><a href="#gad8b78e068558946081789ce1935528bf">◆ </a></span>__scratch_x</h2>
414 <div class="memitem">
415 <div class="memproto">
416 <table class="memname">
418 <td class="memname">#define __scratch_x</td>
420 <td class="paramtype"> </td>
421 <td class="paramname">group</td><td>)</td>
422 <td>   __attribute__((section(".scratch_x." group)))</td>
425 </div><div class="memdoc">
427 <p>Section attribute macro for placement not in flash (i.e in RAM) </p>
428 <p >For example a 3 element <code>uint32_t</code> array placed in RAM (even though it is <code>static const</code>) </p><pre class="fragment">static const uint32_t __not_in_flash("my_group_name") an_array[3];
429 </pre><p> The section attribute is <code>.time_critical.<group></code></p>
430 <dl class="params"><dt>Parameters</dt><dd>
431 <table class="params">
432 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently</td></tr>
436 <p>Section attribute macro for placement in the SRAM bank 4 (known as "scratch X")</p>
437 <p >Scratch X is commonly used for critical data and functions accessed only by one core (when only one core is accessing the RAM bank, there is no opportunity for stalls)</p>
438 <p >For example a <code>uint32_t</code> variable placed in "scratch X" </p><pre class="fragment">uint32_t __scratch_x("my_group_name") foo = 23;
439 </pre><p> The section attribute is <code>.scratch_x.<group></code></p>
440 <dl class="params"><dt>Parameters</dt><dd>
441 <table class="params">
442 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently </td></tr>
449 <a id="ga699cabffc3896ece6ec696e841146b3c" name="ga699cabffc3896ece6ec696e841146b3c"></a>
450 <h2 class="memtitle"><span class="permalink"><a href="#ga699cabffc3896ece6ec696e841146b3c">◆ </a></span>__scratch_y</h2>
452 <div class="memitem">
453 <div class="memproto">
454 <table class="memname">
456 <td class="memname">#define __scratch_y</td>
458 <td class="paramtype"> </td>
459 <td class="paramname">group</td><td>)</td>
460 <td>   __attribute__((section(".scratch_y." group)))</td>
463 </div><div class="memdoc">
465 <p>Section attribute macro for placement in the SRAM bank 5 (known as "scratch Y") </p>
466 <p >Scratch Y is commonly used for critical data and functions accessed only by one core (when only one core is accessing the RAM bank, there is no opportunity for stalls)</p>
467 <p >For example a <code>uint32_t</code> variable placed in "scratch Y" </p><pre class="fragment">uint32_t __scratch_y("my_group_name") foo = 23;
468 </pre><p> The section attribute is <code>.scratch_y.<group></code></p>
469 <dl class="params"><dt>Parameters</dt><dd>
470 <table class="params">
471 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently </td></tr>
478 <a id="ga118d39a4ebb425b8bef29e7a1f8731c2" name="ga118d39a4ebb425b8bef29e7a1f8731c2"></a>
479 <h2 class="memtitle"><span class="permalink"><a href="#ga118d39a4ebb425b8bef29e7a1f8731c2">◆ </a></span>__uninitialized_ram</h2>
481 <div class="memitem">
482 <div class="memproto">
483 <table class="memname">
485 <td class="memname">#define __uninitialized_ram</td>
487 <td class="paramtype"> </td>
488 <td class="paramname">group</td><td>)</td>
489 <td>   __attribute__((section(".uninitialized_data." #group))) group</td>
492 </div><div class="memdoc">
494 <p>Section attribute macro for data that is to be left uninitialized. </p>
495 <p >Data marked this way will retain its value across a reset (normally uninitialized data - in the .bss section) is initialized to zero during runtime initialization</p>
496 <p >For example a <code>uint32_t</code> foo that will retain its value if the program is restarted by reset. </p><pre class="fragment">uint32_t __uninitialized_ram(foo);
497 </pre><p> The section attribute is <code>.uninitialized_data.<group></code></p>
498 <dl class="params"><dt>Parameters</dt><dd>
499 <table class="params">
500 <tr><td class="paramname">group</td><td>a string suffix to use in the section name to distinguish groups that can be linker garbage-collected independently </td></tr>
507 <h2 class="groupheader">Function Documentation</h2>
508 <a id="gac01ec0ae597f7572f8e298fa4f48c8e6" name="gac01ec0ae597f7572f8e298fa4f48c8e6"></a>
509 <h2 class="memtitle"><span class="permalink"><a href="#gac01ec0ae597f7572f8e298fa4f48c8e6">◆ </a></span>__compiler_memory_barrier()</h2>
511 <div class="memitem">
512 <div class="memproto">
513 <table class="mlabels">
515 <td class="mlabels-left">
516 <table class="memname">
518 <td class="memname">static __always_inline void __compiler_memory_barrier </td>
520 <td class="paramtype">void </td>
521 <td class="paramname"></td><td>)</td>
526 <td class="mlabels-right">
527 <span class="mlabels"><span class="mlabel">static</span></span> </td>
530 </div><div class="memdoc">
532 <p>Ensure that the compiler does not move memory access across this method call. </p>
533 <p >For example in the following code: </p><pre class="fragment">*some_memory_location = var_a;
534 __compiler_memory_barrier();
535 uint32_t var_b = *some_other_memory_location
536 </pre><p> The compiler will not move the load from <code>some_other_memory_location</code> above the memory barrier (which it otherwise might - even above the memory store!) </p>
540 <a id="ga1ebeac462e038d7e2ce341df8054f894" name="ga1ebeac462e038d7e2ce341df8054f894"></a>
541 <h2 class="memtitle"><span class="permalink"><a href="#ga1ebeac462e038d7e2ce341df8054f894">◆ </a></span>__get_current_exception()</h2>
543 <div class="memitem">
544 <div class="memproto">
545 <table class="mlabels">
547 <td class="mlabels-left">
548 <table class="memname">
550 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint __get_current_exception </td>
552 <td class="paramtype">void </td>
553 <td class="paramname"></td><td>)</td>
558 <td class="mlabels-right">
559 <span class="mlabels"><span class="mlabel">static</span></span> </td>
562 </div><div class="memdoc">
564 <p>Get the current exception level on this core. </p>
565 <p >On Cortex-M this is the exception number defined in the architecture reference, which is equal to VTABLE_FIRST_IRQ + irq num if inside an interrupt handler. (VTABLE_FIRST_IRQ is defined in platform_defs.h).</p>
566 <p >On Hazard3, this function returns VTABLE_FIRST_IRQ + irq num if inside of an external IRQ handler (or a fault from such a handler), and 0 otherwise, generally aligning with the Cortex-M values.</p>
567 <dl class="section return"><dt>Returns</dt><dd>the exception number if the CPU is handling an exception, or 0 otherwise </dd></dl>
571 <a id="gab68b1653c84bff361bff5dc2baf2e7ea" name="gab68b1653c84bff361bff5dc2baf2e7ea"></a>
572 <h2 class="memtitle"><span class="permalink"><a href="#gab68b1653c84bff361bff5dc2baf2e7ea">◆ </a></span>__mul_instruction()</h2>
574 <div class="memitem">
575 <div class="memproto">
576 <table class="mlabels">
578 <td class="mlabels-left">
579 <table class="memname">
581 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> int32_t __mul_instruction </td>
583 <td class="paramtype">int32_t </td>
584 <td class="paramname"><em>a</em>, </td>
587 <td class="paramkey"></td>
589 <td class="paramtype">int32_t </td>
590 <td class="paramname"><em>b</em> </td>
599 <td class="mlabels-right">
600 <span class="mlabels"><span class="mlabel">static</span></span> </td>
603 </div><div class="memdoc">
605 <p>Multiply two integers using an assembly <code>MUL</code> instruction. </p>
606 <p >This multiplies a by b using multiply instruction using the ARM mul instruction regardless of values (the compiler might otherwise choose to perform shifts/adds), i.e. this is a 1 cycle operation.</p>
607 <dl class="params"><dt>Parameters</dt><dd>
608 <table class="params">
609 <tr><td class="paramname">a</td><td>the first operand </td></tr>
610 <tr><td class="paramname">b</td><td>the second operand </td></tr>
614 <dl class="section return"><dt>Returns</dt><dd>a * b </dd></dl>
618 <a id="ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f" name="ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f"></a>
619 <h2 class="memtitle"><span class="permalink"><a href="#ga49c4fc3b5d3fbe9f2f6f7bc500b9db4f">◆ </a></span>busy_wait_at_least_cycles()</h2>
621 <div class="memitem">
622 <div class="memproto">
623 <table class="mlabels">
625 <td class="mlabels-left">
626 <table class="memname">
628 <td class="memname">static void busy_wait_at_least_cycles </td>
630 <td class="paramtype">uint32_t </td>
631 <td class="paramname"><em>minimum_cycles</em></td><td>)</td>
636 <td class="mlabels-right">
637 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
640 </div><div class="memdoc">
642 <p>Helper method to busy-wait for at least the given number of cycles. </p>
643 <p >This method is useful for introducing very short delays.</p>
644 <p >This method busy-waits in a tight loop for the given number of system clock cycles. The total wait time is only accurate to within 2 cycles, and this method uses a loop counter rather than a hardware timer, so the method will always take longer than expected if an interrupt is handled on the calling core during the busy-wait; you can of course disable interrupts to prevent this.</p>
645 <p >You can use clock_get_hz(clk_sys) to determine the number of clock cycles per second if you want to convert an actual time duration to a number of cycles.</p>
646 <dl class="params"><dt>Parameters</dt><dd>
647 <table class="params">
648 <tr><td class="paramname">minimum_cycles</td><td>the minimum number of system clock cycles to delay for </td></tr>
655 <a id="ga58434ad816f519308ee02c639b7965bc" name="ga58434ad816f519308ee02c639b7965bc"></a>
656 <h2 class="memtitle"><span class="permalink"><a href="#ga58434ad816f519308ee02c639b7965bc">◆ </a></span>get_core_num()</h2>
658 <div class="memitem">
659 <div class="memproto">
660 <table class="mlabels">
662 <td class="mlabels-left">
663 <table class="memname">
665 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> uint get_core_num </td>
667 <td class="paramtype">void </td>
668 <td class="paramname"></td><td>)</td>
673 <td class="mlabels-right">
674 <span class="mlabels"><span class="mlabel">static</span></span> </td>
677 </div><div class="memdoc">
679 <p>Get the current core number. </p>
680 <dl class="section return"><dt>Returns</dt><dd>The core number the call was made from </dd></dl>
684 <a id="gad1f1a1dc0581a11b597453f148106393" name="gad1f1a1dc0581a11b597453f148106393"></a>
685 <h2 class="memtitle"><span class="permalink"><a href="#gad1f1a1dc0581a11b597453f148106393">◆ </a></span>panic()</h2>
687 <div class="memitem">
688 <div class="memproto">
689 <table class="memname">
691 <td class="memname">void panic </td>
693 <td class="paramtype">const char * </td>
694 <td class="paramname"><em>fmt</em>, </td>
697 <td class="paramkey"></td>
699 <td class="paramtype"> </td>
700 <td class="paramname"><em>...</em> </td>
708 </div><div class="memdoc">
710 <p>Displays a panic message and halts execution. </p>
711 <p >An attempt is made to output the message to all registered STDOUT drivers after which this method executes a BKPT instruction.</p>
712 <dl class="params"><dt>Parameters</dt><dd>
713 <table class="params">
714 <tr><td class="paramname">fmt</td><td>format string (printf-like) </td></tr>
715 <tr><td class="paramname">...</td><td>printf-like arguments </td></tr>
722 <a id="ga29ba8f40ca0c961e04c7380a3665e612" name="ga29ba8f40ca0c961e04c7380a3665e612"></a>
723 <h2 class="memtitle"><span class="permalink"><a href="#ga29ba8f40ca0c961e04c7380a3665e612">◆ </a></span>panic_unsupported()</h2>
725 <div class="memitem">
726 <div class="memproto">
727 <table class="memname">
729 <td class="memname">void panic_unsupported </td>
731 <td class="paramtype">void </td>
732 <td class="paramname"></td><td>)</td>
736 </div><div class="memdoc">
738 <p>Panics with the message "Unsupported". </p>
739 <dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pico__platform.html#gad1f1a1dc0581a11b597453f148106393" title="Displays a panic message and halts execution.">panic</a> </dd></dl>
743 <a id="ga66edd7569f5a42b0a2da43a5926cf064" name="ga66edd7569f5a42b0a2da43a5926cf064"></a>
744 <h2 class="memtitle"><span class="permalink"><a href="#ga66edd7569f5a42b0a2da43a5926cf064">◆ </a></span>pico_processor_state_is_nonsecure()</h2>
746 <div class="memitem">
747 <div class="memproto">
748 <table class="mlabels">
750 <td class="mlabels-left">
751 <table class="memname">
753 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> bool pico_processor_state_is_nonsecure </td>
755 <td class="paramtype">void </td>
756 <td class="paramname"></td><td>)</td>
761 <td class="mlabels-right">
762 <span class="mlabels"><span class="mlabel">static</span></span> </td>
765 </div><div class="memdoc">
767 <p>Return true if executing in the NonSecure state (Arm-only) </p>
768 <dl class="section return"><dt>Returns</dt><dd>True if currently executing in the NonSecure state on an Arm processor </dd></dl>
772 <a id="gac157772e2fa6f4c64e1c3e4d761089d9" name="gac157772e2fa6f4c64e1c3e4d761089d9"></a>
773 <h2 class="memtitle"><span class="permalink"><a href="#gac157772e2fa6f4c64e1c3e4d761089d9">◆ </a></span>rp2040_chip_version()</h2>
775 <div class="memitem">
776 <div class="memproto">
777 <table class="mlabels">
779 <td class="mlabels-left">
780 <table class="memname">
782 <td class="memname">static uint8_t rp2040_chip_version </td>
784 <td class="paramtype">void </td>
785 <td class="paramname"></td><td>)</td>
790 <td class="mlabels-right">
791 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
794 </div><div class="memdoc">
796 <p>Returns the RP2040 chip revision number for compatibility. </p>
797 <dl class="section return"><dt>Returns</dt><dd>2 RP2040 errata fixed in B2 are fixed in RP2350 </dd></dl>
801 <a id="gadcb55b507bb15fbe5a71bcb2f222b6e2" name="gadcb55b507bb15fbe5a71bcb2f222b6e2"></a>
802 <h2 class="memtitle"><span class="permalink"><a href="#gadcb55b507bb15fbe5a71bcb2f222b6e2">◆ </a></span>rp2040_rom_version()</h2>
804 <div class="memitem">
805 <div class="memproto">
806 <table class="mlabels">
808 <td class="mlabels-left">
809 <table class="memname">
811 <td class="memname">static uint8_t rp2040_rom_version </td>
813 <td class="paramtype">void </td>
814 <td class="paramname"></td><td>)</td>
819 <td class="mlabels-right">
820 <span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
823 </div><div class="memdoc">
825 <p>Returns the RP2040 rom version number. </p>
826 <dl class="section return"><dt>Returns</dt><dd>the RP2040 rom version number (1 for RP2040-B0, 2 for RP2040-B1, 3 for RP2040-B2) </dd></dl>
830 <a id="ga21200eb89a299a9b121d028ad1725fe3" name="ga21200eb89a299a9b121d028ad1725fe3"></a>
831 <h2 class="memtitle"><span class="permalink"><a href="#ga21200eb89a299a9b121d028ad1725fe3">◆ </a></span>rp2350_chip_version()</h2>
833 <div class="memitem">
834 <div class="memproto">
835 <table class="memname">
837 <td class="memname">uint8_t rp2350_chip_version </td>
839 <td class="paramtype">void </td>
840 <td class="paramname"></td><td>)</td>
844 </div><div class="memdoc">
846 <p>Returns the RP2350 chip revision number. </p>
847 <dl class="section return"><dt>Returns</dt><dd>the RP2350 chip revision number (1 for B0/B1, 2 for B2) </dd></dl>
851 <a id="gab0d1ba75ceb64131e19f613d7a5313c9" name="gab0d1ba75ceb64131e19f613d7a5313c9"></a>
852 <h2 class="memtitle"><span class="permalink"><a href="#gab0d1ba75ceb64131e19f613d7a5313c9">◆ </a></span>tight_loop_contents()</h2>
854 <div class="memitem">
855 <div class="memproto">
856 <table class="mlabels">
858 <td class="mlabels-left">
859 <table class="memname">
861 <td class="memname">static <a class="el" href="group__pico__platform.html#ga23eadd8d1642fb8fe4600708c36e116a">__force_inline</a> void tight_loop_contents </td>
863 <td class="paramtype">void </td>
864 <td class="paramname"></td><td>)</td>
869 <td class="mlabels-right">
870 <span class="mlabels"><span class="mlabel">static</span></span> </td>
873 </div><div class="memdoc">
875 <p>No-op function for the body of tight loops. </p>
876 <p >No-op function intended to be called by any tight hardware polling loop. Using this ubiquitously makes it much easier to find tight loops, but also in the future #ifdef-ed support for lockup debugging might be added </p>
880 </div><!-- contents -->
881 </div><!-- doc-content -->
883 <script src="main.js"></script>