{"id":3372,"date":"2019-12-17T14:06:22","date_gmt":"2019-12-17T12:06:22","guid":{"rendered":"http:\/\/medtech-ingenieur.de\/?p=3372"},"modified":"2021-08-06T14:35:38","modified_gmt":"2021-08-06T13:35:38","slug":"bootloader-tutorial-teil-3-live-update-bootloader","status":"publish","type":"post","link":"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-3-live-update-bootloader\/","title":{"rendered":"Bootloader Tutorial, Part 3: Live Update Bootloader"},"content":{"rendered":"<p>In the third and final part of this series, I&#039;d like to discuss another implementation option for a bootloader. The difference with this variant is that the bootloader isn&#039;t a standalone firmware project, but is integrated into the main application. This gives the application a way to perform an update itself without (completely) interrupting other firmware functions. If you&#039;d like to reread the first two parts first, you can find them here:<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-1-grundlagen\/\">Bootloader Tutorial, Part 1<\/a><\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-1-grundlagen\/\">Bootloader Tutorial, <\/a><a href=\"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-2-backup-firmware\/\">Part 2<\/a><\/p>\n<h2>Problem description<\/h2>\n<p>Let&#039;s imagine a microcontroller firmware that can interact with a user via a user interface. The firmware is also responsible for reading sensor data and controlling actuators. The firmware can independently download and install software updates from a server. The problem: With a traditional update, the user would first have to put the firmware into update mode, where the new firmware is then installed using the bootloader. This has the following disadvantages, among others:<\/p>\n<ul>\n<li>The user cannot access the remaining functions of the firmware during the update.<\/li>\n<li>The bootloader needs extensive knowledge of the hardware so that it can keep all actuators in a secure state.<\/li>\n<li>The bootloader may need to handle a complex communication stack (in this case, Wi-Fi). This not only requires a lot of memory but also makes it prone to errors. This may also require bootloader updates.<\/li>\n<li>Since the application software usually also requires this communication stack, it is always duplicated. If the stack is adapted for the application, this must either be done for the bootloader, or the host software must support two different variants of the protocol.<\/li>\n<li>If something goes wrong during the update, the firmware will no longer be usable until a new update is installed.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3944 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1.png 1280w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-300x169.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-768x432.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-1024x576.png 1024w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-100x56.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-150x84.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-200x113.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-450x253.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-600x338.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie1-900x506.png 900w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>The first point is usually the most problematic. Long update times can be frustrating for users. Therefore, it can be advantageous to run the firmware update in the background, without the user noticing.<\/p>\n<h2>Solution<\/h2>\n<p>As described, it would be desirable for the firmware to update itself without affecting its other functions. However, there are the following problems:<\/p>\n<ul>\n<li>Firmware running on flash memory cannot overwrite itself.<\/li>\n<li>As long as the flash is being written to, CPU stalling typically occurs. The CPU waits until the write operation is complete before loading the next instruction from the flash. This causes the application to run significantly slower.<\/li>\n<\/ul>\n<p>To solve this problem, some microcontroller manufacturers (examples include Microchip and ST) have released a wide range of microcontrollers whose flash memory consists of two symmetrical flash banks. This has the advantage that the CPU can simultaneously execute instructions from one bank while writing to the other bank.<\/p>\n<h2>Physical and virtual addresses<\/h2>\n<p>To understand how the update works, you first need to know that there is a difference between physical and virtual addresses. Basically, both flash banks, as well as RAM and the controller&#039;s registers, have their own physical address range. However, these individual physical addresses are <em>virtual<\/em> mapped to a larger overall area. This means that the software usually doesn&#039;t know the physical address of the flash, but only accesses the virtual addresses. Using the virtual address, the software can then directly access registers, RAM, or one of the two flash banks. Typically, the flash banks are mapped according to the following scheme:<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3945 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2.png 1280w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-300x169.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-768x432.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-1024x576.png 1024w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-100x56.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-150x84.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-200x113.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-450x253.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-600x338.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie2-900x506.png 900w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>To fully utilize the virtual address range, we can either write a firmware so large that it spans the entire virtual program memory. The linker only knows the virtual addresses when creating the firmware, so in this case, the developer doesn&#039;t need to know how the flash banks are allocated. Alternatively, we can limit our firmware to half the virtual program memory. This ensures that bank 2 always remains free and this area is available for updates. After an update, the mapping can then simply be changed to the following scheme:<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3946 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3.png 1280w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-300x169.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-768x432.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-1024x576.png 1024w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-100x56.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-150x84.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-200x113.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-450x253.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-600x338.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie3-900x506.png 900w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>This means that after a reset, the firmware on bank 2 is always started. The old firmware remains on bank 1, even if it is no longer accessed.<\/p>\n<h2>The update process<\/h2>\n<p>But what does the update process look like? Basically, like any other update software, the update software, which is part of the main application, must ensure that it does not delete itself and only writes to the flash bank from which it is not executed. This can be achieved quite easily by always incrementing the address by half the virtual address when writing to the flash. Program data that actually belongs at address zero is thus written to address <em>0 + half program memory<\/em> (and thus to the beginning of the second flash bank). If the program memory is mapped so that Bank 1 is at virtual address 0, then writing is always done to Bank 2. If Bank 2 is at virtual address 0, writing is always done to Bank 1.<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3947 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png\" alt=\"\" width=\"416\" height=\"665\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png 416w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876-188x300.png 188w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876-100x160.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876-150x240.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876-200x320.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876-300x480.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/a><\/p>\n<p>By splitting the memory into two flash banks, firmware running on one flash bank can perform an update on the other flash bank without causing CPU stalls. This allows the update to occur in the background, while the firmware can continue processing its other tasks in parallel. Especially when an operating system is being used, and the update process runs in a low-priority thread, other functions are barely affected.<\/p>\n<p>Once the firmware update is complete, the application can remap the two flash banks and start the new firmware by jumping to the beginning of the virtual address range.<\/p>\n<h2>Do I still need a classic bootloader?<\/h2>\n<p>Essentially, the procedure described above doesn&#039;t completely replace the classic bootloader. For example, it lacks a check of the application memory. Furthermore, depending on the controller, the mapping of the flash banks is reset after a reset. Therefore, a piece of code may be required to decide which flash bank to access. Accordingly, the mapping of the address ranges must be performed by the bootloader:<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-4176 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324.png\" alt=\"\" width=\"582\" height=\"386\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324.png 582w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324-300x199.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324-100x66.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324-150x99.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324-200x133.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/12\/Folie8-e1576484347324-450x298.png 450w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Let&#039;s first look at the PIC32MZ. In addition to program memory, it has a so-called bootflash. This is reserved, among other things, for the bootloader. Upon reset, the PIC32MZ always boots from the bootflash. Although the PIC32MZ has a bootloader pre-installed in the bootflash, it always jumps to bank 1. Therefore, for this controller family, the standard bootloader (provided by Microchip as a software project) must be adapted accordingly.<a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3948 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894.png\" alt=\"\" width=\"371\" height=\"620\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894.png 371w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894-180x300.png 180w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894-100x167.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894-150x251.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894-200x334.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie5-e1576585721894-300x501.png 300w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><\/a><\/p>\n<p>With &quot;dual-flash&quot; variants of the STM32, things are a little different. Here, a pre-installed bootloader is located in the so-called &quot;system memory.&quot; This bootloader decides whether to jump to Bank 1 or Bank 2 based on the BFB2 (&quot;Boot from Bank 2&quot;) bit in the &quot;option bytes.&quot; The option bytes are also located in the flash, so they are not reset upon reset. If the BFB2 bit is set, the microcontroller first boots into the pre-installed bootloader after a reset, which then starts the application in Bank 2. If the bit is cleared, the bootloader is not run during startup, and instead the application on Bank 1 is executed.<\/p>\n<p><a href=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6.png\"><img loading=\"lazy\" decoding=\"async\" class=\"invertImg aligncenter wp-image-3949 size-full\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839.png\" alt=\"\" width=\"387\" height=\"604\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839.png 387w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839-192x300.png 192w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839-100x156.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839-150x234.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839-200x312.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie6-e1576585659839-300x468.png 300w\" sizes=\"auto, (max-width: 387px) 100vw, 387px\" \/><\/a><\/p>\n<p>This means that dual-flash versions of the STM32 do not require a bootloader. However, this requires that the memory area is verified after an update\u2014i.e., you check whether the update was successful\u2014before changing the BFB2 bit. According to Application Note AN2606, the pre-installed bootloader on the ST also checks whether Bank 2 contains &quot;valid code.&quot; However, this check is not a checksum check or anything similar. Instead, the Reference Manual for the STM32L0X2 (RM0376) states: &quot;<span class=\"\">The code is considered as <span class=\"highlight\">valid<\/span> when the fi<\/span>rst data located at the bank start address (which <span class=\"\">should be the stack pointer) points to a <span class=\"highlight\">valid<\/span> address (stack top address).&quot; If the update was performed incorrectly, or if the memory becomes corrupted after a successful update, the bootloader won&#039;t detect it. In addition, if an update is performed from bank 2 to bank 1, so that the current code is subsequently located in bank 1, a check is never performed at startup.\u00a0<\/span><\/p>\n<p><span class=\"\">So, as I said, I have to check whether I&#039;ve performed the update correctly before changing the BFB2 bit. This at least prevents a faulty firmware from booting immediately after the update.<\/span><\/p>\n<h2>Conclusion<\/h2>\n<p>Microcontrollers with two symmetrical flash banks enable intelligent update methods. The additional flash bank allows a firmware update to be performed automatically without having to configure its other functions.<\/p>\n<p>Another interesting advantage of this technology: In case the firmware on one of the two flash banks becomes corrupted in the field, I still have an older, working firmware version stored as a backup. This means that even if parts of the flash become corrupted, the system won&#039;t completely stop working, provided I&#039;m able to detect the defect.<\/p>\n<p>It should be mentioned, however, that this whole thing also has a downside. I always have to configure my system so that my microcontroller has twice the flash memory than my firmware would require with a traditional update process. Of course, I have to pay for this memory.<\/p>","protected":false},"excerpt":{"rendered":"<p>Im dritten und letzten Teil dieser Reihe m\u00f6chte ich auf eine weitere Realisierungsm\u00f6glichkeit f\u00fcr einen Bootloader eingehen. Der Unterschied bei dieser Variante besteht darin, dass der Bootloader kein eigenst\u00e4ndiges Firmware-Projekt ist, sondern in der Hauptapplikation integriert wird. Hierdurch erh\u00e4lt die Applikation eine M\u00f6glichkeit ein Update von sich selbst durchzuf\u00fchren, ohne das andere Funktionen der Firmware [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3947,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[306,338,395,393,394],"class_list":["post-3372","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","tag-bootloader","tag-firmware","tag-pic32","tag-stm32","tag-update","post-wrapper","thrv_wrapper"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-3-live-update-bootloader\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH\" \/>\n<meta property=\"og:description\" content=\"Im dritten und letzten Teil dieser Reihe m\u00f6chte ich auf eine weitere Realisierungsm\u00f6glichkeit f\u00fcr einen Bootloader eingehen. Der Unterschied bei dieser Variante besteht darin, dass der Bootloader kein eigenst\u00e4ndiges Firmware-Projekt ist, sondern in der Hauptapplikation integriert wird. Hierdurch erh\u00e4lt die Applikation eine M\u00f6glichkeit ein Update von sich selbst durchzuf\u00fchren, ohne das andere Funktionen der Firmware [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-3-live-update-bootloader\/\" \/>\n<meta property=\"og:site_name\" content=\"MEDtech Ingenieur GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/medtechIngenieur\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-17T12:06:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-08-06T13:35:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png\" \/>\n\t<meta property=\"og:image:width\" content=\"416\" \/>\n\t<meta property=\"og:image:height\" content=\"665\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Bj\u00f6rn Schmitz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:site\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Bj\u00f6rn Schmitz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/\"},\"author\":{\"name\":\"Bj\u00f6rn Schmitz\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/d8d57dae1a037203802f980694210c96\"},\"headline\":\"Bootloader Tutorial, Teil 3: Live-Update Bootloader\",\"datePublished\":\"2019-12-17T12:06:22+00:00\",\"dateModified\":\"2021-08-06T13:35:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/\"},\"wordCount\":1568,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Folie4-e1576585588876.png\",\"keywords\":[\"Bootloader\",\"Firmware\",\"PIC32\",\"STM32\",\"Update\"],\"articleSection\":[\"Allgemein\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/\",\"name\":\"Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Folie4-e1576585588876.png\",\"datePublished\":\"2019-12-17T12:06:22+00:00\",\"dateModified\":\"2021-08-06T13:35:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#primaryimage\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Folie4-e1576585588876.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/Folie4-e1576585588876.png\",\"width\":416,\"height\":665},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/bootloader-tutorial-teil-3-live-update-bootloader\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bootloader Tutorial, Teil 3: Live-Update Bootloader\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"name\":\"MEDtech Ingenieur GmbH\",\"description\":\"Ingenieursdienstleister f\u00fcr Medizintechnik\",\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"alternateName\":\"MEDtech\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/medtech-ingenieur.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\",\"name\":\"MEDtech Ingenieur\",\"alternateName\":\"MEDtech\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"width\":700,\"height\":700,\"caption\":\"MEDtech Ingenieur\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/medtechIngenieur\",\"https:\\\/\\\/x.com\\\/MedtechIng\",\"https:\\\/\\\/www.instagram.com\\\/medtech.ingenieure\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/37871229\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/d8d57dae1a037203802f980694210c96\",\"name\":\"Bj\u00f6rn Schmitz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g\",\"caption\":\"Bj\u00f6rn Schmitz\"},\"description\":\"Seit Juli 2017 geh\u00f6re ich zum MEDtech-Ingenieur Team und bin hier vor allem als Firmwareentwickler t\u00e4tig. Schon in k\u00fcrzester Zeit konnte ich an vielen spannenden Projekten aus dem Bereich Medizintechnik, aber auch aus anderen Bereichen mitwirken.\",\"sameAs\":[\"https:\\\/\\\/www.medtech-ingenieur.de\"],\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/en\\\/author\\\/bjoern\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH","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:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-3-live-update-bootloader\/","og_locale":"en_US","og_type":"article","og_title":"Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH","og_description":"Im dritten und letzten Teil dieser Reihe m\u00f6chte ich auf eine weitere Realisierungsm\u00f6glichkeit f\u00fcr einen Bootloader eingehen. Der Unterschied bei dieser Variante besteht darin, dass der Bootloader kein eigenst\u00e4ndiges Firmware-Projekt ist, sondern in der Hauptapplikation integriert wird. Hierdurch erh\u00e4lt die Applikation eine M\u00f6glichkeit ein Update von sich selbst durchzuf\u00fchren, ohne das andere Funktionen der Firmware [&hellip;]","og_url":"https:\/\/medtech-ingenieur.de\/en\/bootloader-tutorial-teil-3-live-update-bootloader\/","og_site_name":"MEDtech Ingenieur GmbH","article_publisher":"https:\/\/www.facebook.com\/medtechIngenieur","article_published_time":"2019-12-17T12:06:22+00:00","article_modified_time":"2021-08-06T13:35:38+00:00","og_image":[{"width":416,"height":665,"url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png","type":"image\/png"}],"author":"Bj\u00f6rn Schmitz","twitter_card":"summary_large_image","twitter_creator":"@MedtechIng","twitter_site":"@MedtechIng","twitter_misc":{"Written by":"Bj\u00f6rn Schmitz","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#article","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/"},"author":{"name":"Bj\u00f6rn Schmitz","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/d8d57dae1a037203802f980694210c96"},"headline":"Bootloader Tutorial, Teil 3: Live-Update Bootloader","datePublished":"2019-12-17T12:06:22+00:00","dateModified":"2021-08-06T13:35:38+00:00","mainEntityOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/"},"wordCount":1568,"commentCount":0,"publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png","keywords":["Bootloader","Firmware","PIC32","STM32","Update"],"articleSection":["Allgemein"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/","url":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/","name":"Bootloader Tutorial, Teil 3: Live-Update Bootloader - MEDtech Ingenieur GmbH","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#primaryimage"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png","datePublished":"2019-12-17T12:06:22+00:00","dateModified":"2021-08-06T13:35:38+00:00","breadcrumb":{"@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#primaryimage","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2019\/10\/Folie4-e1576585588876.png","width":416,"height":665},{"@type":"BreadcrumbList","@id":"https:\/\/medtech-ingenieur.de\/bootloader-tutorial-teil-3-live-update-bootloader\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/medtech-ingenieur.de\/"},{"@type":"ListItem","position":2,"name":"Bootloader Tutorial, Teil 3: Live-Update Bootloader"}]},{"@type":"WebSite","@id":"https:\/\/medtech-ingenieur.de\/#website","url":"https:\/\/medtech-ingenieur.de\/","name":"MEDtech Ingenieur GmbH","description":"Engineering service provider for medical technology","publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"alternateName":"MEDtech","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/medtech-ingenieur.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/medtech-ingenieur.de\/#organization","name":"MEDtech Engineer","alternateName":"MEDtech","url":"https:\/\/medtech-ingenieur.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","width":700,"height":700,"caption":"MEDtech Ingenieur"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/medtechIngenieur","https:\/\/x.com\/MedtechIng","https:\/\/www.instagram.com\/medtech.ingenieure\/","https:\/\/www.linkedin.com\/company\/37871229\/"]},{"@type":"Person","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/d8d57dae1a037203802f980694210c96","name":"Bj\u00f6rn Schmitz","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/220b9f0a28245f1734df66dc6a1279c867b612a6f80e83450554b93475740ff1?s=96&d=mm&r=g","caption":"Bj\u00f6rn Schmitz"},"description":"I&#039;ve been part of the MEDtech engineering team since July 2017, primarily working as a firmware developer. In a very short time, I&#039;ve been able to work on many exciting projects in the medical technology field, as well as in other areas.","sameAs":["https:\/\/www.medtech-ingenieur.de"],"url":"https:\/\/medtech-ingenieur.de\/en\/author\/bjoern\/"}]}},"_links":{"self":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/3372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/comments?post=3372"}],"version-history":[{"count":17,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/3372\/revisions"}],"predecessor-version":[{"id":5809,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/3372\/revisions\/5809"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/media\/3947"}],"wp:attachment":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/media?parent=3372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/categories?post=3372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/tags?post=3372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}