{"id":5431,"date":"2016-06-09T10:50:53","date_gmt":"2016-06-09T08:50:53","guid":{"rendered":"http:\/\/percepio.com\/?p=5431"},"modified":"2022-07-21T20:39:08","modified_gmt":"2022-07-21T18:39:08","slug":"arm-itm","status":"publish","type":"post","link":"https:\/\/percepio.com\/arm-itm\/","title":{"rendered":"ARM ITM: why you need a fast debug probe!"},"content":{"rendered":"<p>When developing embedded software, a good understanding of the real-time behavior is vital. At Percepio we develop the <a href=\"https:\/\/percepio.com\/tracealyzer\/\">Tracealyzer <\/a>tools for RTOS trace visualization, but this post is about a\u00a0related technology from ARM that we believe is of general interest to any developer using ARM-based MCUs.<\/p>\n<p>Having some form of\u00a0diagnostic logging\/tracing is necessary in most firmware\u00a0development. But if using plain &#8220;printf&#8221; calls over a traditional serial port, the overhead is often many milliseconds per logging call, which disturbs the application behavior and is unacceptable in time critical code such as exception handlers or fast control loops. There might however be an excellent solution built in to your MCU already, at least if using an MCU with an ARM Cortex-M3, M4 or M7 core, namely\u00a0<a href=\"http:\/\/infocenter.arm.com\/help\/index.jsp?topic=\/com.arm.doc.ddi0314h\/Chdbicbg.html\" target=\"_blank\" rel=\"noopener\">ITM\u00a0&#8211; Instrumentation Trace Macrocell<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5433\" src=\"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png\" alt=\"ARM ITM DWT\" width=\"830\" height=\"406\" srcset=\"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png 830w, https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm-480x235.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 830px, 100vw\" \/><\/p>\n<p>ITM is a hardware unit that can transfer diagnostic data of two main types:<\/p>\n<ol>\n<li>Debug events generated by the DWT unit, such as exception events and data watchpoint events.<\/li>\n<li>Software instrumentation (SWIT) events, i.e., custom data logged by your code.<\/li>\n<\/ol>\n<p>Using ITM you can transmit any kind of data to the host PC as SWIT events, simply by writing the data to a memory-mapped register on your ARM-based MCU. This can be very fast with a proper debug probe, just a few clock cycles, and ITM even supports automatic time-stamping done by the hardware. Many IDE\u2019s allows you to view this data in a debug window or to write the data to a file for later analysis. The data can be character-by-character text data (e.g, from printf)\u00a0\u00a0but it is also possible to send binary\u00a0data as ITM supports\u00a0up to\u00a032 bits of data per write.<\/p>\n<p>The ITM unit provides 32 logical channels for SWIT events,\u00a0each with a corresponding stimulus register where it accepts input. These channels allow for separating the diagnostic data into different categories. For instance, ARM recommends channel 0 for text data\u00a0(e.g., from printf) and channel 31 for RTOS events, while the other channels can be used for whatever purpose you like.\u00a0The ITM channels share a common FIFO buffer in the ITM unit, that in turn is connected to one or two output ports. The ITM data is included with the instruction trace (ETM) if using the full trace port together with an advanced trace debugger, but it is also available via the commonly available Serial Wire Out (SWO) interface in the debug port. The SWO interface is supported by most debug probes targeting ARM MCUs.<\/p>\n<p>The ITM FIFO buffer is pretty small, only 10 bytes, so if using a slow debug probe some data might be lost if writing too frequently to the ITM ports. This can be prevented by checking if the ITM FIFO has room for additional data before writing it and delay the write in case there is no room (see the below code example for &#8220;fputc&#8221;). This way may however cause a significant impact on the timing of your system, if your debug probe is too slow in receiving the data.<\/p>\n<p>A better way to avoid data loss and\u00a0blocking is to use a fast debug probe. Leading debug probes including SEGGER J-Link, the high-end Keil ULINK models and IAR I-Jet allow SWO sampling rates of 60-100 MHz and cost\u00a0around \u20ac300-\u20ac600, money well spent according to me! With a probe like this, you can typically use the\u00a0ITM ports with no risk of blocking or data loss.<\/p>\n<p>Recently we did an\u00a0ITM\u00a0experiment with a Keil ULINKpro. Our test application managed to write over 2 MByte\/s over ITM, many times more than required for typical Tracealyzer RTOS tracing. This data rate required us to \u201chammer\u201d the\u00a0ITM\u00a0port in a tight loop on a fairly fast ARM Cortex-M4 MCU at 168 MHz and with optimized code.\u00a0Our host-side test application verified the received data continuously and the data transfer was 100% reliable even at maximum speed. In this case there was some ITM\u00a0blocking but not much &#8211; the average write time (including the blocking) was only 20 clock cycles (119 ns @ 168 MHz) and the longest blocking being around 100 cycles. However, at slightly lower data rates, there was no\u00a0ITM\u00a0blocking at all. In that case, the ITM\u00a0writes took just 7 clock cycles, every single time!\u00a0Very nice!<\/p>\n<p><strong>Using ITM in your code<\/strong><\/p>\n<p>The ITM stimulus registers are standardized by ARM and found on address 0xE0000000 (port 0) through 0xE000007C (port 31). To write data, all you need to do is to enable ITM tracing in your IDE (see below) and write your data to the corresponding register.<\/p>\n<p>Assuming your board support package includes ARM\u2019s CMSIS API (which it probably does), writing the data is simply:<\/p>\n<pre style=\"padding-left: 30px;\">#include \"myMCU.h\" \/\/ Includes CMSIS\r\n\u2026\r\nITM-&gt;PORT[0].u32 = mydata;<\/pre>\n<p>If you for some reason don\u2019t have the CMSIS API in your system, you can simply define macros for the ITM stimulus registers like this:<\/p>\n<pre style=\"padding-left: 30px;\">#define ITM_PORT(n)\u00a0\u00a0 (*((volatile unsigned long *)(0xE0000000+4*n)))\r\n\u2026\r\nITM_PORT(0) = mydata;<\/pre>\n<p>Before you can use ITM tracing, you need to enable the ITM tracing. Below is an example from Keil \u00b5Vision, where the system has been configured to enable ITM tracing on all 32 ITM stimulus ports. In the &#8220;Trace Port&#8221; part, make sure to select Manchester mode if possible, which allows for much higher SWO clock frequencies than the UART\/NRZ mode.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9569 size-full\" src=\"https:\/\/percepio.com\/wp-content\/uploads\/2018\/05\/Keil_Trace_Settings.png\" alt=\"Keil ITM Trace Settings\" width=\"623\" height=\"399\" srcset=\"https:\/\/percepio.com\/wp-content\/uploads\/2018\/05\/Keil_Trace_Settings.png 623w, https:\/\/percepio.com\/wp-content\/uploads\/2018\/05\/Keil_Trace_Settings-480x307.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 623px, 100vw\" \/><\/p>\n<p>If using Keil \u00b5Vision, you can see ITM data in two ways. Text output on ITM channel 0 is displayed in the \u201cDebug (printf) Viewer\u201d, found under View &#8211; Serial Windows.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5435\" src=\"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/ulink2_trace_itm_viewer.png\" alt=\"ITM printf viewer\" width=\"283\" height=\"171\" \/><\/p>\n<p>To get your \u201cprintf\u201d calls to write to\u00a0ITM port 0, you need to define your \u201cfputc\u201d function like this:<\/p>\n<pre style=\"padding-left: 30px;\">struct __FILE { int handle; \/* Add whatever needed *\/ };\r\nFILE __stdout;\r\nFILE __stdin;\r\n\r\nint fputc(int ch, FILE *f)\r\n{\r\n    if (DEMCR &amp; TRCENA)\u00a0           \/\/ Only if ITM is available\r\n    {\r\n        while (ITM_PORT(0) == 0);\u00a0 \/\/ Block until room in ITM FIFO\r\n        ITM_PORT(0) = ch;\u00a0         \/\/ Write the data\r\n    }\r\n    return(ch);\r\n}<\/pre>\n<p>The Trace Records window in Keil \u00b5Vision displays a table with all traced events, including all 32 ITM channels. This allows you to study also binary data logged on other channels. You can also output the ITM data to a log file using the ITMLOG or IRLOG commands in the <a href=\"http:\/\/www.keil.com\/support\/man\/docs\/uv4\/uv4_debug_commands.htm\" target=\"_blank\" rel=\"noopener\">Keil \u00b5Vision Command Window<\/a>\u00a0and analyze that anyway you like, perhaps using custom tools or scripts of own making.<\/p>\n<p>Tracing via ITM is a standardized feature on all ARM Cortex-M3, M4 and M7 MCUs, and will most likely be supported also on future ARM MCUs. Moreover, features for viewing and\/or exporting ITM data is available in several IDEs, apart from Keil \u00b5Vision also in e.g., IAR Embedded Workbench and Atollic TrueSTUDIO.<\/p>\n<p>Why don\u2019t you give ITM a try? It is an important debug technology supported by most ARM development tools, it has many applications in debugging and it is easy to get started!<\/p>\n<p>At Percepio we are quite impressed by the performance potential of ITM and are working on support for ITM-based RTOS trace in our Tracealyzer tools. So stay tuned!<\/p>\n<hr \/>\n<p><a href=\"https:\/\/percepio.com\/tracealyzer\/\">Tracealyzer<\/a> allows you to trace and visualize the execution of RTOS tasks, exceptions (ISRs), and other software events, providing more than 30 interconnected views that gives an amazing visual insight into the runtime world of RTOS-based firmware, accelerating development, validation and debugging.<\/p>\n<p>Want to learn more about RTOS-based development and Tracealyzer? <a href=\"https:\/\/percepio.com\/tag\/arm\/\">More articles here!<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.<\/p>\n","protected":false},"author":5,"featured_media":5433,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[19],"tags":[69,37],"class_list":["post-5431","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-rtos-debug-portal","tag-arm","tag-tracealyzer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ARM ITM: why you need a fast debug probe! &#8211; Percepio<\/title>\n<meta name=\"description\" content=\"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/percepio.com\/arm-itm\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ARM ITM: why you need a fast debug probe! &#8211; Percepio\" \/>\n<meta property=\"og:description\" content=\"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/percepio.com\/arm-itm\/\" \/>\n<meta property=\"og:site_name\" content=\"Percepio\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/percepio\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-09T08:50:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-21T18:39:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png\" \/>\n\t<meta property=\"og:image:width\" content=\"830\" \/>\n\t<meta property=\"og:image:height\" content=\"406\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Percepio Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Percepio Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/\"},\"author\":{\"name\":\"Percepio Team\",\"@id\":\"https:\\\/\\\/percepio.com\\\/#\\\/schema\\\/person\\\/e1d7c055bbf94a583308b38fc299397c\"},\"headline\":\"ARM ITM: why you need a fast debug probe!\",\"datePublished\":\"2016-06-09T08:50:53+00:00\",\"dateModified\":\"2022-07-21T18:39:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/\"},\"wordCount\":1158,\"image\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/percepio.com\\\/wp-content\\\/uploads\\\/2016\\\/06\\\/itm.png\",\"keywords\":[\"ARM\",\"Tracealyzer\"],\"articleSection\":[\"Blog - The RTOS Debug Portal\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/\",\"url\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/\",\"name\":\"ARM ITM: why you need a fast debug probe! &#8211; Percepio\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/percepio.com\\\/wp-content\\\/uploads\\\/2016\\\/06\\\/itm.png\",\"datePublished\":\"2016-06-09T08:50:53+00:00\",\"dateModified\":\"2022-07-21T18:39:08+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/#\\\/schema\\\/person\\\/e1d7c055bbf94a583308b38fc299397c\"},\"description\":\"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#primaryimage\",\"url\":\"https:\\\/\\\/percepio.com\\\/wp-content\\\/uploads\\\/2016\\\/06\\\/itm.png\",\"contentUrl\":\"https:\\\/\\\/percepio.com\\\/wp-content\\\/uploads\\\/2016\\\/06\\\/itm.png\",\"width\":830,\"height\":406,\"caption\":\"ARM ITM DWT\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/percepio.com\\\/arm-itm\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/percepio.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ARM ITM: why you need a fast debug probe!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/percepio.com\\\/#website\",\"url\":\"https:\\\/\\\/percepio.com\\\/\",\"name\":\"Percepio\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/percepio.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/percepio.com\\\/#\\\/schema\\\/person\\\/e1d7c055bbf94a583308b38fc299397c\",\"name\":\"Percepio Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g\",\"caption\":\"Percepio Team\"},\"url\":\"https:\\\/\\\/percepio.com\\\/author\\\/percepio-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ARM ITM: why you need a fast debug probe! &#8211; Percepio","description":"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/percepio.com\/arm-itm\/","og_locale":"en_US","og_type":"article","og_title":"ARM ITM: why you need a fast debug probe! &#8211; Percepio","og_description":"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.","og_url":"https:\/\/percepio.com\/arm-itm\/","og_site_name":"Percepio","article_publisher":"https:\/\/www.facebook.com\/percepio","article_published_time":"2016-06-09T08:50:53+00:00","article_modified_time":"2022-07-21T18:39:08+00:00","og_image":[{"width":830,"height":406,"url":"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png","type":"image\/png"}],"author":"Percepio Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Percepio Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/percepio.com\/arm-itm\/#article","isPartOf":{"@id":"https:\/\/percepio.com\/arm-itm\/"},"author":{"name":"Percepio Team","@id":"https:\/\/percepio.com\/#\/schema\/person\/e1d7c055bbf94a583308b38fc299397c"},"headline":"ARM ITM: why you need a fast debug probe!","datePublished":"2016-06-09T08:50:53+00:00","dateModified":"2022-07-21T18:39:08+00:00","mainEntityOfPage":{"@id":"https:\/\/percepio.com\/arm-itm\/"},"wordCount":1158,"image":{"@id":"https:\/\/percepio.com\/arm-itm\/#primaryimage"},"thumbnailUrl":"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png","keywords":["ARM","Tracealyzer"],"articleSection":["Blog - The RTOS Debug Portal"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/percepio.com\/arm-itm\/","url":"https:\/\/percepio.com\/arm-itm\/","name":"ARM ITM: why you need a fast debug probe! &#8211; Percepio","isPartOf":{"@id":"https:\/\/percepio.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/percepio.com\/arm-itm\/#primaryimage"},"image":{"@id":"https:\/\/percepio.com\/arm-itm\/#primaryimage"},"thumbnailUrl":"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png","datePublished":"2016-06-09T08:50:53+00:00","dateModified":"2022-07-21T18:39:08+00:00","author":{"@id":"https:\/\/percepio.com\/#\/schema\/person\/e1d7c055bbf94a583308b38fc299397c"},"description":"Want to log your embedded firmware without excessive overhead? Read this blog post about ARM ITM, available on all Cortex-M3, M4 and M7 MCUs.","breadcrumb":{"@id":"https:\/\/percepio.com\/arm-itm\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/percepio.com\/arm-itm\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/percepio.com\/arm-itm\/#primaryimage","url":"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png","contentUrl":"https:\/\/percepio.com\/wp-content\/uploads\/2016\/06\/itm.png","width":830,"height":406,"caption":"ARM ITM DWT"},{"@type":"BreadcrumbList","@id":"https:\/\/percepio.com\/arm-itm\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/percepio.com\/"},{"@type":"ListItem","position":2,"name":"ARM ITM: why you need a fast debug probe!"}]},{"@type":"WebSite","@id":"https:\/\/percepio.com\/#website","url":"https:\/\/percepio.com\/","name":"Percepio","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/percepio.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/percepio.com\/#\/schema\/person\/e1d7c055bbf94a583308b38fc299397c","name":"Percepio Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f9823067c19352d580bb47848b023b51afe5965c39cb08abd02e379c1d530ac0?s=96&d=mm&r=g","caption":"Percepio Team"},"url":"https:\/\/percepio.com\/author\/percepio-team\/"}]}},"_links":{"self":[{"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/posts\/5431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/comments?post=5431"}],"version-history":[{"count":0,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/posts\/5431\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/media\/5433"}],"wp:attachment":[{"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/media?parent=5431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/categories?post=5431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/percepio.com\/wp-json\/wp\/v2\/tags?post=5431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}