{"id":974,"date":"2026-06-19T03:49:45","date_gmt":"2026-06-19T11:49:45","guid":{"rendered":"https:\/\/salemdata.net\/johnpress\/?p=974"},"modified":"2026-06-19T03:49:45","modified_gmt":"2026-06-19T11:49:45","slug":"shaving-8-9-minutes-off-each-test-cycle","status":"publish","type":"post","link":"https:\/\/salemdata.net\/johnpress\/?p=974","title":{"rendered":"Shaving 8\u20139 Minutes Off Each Test Cycle"},"content":{"rendered":"<p>A recent dialog reminded me why having a powerful \u2014 and fun \u2014 Ryzen 7950-based system is helpful.<\/p>\n<p>I&#8217;m performing testing of hand-held radio units to see how mesh software, ostensibly <a href=\"https:\/\/www.lew-palm.de\/reticulum\/index.html\">Reticulum<\/a>-based units, perform out in the field.\u00a0 The magic of mesh networks is that it can extend the range limits between two radio units. See <a href=\"https:\/\/salemdata.net\/johnpress\/?p=874\">Simulating A Mesh Network For Reticulum Testing<\/a>.\u00a0 In order to test many units that within range of one another, e.g. like all being in the same room, or same building, I have to compile custom firmware for each specific unit, with \u2018blockers\u2019 that prevent it from considering transmissions from nearby units.\u00a0 Simply put, if AMY determines a radio transmission comes from CY, DAN or ED, she ignores it as if it were never received.\u00a0 \u00a0So if I want to test 5 units named AMY, BOB, CY, DAN &amp; ED, and simulate the topology that only any given two are within radio range of each other, then I have to build 5 different firmwares, each differing by its blocking rules, and load them.\u00a0 <strong>Compiling can take time.<\/strong><\/p>\n<figure id=\"attachment_913\" aria-describedby=\"caption-attachment-913\" style=\"width: 784px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-913\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/3_hops.md-1.png\" alt=\"diagram of 5 nodes\" width=\"784\" height=\"275\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/3_hops.md-1.png 784w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/3_hops.md-1-300x105.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/3_hops.md-1-768x269.png 768w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><figcaption id=\"caption-attachment-913\" class=\"wp-caption-text\">5 units, 3 hops<\/figcaption><\/figure>\n<p>The heart of the T-Beam SUPREME is a tiny but capable computer: the ESP32-S.\u00a0 To load software in the T-Beam, you compile and then upload an entire operating system, much like\u00a0 Dell computers do for the computer they sell.\u00a0 The problem I have encountered using my 2012 Intel-based workstation is that to build a firmware for AMY takes over 1 minute.\u00a0 If I change the code with one character, I have rebuild the entire firmware.\u00a0 Since each unit has to have its own firmware, e.g AMY has to know to block BOB, CY, DAN &amp; ED and BOB has to block CY, DAN &amp; ED &amp;etc., That means 5 compiles for a 5 unit test plus the time loading the firmware into each unit.<\/p>\n<p>I found that my Ryzen server can compile the ESP32-S firmware about 10 times faster than my Intel workstation.\u00a0 So I have built a toolchain where:<\/p>\n<ul>\n<li>I modify my code on my Intel workstation,<\/li>\n<li>I check it in to my source code repository on my Forgejo server<span id='easy-footnote-1-974' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=974#easy-footnote-bottom-1-974' title='This is really helpful because it &lt;em&gt;forces me&lt;\/em&gt; to document each and every change and check it into source control.'><sup>1<\/sup><\/a><\/span> and then<\/li>\n<li>on my Ryzen machine, I check out the code and compile it <span id='easy-footnote-2-974' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=974#easy-footnote-bottom-2-974' title='I can compile 7 different units in less than 1 minute.\u00a0'><sup>2<\/sup><\/a><\/span>.<\/li>\n<li>download the relevant unit&#8217;s build, a file tree of about 157 MB, and perform an upload to the T-Beam.<\/li>\n<\/ul>\n<p>I can upload on my workstation and other computers, including the $15 Raspberry Pi Zero 2 W connected to my network via wifi and with a T-Beam connected to it via USB, and perform uploads simultaneously.\u00a0 So compiling on my Intel has to be done one by one, and if I try to compile all 7 images at once, it takes about 10 minutes on my Intel.\u00a0 The Ryzen based server saves me 9 minutes.<\/p>\n<p>Being the fickle person as I can be (thanks to classical piano training), I&#8217;m constantly testing and retesting until I get what I want.\u00a0 That means a lot of iterations of changing the code, building, loading, and running a test from a couple of minutes to 15 minutes.\u00a0 Radio signals being what they are, I find you have to allow the units to perform communication tests several times to account for anomalies that might affect the radio signals.\u00a0 Hence, compiling on my Ryzen saves me about 9 minutes per test cycle.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A recent dialog reminded me why having a powerful \u2014 and fun \u2014 Ryzen 7950-based system is helpful. I&#8217;m performing testing of hand-held radio units to see how mesh software, ostensibly Reticulum-based units, perform out in the field.\u00a0 The magic of mesh networks is that it can extend the range limits between two radio units. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_gfmr_meta_descriptions":[],"_gfmr_multilingual_taxonomy_terms":[],"footnotes":""},"categories":[1],"tags":[],"class_list":["post-974","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=974"}],"version-history":[{"count":3,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/974\/revisions"}],"predecessor-version":[{"id":977,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/974\/revisions\/977"}],"wp:attachment":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}