{"id":1647,"date":"2015-06-27T16:36:19","date_gmt":"2015-06-27T14:36:19","guid":{"rendered":"http:\/\/majek.mamy.to\/?p=1647"},"modified":"2018-03-17T23:59:07","modified_gmt":"2018-03-17T22:59:07","slug":"writing-to-internal-flash-on-arduino","status":"publish","type":"post","link":"https:\/\/majek.sh\/pl\/writing-to-internal-flash-on-arduino\/","title":{"rendered":"Zapisywanie do wewn\u0119trznej pami\u0119ci flash w Arduino"},"content":{"rendered":"<p><\/p>\n<h1>Troch\u0119 historii<\/h1>\n<p>W LCD88 u\u017cywam pami\u0119ci programu (flash) jako pami\u0119ci modeli. Oczywi\u015bcie modele powinny da\u0107 si\u0119 edytowa\u0107 bez wgrywania za ka\u017cdym razem nowego firmware \ud83d\ude42<\/p>\n<p>W procesorach serii AVR zapis do pami\u0119ci flash mo\u017cliwy jest tylko przez program wykonywany z obszaru bootloadera, wi\u0119c do mojego projektu potrzebowa\u0142em takiego, kt\u00f3ry umo\u017cliwia\u0142by wywo\u0142anie odpowiedniej funkcji z poziomu programu u\u017cytkownika.<br \/>\nNa pocz\u0105tku zaadaptowa\u0142em sw\u00f3j bootloader komunikuj\u0105cy si\u0119 po X-MODEM-ie dodaj\u0105c punkty wej\u015bcia do funkcji zapisuj\u0105cych do flasha. Niestety, X-MODEM jest dosy\u0107 upierdliwym protoko\u0142em dla zwyk\u0142ego \u015bmiertelnika, wi\u0119c wpad\u0142em na pomys\u0142, \u017ce jaki\u015b bootloader kompatybilny z Arduino rozwi\u0105za\u0142by ten problem.<br \/>\nW obecnych czasach wszystko ju\u017c zosta\u0142o wynalezione i zrobione, wi\u0119c zosta\u0142o tylko poszuka\u0107 gotowego rozwi\u0105zania. Najbardziej obiecuj\u0105cym by\u0142 <a href=\"https:\/\/github.com\/Optiboot\/optiboot\" target=\"_blank\">Optiboot<\/a>, ale nie udost\u0119pnia\u0142 mo\u017cliwo\u015bci zapisu flasha przez aplikacj\u0119.<\/p>\n<p>Czas mija\u0142, szuka\u0142em dalej, ale nadal nie mog\u0142em znale\u017a\u0107 'gotowca&#8217;. Bardziej zaskakuj\u0105ce by\u0142o odkrycie, \u017ce na forum Arduino zapisywanie do flasha przez aplikacj\u0119 postrzegane by\u0142o jak co\u015b niemo\u017cliwego do zrobienia. Ka\u017cdy temat ko\u0144czy\u0142 si\u0119 pora\u017ck\u0105 i u\u017cyciem jakiej\u015b zewn\u0119trznej pami\u0119ci (flash, fram czy po prostu karty SD), albo rad\u0105, \u017ceby napisa\u0107 sobie samemu bootloader \ud83d\ude42<\/p>\n<p>Po tych wszystkich poszukiwaniach doszed\u0142em do wniosku, \u017ce albo musz\u0119 sam napisa\u0107 bootloader, albo doda\u0107 tak\u0105 funkcjonalno\u015b\u0107 do jakiego\u015b istniej\u0105cego projektu. Pierwsz\u0105 obiecuj\u0105c\u0105 rzecz\u0105 jak\u0105 znalaz\u0142em w problemach Optiboot-a by\u0142 <a href=\"https:\/\/github.com\/Optiboot\/optiboot\/issues\/52\" target=\"_blank\">problem #52<\/a> z patchem na ko\u0144cu. Niestety, w LCD88 pami\u0119\u0107 RAM jest niezwykle cenna, wi\u0119c alokowanie ca\u0142ej strony w ramie na potrzeby zapisu mi nie pasowa\u0142o, zw\u0142aszcza \u017ce mo\u017cna to zrobi\u0107 bez tego w trybie wype\u0142nij-skasuj-zapisz.<\/p>\n<p>Rok min\u0105\u0142 i wr\u00f3ci\u0142em do Optiboota. Tym razem modyfikacj\u0119 zamierza\u0142em zrobi\u0107 samemu. Nie by\u0142o \u0142atwo, bo musia\u0142em si\u0119 nauczy\u0107 pisa\u0107 w C, pozna\u0107 r\u00f3\u017cne dziwne zachowania avr-gcc jak i b\u0142\u0119dy r\u00f3\u017anych wersji, zaznajomi\u0107 si\u0119 z prac\u0105 na Githubie, u\u017cywaniem gita i pisaniem w Arduino, bo jaki\u015b przyk\u0142ad te\u017c trzeba by\u0142o do\u0142\u0105czy\u0107. Ale w ko\u0144cu si\u0119 ida\u0142o \ud83d\ude42<\/p>\n<h1>Zapis do flash-a<\/h1>\n<p>Optiboot z mo\u017cliwo\u015bci\u0105 zapisu przez aplikacj\u0119 mo\u017cna \u015bci\u0105gn\u0105\u0107 z mojego forka Optiboota (branch supermaster, r\u00f3wnie\u017c z pewnymi poprawkami niedost\u0119pnymi w oryginalnym projekcie):<br \/>\n <a href=\"https:\/\/github.com\/majekw\/optiboot\/tree\/supermaster\" target=\"_blank\">https:\/\/github.com\/majekw\/optiboot\/tree\/supermaster<\/a>. Jest tam r\u00f3wnie\u017c przyk\u0142ad jak u\u017cy\u0107 tej funkcjonalno\u015bci mojego Optiboota z poziomu programu w Arduino (<em>flash_program<\/em> z obszernymi komentarzami).<\/p>\n<p>Bierzcie, u\u017cywajcie i dzielcie si\u0119 dalej nowym lepszym Optibootem \ud83d\ude42<br \/>\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Troch\u0119 historii W LCD88 u\u017cywam pami\u0119ci programu (flash) jako pami\u0119ci modeli. Oczywi\u015bcie modele powinny da\u0107 si\u0119 edytowa\u0107 bez wgrywania za ka\u017cdym razem nowego firmware \ud83d\ude42 W procesorach serii AVR zapis do pami\u0119ci flash mo\u017cliwy jest tylko przez program wykonywany z <span class=\"excerpt-dots\">&hellip;<\/span> <a class=\"more-link\" href=\"https:\/\/majek.sh\/pl\/writing-to-internal-flash-on-arduino\/\"><span class=\"more-msg\">Czytaj dalej &rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[38,50,41],"_links":{"self":[{"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/posts\/1647"}],"collection":[{"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/comments?post=1647"}],"version-history":[{"count":19,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/posts\/1647\/revisions"}],"predecessor-version":[{"id":1735,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/posts\/1647\/revisions\/1735"}],"wp:attachment":[{"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/media?parent=1647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/categories?post=1647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/majek.sh\/pl\/wp-json\/wp\/v2\/tags?post=1647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}