<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Freestanding on Kovacsics Robert</title><link>https://kovirobi.uk/tags/freestanding/</link><description>Recent content in Freestanding on Kovacsics Robert</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Sun, 04 Oct 2026 14:03:43 +0100</lastBuildDate><atom:link href="https://kovirobi.uk/tags/freestanding/index.xml" rel="self" type="application/rss+xml"/><item><title>Bootstrapping Freestanding, part 2</title><link>https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part2/</link><pubDate>Sun, 04 Oct 2026 14:03:43 +0100</pubDate><guid>https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part2/</guid><description>&lt;p&gt;Parts: &lt;a href="https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part1/"&gt;1&lt;/a&gt;, 2&lt;/p&gt;&#10;&lt;p&gt;Time to start using the C library! Though this article is about all the things&#10;that can go wrong when you start to do that. First, let&amp;rsquo;s replace the infinite&#10;loop at the end of init.S with a jump to the C library&amp;rsquo;s entry point (in this&#10;case newlib).&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;code&gt;init.S&lt;/code&gt;&lt;/p&gt;&#10;&#10;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;@@ -21,19 +28,38 @@ _entry:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stmia r9!, {r0-r7}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b 1b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-1: b 1b&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ b _mainCRTStartup&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;The first issue is:&lt;/p&gt;</description></item><item><title>Bootstrapping Freestanding, part 1</title><link>https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part1/</link><pubDate>Sun, 13 Sep 2026 23:06:37 +0100</pubDate><guid>https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part1/</guid><description>&lt;p&gt;Parts: 1, &lt;a href="https://kovirobi.uk/blog/misc/bootstrapping-freestanding/part2/"&gt;2&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Recently I was building the platform support for a Cortex-R5 microcontroller. It&#10;is executing out of QSPI flash, with SRAM (static RAM, doesn&amp;rsquo;t need a controller&#10;set up unlike DRAM) and tightly coupled memory: ATCM is typically for&#10;instructions, and BTCM is typically for data. The benefit of {A,B}TCM is much&#10;faster access, and it is present even when doing erases/writes to the flash. On&#10;the other hand, it is not accessible for other devices in the system (e.g.&#10;network DMA engines), unlike the SRAM.&lt;/p&gt;</description></item></channel></rss>