{"id":5357,"date":"2026-04-19T09:50:46","date_gmt":"2026-04-19T07:50:46","guid":{"rendered":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?p=5357"},"modified":"2026-04-19T09:50:46","modified_gmt":"2026-04-19T07:50:46","slug":"one-rom-praxisbeispiel-entwickler-workflow-mit-makefile","status":"publish","type":"post","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?p=5357","title":{"rendered":"One ROM \u2013 Praxisbeispiel: Entwickler-Workflow mit Makefile"},"content":{"rendered":"<h1 data-section-id=\"1sbzj6\" data-start=\"106\" data-end=\"190\">One ROM \u2013 Praxis: Entwickler-Workflow mit Makefile und automatischem Flash per CLI<\/h1>\n<p data-start=\"192\" data-end=\"339\">Im letzten Beitrag ging es darum, One ROM als EPROM-Ersatz f\u00fcr schnelle Firmware-Tests zu verwenden.<br data-start=\"292\" data-end=\"295\" \/>Diesmal gehen wir noch einen Schritt weiter:<\/p>\n<p data-start=\"341\" data-end=\"476\">\ud83d\udc49 <strong data-start=\"344\" data-end=\"476\">Wie sieht ein wirklich praxisnaher Entwickler-Workflow aus, wenn Kompilieren, Flashen und Testen m\u00f6glichst schnell gehen sollen?<\/strong><\/p>\n<p data-start=\"478\" data-end=\"527\">Genau hier spielt One ROM seine St\u00e4rken voll aus.<\/p>\n<hr data-start=\"529\" data-end=\"532\" \/>\n<h2 data-section-id=\"jo1ecp\" data-start=\"534\" data-end=\"545\">Das Ziel<\/h2>\n<p data-start=\"547\" data-end=\"677\">Wer an Firmware f\u00fcr \u00e4ltere Rechner, Eigenbau-Systeme oder EPROM-basierte Hardware arbeitet, m\u00f6chte in der Regel immer das Gleiche:<\/p>\n<ul data-start=\"679\" data-end=\"777\">\n<li data-section-id=\"13ynrir\" data-start=\"679\" data-end=\"699\">Quellcode \u00e4ndern<\/li>\n<li data-section-id=\"178bbve\" data-start=\"700\" data-end=\"722\">Firmware neu bauen<\/li>\n<li data-section-id=\"auuwj6\" data-start=\"723\" data-end=\"759\">sofort ins Zielsystem \u00fcbertragen<\/li>\n<li data-section-id=\"1kimv68\" data-start=\"760\" data-end=\"777\">direkt testen<\/li>\n<\/ul>\n<p data-start=\"779\" data-end=\"908\">Mit einem klassischen EPROM-Programmierger\u00e4t ist das auf Dauer m\u00fchsam.<br data-start=\"849\" data-end=\"852\" \/>Mit One ROM l\u00e4sst sich dieser Ablauf deutlich verk\u00fcrzen.<\/p>\n<hr data-start=\"910\" data-end=\"913\" \/>\n<h2 data-section-id=\"f8ewpn\" data-start=\"915\" data-end=\"934\">Der Grundgedanke<\/h2>\n<p data-start=\"936\" data-end=\"957\">Die Idee ist einfach:<\/p>\n<ol data-start=\"959\" data-end=\"1160\">\n<li data-section-id=\"19m6eku\" data-start=\"959\" data-end=\"995\">Firmware wird auf dem PC gebaut<\/li>\n<li data-section-id=\"1utyxh8\" data-start=\"996\" data-end=\"1059\">das erzeugte Binary wird automatisch an One ROM \u00fcbertragen<\/li>\n<li data-section-id=\"k79z5a\" data-start=\"1060\" data-end=\"1124\">danach wird das Zielsystem neu gestartet oder zur\u00fcckgesetzt<\/li>\n<li data-section-id=\"hywtgh\" data-start=\"1125\" data-end=\"1160\">die neue Firmware l\u00e4uft sofort<\/li>\n<\/ol>\n<p data-start=\"1162\" data-end=\"1242\">\ud83d\udc49 Statt \u201eEPROM ziehen, brennen, einsetzen\u201c reicht dann oft ein einziger Befehl.<\/p>\n<hr data-start=\"1244\" data-end=\"1247\" \/>\n<h2 data-section-id=\"ury74q\" data-start=\"1249\" data-end=\"1268\">Typischer Aufbau<\/h2>\n<p data-start=\"1270\" data-end=\"1314\">F\u00fcr so einen Workflow braucht es nicht viel:<\/p>\n<ul data-start=\"1316\" data-end=\"1474\">\n<li data-section-id=\"n3m044\" data-start=\"1316\" data-end=\"1355\">einen PC oder Laptop zum Entwickeln<\/li>\n<li data-section-id=\"jw0r6v\" data-start=\"1356\" data-end=\"1381\">One ROM im Zielsystem<\/li>\n<li data-section-id=\"zrvnor\" data-start=\"1382\" data-end=\"1412\">USB-Verbindung zum One ROM<\/li>\n<li data-section-id=\"1pmm2cy\" data-start=\"1413\" data-end=\"1432\">die One ROM CLI<\/li>\n<li data-section-id=\"16s0b6d\" data-start=\"1433\" data-end=\"1474\">ein Build-System, zum Beispiel <code data-start=\"1466\" data-end=\"1472\">make<\/code><\/li>\n<\/ul>\n<p data-start=\"1476\" data-end=\"1627\">Das Zielsystem selbst bleibt dabei unver\u00e4ndert.<br data-start=\"1523\" data-end=\"1526\" \/>F\u00fcr den Rechner oder die Platine sieht One ROM weiterhin einfach wie ein normales ROM oder EPROM aus.<\/p>\n<hr data-start=\"1629\" data-end=\"1632\" \/>\n<h2 data-section-id=\"7crnvp\" data-start=\"1634\" data-end=\"1679\">Der klassische Ablauf \u2013 und warum er nervt<\/h2>\n<p data-start=\"1681\" data-end=\"1725\">Ohne One ROM sieht eine \u00c4nderung oft so aus:<\/p>\n<ol data-start=\"1727\" data-end=\"1851\">\n<li data-section-id=\"3nxnnk\" data-start=\"1727\" data-end=\"1743\">Code \u00e4ndern<\/li>\n<li data-section-id=\"unbjok\" data-start=\"1744\" data-end=\"1762\">Build starten<\/li>\n<li data-section-id=\"1akg9ht\" data-start=\"1763\" data-end=\"1787\">EPROM programmieren<\/li>\n<li data-section-id=\"12wjgtw\" data-start=\"1788\" data-end=\"1813\">alten Chip entfernen<\/li>\n<li data-section-id=\"1ncc7fs\" data-start=\"1814\" data-end=\"1839\">neuen Chip einsetzen<\/li>\n<li data-section-id=\"hwfls\" data-start=\"1840\" data-end=\"1851\">testen<\/li>\n<\/ol>\n<p data-start=\"1853\" data-end=\"1951\">Das funktioniert \u2013 aber es kostet Zeit und macht gerade bei vielen kleinen \u00c4nderungen keinen Spa\u00df.<\/p>\n<hr data-start=\"1953\" data-end=\"1956\" \/>\n<h2 data-section-id=\"1cs7lh1\" data-start=\"1958\" data-end=\"1991\">Der moderne Ablauf mit One ROM<\/h2>\n<p data-start=\"1993\" data-end=\"2039\">Mit One ROM kann derselbe Vorgang so aussehen:<\/p>\n<ol data-start=\"2041\" data-end=\"2143\">\n<li data-section-id=\"3nxnnk\" data-start=\"2041\" data-end=\"2057\">Code \u00e4ndern<\/li>\n<li data-section-id=\"1523w1u\" data-start=\"2058\" data-end=\"2084\"><code data-start=\"2061\" data-end=\"2073\">make flash<\/code> eingeben<\/li>\n<li data-section-id=\"ts5bzx\" data-start=\"2085\" data-end=\"2112\">wenige Sekunden warten<\/li>\n<li data-section-id=\"1md3ler\" data-start=\"2113\" data-end=\"2131\">Reset dr\u00fccken<\/li>\n<li data-section-id=\"1l7yk1v\" data-start=\"2132\" data-end=\"2143\">testen<\/li>\n<\/ol>\n<p data-start=\"2145\" data-end=\"2218\">\ud83d\udc49 Genau dieser Unterschied macht One ROM beim Entwickeln so interessant.<\/p>\n<hr data-start=\"2220\" data-end=\"2223\" \/>\n<h2 data-section-id=\"1wclbe7\" data-start=\"2225\" data-end=\"2257\">Ein einfaches Beispielprojekt<\/h2>\n<p data-start=\"2259\" data-end=\"2336\">Nehmen wir an, dein Projekt erzeugt am Ende eine Datei namens <code data-start=\"2321\" data-end=\"2335\">firmware.bin<\/code>.<\/p>\n<p data-start=\"2338\" data-end=\"2394\">Die Verzeichnisstruktur k\u00f6nnte zum Beispiel so aussehen:<\/p>\n<pre data-start=\"2338\" data-end=\"2394\">projekt\/\r\n\u251c\u2500\u2500 src\/\r\n\u251c\u2500\u2500 build\/\r\n\u251c\u2500\u2500 Makefile\r\n\u2514\u2500\u2500 firmware.bin\r\n<\/pre>\n<p data-start=\"2468\" data-end=\"2573\">Das ist nat\u00fcrlich nur ein Beispiel \u2013 entscheidend ist nur, dass dein Build am Ende ein ROM-Image erzeugt.<\/p>\n<hr data-start=\"2575\" data-end=\"2578\" \/>\n<h2 data-section-id=\"19f761a\" data-start=\"2580\" data-end=\"2611\">Der erste Schritt: Nur bauen<\/h2>\n<p data-start=\"2613\" data-end=\"2698\">Bevor wir das Flashen automatisieren, sollte der normale Build bereits sauber laufen.<\/p>\n<p data-start=\"2700\" data-end=\"2747\">Ein sehr einfaches Makefile k\u00f6nnte so aussehen:<\/p>\n<pre data-start=\"2700\" data-end=\"2747\">PROJECT = firmware\r\nBUILD_DIR = build\r\nIMAGE = $(BUILD_DIR)\/$(PROJECT).bin\r\n\r\nall: $(IMAGE)\r\n\r\n$(IMAGE):\r\n\tmkdir -p $(BUILD_DIR)\r\n\t@echo Erzeuge $(IMAGE)\r\n\t@copy \/b src\\firmware.bin $(IMAGE)\r\n\r\nclean:\r\n\trmdir \/s \/q $(BUILD_DIR)\r\n<\/pre>\n<p data-start=\"2982\" data-end=\"3119\">Das Beispiel ist bewusst simpel gehalten.<br data-start=\"3023\" data-end=\"3026\" \/>In einem echten Projekt w\u00fcrdest du hier nat\u00fcrlich Assembler, C-Compiler oder Linker aufrufen.<\/p>\n<hr data-start=\"3121\" data-end=\"3124\" \/>\n<h2 data-section-id=\"zhyd6e\" data-start=\"3126\" data-end=\"3165\">Der n\u00e4chste Schritt: Flashen per CLI<\/h2>\n<p data-start=\"3167\" data-end=\"3197\">Jetzt kommt One ROM ins Spiel.<\/p>\n<p data-start=\"3199\" data-end=\"3338\">Sobald dein Binary erzeugt wurde, kann es direkt per CLI \u00fcbertragen werden.<br data-start=\"3274\" data-end=\"3277\" \/>Der eigentliche Flash-Befehl sieht dabei zum Beispiel so aus:<\/p>\n<pre data-start=\"3199\" data-end=\"3338\">onerom program build\/firmware.bin\r\n<\/pre>\n<p data-start=\"3387\" data-end=\"3439\">Danach ist die neue Firmware im One ROM gespeichert.<\/p>\n<hr data-start=\"3441\" data-end=\"3444\" \/>\n<h2 data-section-id=\"1uwk1di\" data-start=\"3446\" data-end=\"3472\">Makefile mit Flash-Ziel<\/h2>\n<p data-start=\"3474\" data-end=\"3551\">Spannend wird es, wenn du den Flash-Vorgang direkt in dein Makefile einbaust.<\/p>\n<p data-start=\"3553\" data-end=\"3576\">Ein einfaches Beispiel:<\/p>\n<pre data-start=\"3553\" data-end=\"3576\">PROJECT = firmware\r\nBUILD_DIR = build\r\nIMAGE = $(BUILD_DIR)\/$(PROJECT).bin\r\nONEROM = onerom.exe\r\n\r\nall: $(IMAGE)\r\n\r\n$(IMAGE):\r\n\tif not exist $(BUILD_DIR) mkdir $(BUILD_DIR)\r\n\t@echo Erzeuge $(IMAGE)\r\n\tcopy \/b src\\firmware.bin $(IMAGE)\r\n\r\nflash: $(IMAGE)\r\n\t$(ONEROM) scan\r\n\t$(ONEROM) inspect\r\n\t$(ONEROM) program $(IMAGE)\r\n\r\nclean:\r\n\tif exist $(BUILD_DIR) rmdir \/s \/q $(BUILD_DIR)<\/pre>\n<p data-start=\"3955\" data-end=\"3989\">Damit reicht unter Windows sp\u00e4ter:<\/p>\n<pre data-start=\"3955\" data-end=\"3989\">make flash<\/pre>\n<p data-start=\"4015\" data-end=\"4112\">\ud83d\udc49 Das Makefile baut dann zuerst das Binary und \u00fcbertr\u00e4gt es anschlie\u00dfend direkt auf das One ROM.<\/p>\n<hr data-start=\"4114\" data-end=\"4117\" \/>\n<h2 data-section-id=\"o1pwrt\" data-start=\"4119\" data-end=\"4142\">Variante unter Linux<\/h2>\n<p data-start=\"4144\" data-end=\"4233\">Unter Linux oder macOS sieht das Ganze fast genauso aus, nur mit anderen Shell-Kommandos:<\/p>\n<pre data-start=\"4144\" data-end=\"4233\">PROJECT = firmware\r\nBUILD_DIR = build\r\nIMAGE = $(BUILD_DIR)\/$(PROJECT).bin\r\nONEROM = .\/onerom\r\n\r\nall: $(IMAGE)\r\n\r\n$(IMAGE):\r\n\tmkdir -p $(BUILD_DIR)\r\n\t@echo \"Erzeuge $(IMAGE)\"\r\n\tcp src\/firmware.bin $(IMAGE)\r\n\r\nflash: $(IMAGE)\r\n\t$(ONEROM) scan\r\n\t$(ONEROM) inspect\r\n\t$(ONEROM) program $(IMAGE)\r\n\r\nclean:\r\n\trm -rf $(BUILD_DIR)<\/pre>\n<hr data-start=\"4557\" data-end=\"4560\" \/>\n<h2 data-section-id=\"1hw1o1o\" data-start=\"4562\" data-end=\"4605\"><span role=\"text\">Warum <code data-start=\"4571\" data-end=\"4577\">scan<\/code> und <code data-start=\"4582\" data-end=\"4591\">inspect<\/code> sinnvoll sind<\/span><\/h2>\n<p data-start=\"4607\" data-end=\"4727\">Man k\u00f6nnte nat\u00fcrlich direkt <code data-start=\"4635\" data-end=\"4644\">program<\/code> aufrufen.<br data-start=\"4654\" data-end=\"4657\" \/>In der Praxis ist es aber oft sinnvoll, vorher noch zwei Dinge zu tun:<\/p>\n<ul data-start=\"4729\" data-end=\"4837\">\n<li data-section-id=\"9s87k5\" data-start=\"4729\" data-end=\"4783\"><code data-start=\"4731\" data-end=\"4737\">scan<\/code> pr\u00fcft, ob das Ger\u00e4t \u00fcberhaupt gefunden wird<\/li>\n<li data-section-id=\"xi2tys\" data-start=\"4784\" data-end=\"4837\"><code data-start=\"4786\" data-end=\"4795\">inspect<\/code> zeigt den aktuellen Zustand des One ROM<\/li>\n<\/ul>\n<p data-start=\"4839\" data-end=\"4973\">\ud83d\udc49 Gerade wenn man mit mehreren Ger\u00e4ten arbeitet oder verschiedene Testaufbauten auf dem Tisch hat, spart das viele Missverst\u00e4ndnisse.<\/p>\n<hr data-start=\"4975\" data-end=\"4978\" \/>\n<h2 data-section-id=\"uqr397\" data-start=\"4980\" data-end=\"5033\">Noch komfortabler: Alles mit einem einzigen Befehl<\/h2>\n<p data-start=\"5035\" data-end=\"5124\">Der eigentliche Charme liegt darin, dass du dir einen sehr kurzen Zyklus aufbauen kannst:<\/p>\n<pre data-start=\"5035\" data-end=\"5124\">make flash<\/pre>\n<p data-start=\"5150\" data-end=\"5194\">Das ist dann der gesamte Entwicklungsablauf:<\/p>\n<ul data-start=\"5196\" data-end=\"5239\">\n<li data-section-id=\"1u67d6n\" data-start=\"5196\" data-end=\"5206\">\u00e4ndern<\/li>\n<li data-section-id=\"rcyqdx\" data-start=\"5207\" data-end=\"5216\">bauen<\/li>\n<li data-section-id=\"wfr2c3\" data-start=\"5217\" data-end=\"5228\">flashen<\/li>\n<li data-section-id=\"nc9jp1\" data-start=\"5229\" data-end=\"5239\">testen<\/li>\n<\/ul>\n<p data-start=\"5241\" data-end=\"5267\">Mehr braucht es oft nicht.<\/p>\n<hr data-start=\"5269\" data-end=\"5272\" \/>\n<h2 data-section-id=\"13qyfoe\" data-start=\"5274\" data-end=\"5309\">Optional: automatischer Neustart<\/h2>\n<p data-start=\"5311\" data-end=\"5413\">Wenn dein Aufbau es zul\u00e4sst, kannst du nach dem Flashen auch noch einen Neustart des One ROM ausl\u00f6sen:<\/p>\n<pre data-start=\"5311\" data-end=\"5413\">flash: $(IMAGE)\r\n\t$(ONEROM) scan\r\n\t$(ONEROM) inspect\r\n\t$(ONEROM) program $(IMAGE)\r\n\t$(ONEROM) reboot<\/pre>\n<p data-start=\"5529\" data-end=\"5668\">Ob das im konkreten Aufbau sinnvoll ist, h\u00e4ngt vom Zielsystem ab.<br data-start=\"5594\" data-end=\"5597\" \/>Oft reicht auch ein manueller Reset am Rechner oder an der Testplatine.<\/p>\n<hr data-start=\"5670\" data-end=\"5673\" \/>\n<h2 data-section-id=\"4px2go\" data-start=\"5675\" data-end=\"5718\">Mehr Sicherheit durch eigenes Flash-Ziel<\/h2>\n<p data-start=\"5720\" data-end=\"5847\">In der Praxis ist es oft sinnvoll, nicht <code data-start=\"5761\" data-end=\"5766\">all<\/code> automatisch zu flashen, sondern daf\u00fcr ein eigenes Ziel wie <code data-start=\"5826\" data-end=\"5833\">flash<\/code> zu verwenden.<\/p>\n<p data-start=\"5849\" data-end=\"5871\">Der Grund ist einfach:<\/p>\n<p data-start=\"5873\" data-end=\"5942\">\ud83d\udc49 Nicht jeder Build soll sofort auf die Hardware geschrieben werden.<\/p>\n<p data-start=\"5944\" data-end=\"6079\">Manchmal will man nur kompilieren, manchmal disassemblieren, manchmal vergleichen.<br data-start=\"6026\" data-end=\"6029\" \/>Mit einem eigenen Ziel bleibt das sauber getrennt.<\/p>\n<hr data-start=\"6081\" data-end=\"6084\" \/>\n<h2 data-section-id=\"12yx5h3\" data-start=\"6086\" data-end=\"6129\">Beispiel f\u00fcr einen typischen Tagesablauf<\/h2>\n<p data-start=\"6131\" data-end=\"6182\">Ein realistischer Workflow k\u00f6nnte dann so aussehen:<\/p>\n<ol data-start=\"6184\" data-end=\"6346\">\n<li data-section-id=\"1qn1ppd\" data-start=\"6184\" data-end=\"6205\">Quellcode \u00e4ndern<\/li>\n<li data-section-id=\"yrychs\" data-start=\"6206\" data-end=\"6247\"><code data-start=\"6209\" data-end=\"6215\">make<\/code> zum schnellen Test des Builds<\/li>\n<li data-section-id=\"1p12yj9\" data-start=\"6248\" data-end=\"6304\"><code data-start=\"6251\" data-end=\"6263\">make flash<\/code>, wenn das Binary auf die Hardware soll<\/li>\n<li data-section-id=\"1kqoead\" data-start=\"6305\" data-end=\"6324\">Ger\u00e4t resetten<\/li>\n<li data-section-id=\"oyibzq\" data-start=\"6325\" data-end=\"6346\">Verhalten pr\u00fcfen<\/li>\n<\/ol>\n<p data-start=\"6348\" data-end=\"6399\">Das klingt banal \u2013 spart aber im Alltag enorm Zeit.<\/p>\n<hr data-start=\"6401\" data-end=\"6404\" \/>\n<h2 data-section-id=\"wrinsq\" data-start=\"6406\" data-end=\"6453\">Noch besser: verschiedene Firmware-Varianten<\/h2>\n<p data-start=\"6455\" data-end=\"6532\">Besonders elegant wird es, wenn du mehrere Firmware-Varianten parallel baust.<\/p>\n<p data-start=\"6534\" data-end=\"6547\">Zum Beispiel:<\/p>\n<ul data-start=\"6549\" data-end=\"6628\">\n<li data-section-id=\"kebslg\" data-start=\"6549\" data-end=\"6568\">normale Version<\/li>\n<li data-section-id=\"1n37rta\" data-start=\"6569\" data-end=\"6586\">Debug-Version<\/li>\n<li data-section-id=\"1ibwo6i\" data-start=\"6587\" data-end=\"6628\">Test-Version mit zus\u00e4tzlichem Logging<\/li>\n<\/ul>\n<p data-start=\"6630\" data-end=\"6679\">Ein Makefile k\u00f6nnte daf\u00fcr mehrere Ziele bekommen:<\/p>\n<pre data-start=\"6630\" data-end=\"6679\">flash-release: build\/release.bin\r\n\t$(ONEROM) program build\/release.bin\r\n\r\nflash-debug: build\/debug.bin\r\n\t$(ONEROM) program build\/debug.bin<\/pre>\n<p data-start=\"6833\" data-end=\"6908\">\ud83d\udc49 So kannst du gezielt genau die Variante flashen, die du gerade brauchst.<\/p>\n<hr data-start=\"6910\" data-end=\"6913\" \/>\n<h2 data-section-id=\"18759x9\" data-start=\"6915\" data-end=\"6945\">One ROM statt EPROM-Brenner<\/h2>\n<p data-start=\"6947\" data-end=\"7040\">Gerade an dieser Stelle merkt man, wie gro\u00df der Unterschied zur klassischen Arbeitsweise ist.<\/p>\n<p data-start=\"7042\" data-end=\"7049\">Fr\u00fcher:<\/p>\n<ul data-start=\"7051\" data-end=\"7134\">\n<li data-section-id=\"1pcyf0p\" data-start=\"7051\" data-end=\"7074\">Brenner anschlie\u00dfen<\/li>\n<li data-section-id=\"hh3fpg\" data-start=\"7075\" data-end=\"7092\">EPROM l\u00f6schen<\/li>\n<li data-section-id=\"1u02uzl\" data-start=\"7093\" data-end=\"7116\">EPROM programmieren<\/li>\n<li data-section-id=\"1enwjtj\" data-start=\"7117\" data-end=\"7134\">Chip wechseln<\/li>\n<\/ul>\n<p data-start=\"7136\" data-end=\"7142\">Heute:<\/p>\n<ul data-start=\"7144\" data-end=\"7171\">\n<li data-section-id=\"425cgq\" data-start=\"7144\" data-end=\"7160\"><code data-start=\"7146\" data-end=\"7158\">make flash<\/code><\/li>\n<li data-section-id=\"c2ttj7\" data-start=\"7161\" data-end=\"7171\">fertig<\/li>\n<\/ul>\n<p data-start=\"7173\" data-end=\"7257\">Das spart nicht nur Zeit, sondern auch mechanischen Verschlei\u00df an Sockeln und Chips.<\/p>\n<hr data-start=\"7259\" data-end=\"7262\" \/>\n<h2 data-section-id=\"1o42u2r\" data-start=\"7264\" data-end=\"7289\">Typische Stolperfallen<\/h2>\n<p data-start=\"7291\" data-end=\"7352\">Nat\u00fcrlich klappt auch so ein Workflow nicht immer auf Anhieb.<\/p>\n<h3 data-section-id=\"1uq9dmn\" data-start=\"7354\" data-end=\"7377\">Kein Ger\u00e4t gefunden<\/h3>\n<p data-start=\"7379\" data-end=\"7429\">Wenn <code data-start=\"7384\" data-end=\"7390\">scan<\/code> kein One ROM findet, liegt das oft an:<\/p>\n<ul data-start=\"7431\" data-end=\"7561\">\n<li data-section-id=\"1b10au\" data-start=\"7431\" data-end=\"7455\">schlechtem USB-Kabel<\/li>\n<li data-section-id=\"1p9mky3\" data-start=\"7456\" data-end=\"7480\">fehlender Verbindung<\/li>\n<li data-section-id=\"1h34osw\" data-start=\"7481\" data-end=\"7520\">einem noch ge\u00f6ffneten Web-Interface<\/li>\n<li data-section-id=\"8rtvsd\" data-start=\"7521\" data-end=\"7561\">mehreren angeschlossenen Testger\u00e4ten<\/li>\n<\/ul>\n<p data-start=\"7563\" data-end=\"7707\">Gerade der letzte Punkt ist wichtig:<br data-start=\"7599\" data-end=\"7602\" \/>Wenn mehrere Ger\u00e4te am Tisch liegen, sollte man sauber mit Seriennummern oder getrennten Setups arbeiten.<\/p>\n<hr data-start=\"7709\" data-end=\"7712\" \/>\n<h3 data-section-id=\"12legmi\" data-start=\"7714\" data-end=\"7742\">Falsches Binary geflasht<\/h3>\n<p data-start=\"7744\" data-end=\"7786\">Auch das passiert schneller als man denkt.<\/p>\n<p data-start=\"7788\" data-end=\"7810\">Deshalb lohnt es sich:<\/p>\n<ul data-start=\"7812\" data-end=\"7925\">\n<li data-section-id=\"1ih0vs2\" data-start=\"7812\" data-end=\"7849\">Ausgabedateien sauber zu benennen<\/li>\n<li data-section-id=\"13twgf0\" data-start=\"7850\" data-end=\"7887\">Release und Debug klar zu trennen<\/li>\n<li data-section-id=\"1hprgs6\" data-start=\"7888\" data-end=\"7925\">alte Builds regelm\u00e4\u00dfig zu l\u00f6schen<\/li>\n<\/ul>\n<hr data-start=\"7927\" data-end=\"7930\" \/>\n<h3 data-section-id=\"1xrdz8b\" data-start=\"7932\" data-end=\"7951\">Reset vergessen<\/h3>\n<p data-start=\"7953\" data-end=\"8045\">Nach dem Flashen muss das Zielsystem die neue Firmware nat\u00fcrlich auch wirklich neu einlesen.<\/p>\n<p data-start=\"8047\" data-end=\"8075\">Je nach Aufbau bedeutet das:<\/p>\n<ul data-start=\"8077\" data-end=\"8173\">\n<li data-section-id=\"6y2fmk\" data-start=\"8077\" data-end=\"8101\">Reset-Taster dr\u00fccken<\/li>\n<li data-section-id=\"rqwm2g\" data-start=\"8102\" data-end=\"8125\">Rechner neu starten<\/li>\n<li data-section-id=\"3ieqin\" data-start=\"8126\" data-end=\"8173\">Versorgung kurz aus- und wieder einschalten<\/li>\n<\/ul>\n<hr data-start=\"8175\" data-end=\"8178\" \/>\n<h2 data-section-id=\"16wywme\" data-start=\"8180\" data-end=\"8221\">Wo dieser Workflow besonders stark ist<\/h2>\n<p data-start=\"8223\" data-end=\"8258\">Das Ganze lohnt sich vor allem bei:<\/p>\n<ul data-start=\"8260\" data-end=\"8412\">\n<li data-section-id=\"v4wsii\" data-start=\"8260\" data-end=\"8282\">Eigenbau-Computern<\/li>\n<li data-section-id=\"1j29gxy\" data-start=\"8283\" data-end=\"8313\">8-Bit- und 16-Bit-Systemen<\/li>\n<li data-section-id=\"j7d7ka\" data-start=\"8314\" data-end=\"8352\">Monitor- oder Boot-ROM-Entwicklung<\/li>\n<li data-section-id=\"1273g0r\" data-start=\"8353\" data-end=\"8373\">Diagnosesoftware<\/li>\n<li data-section-id=\"1k058i2\" data-start=\"8374\" data-end=\"8412\">experimentellen Firmware-Versionen<\/li>\n<\/ul>\n<p data-start=\"8414\" data-end=\"8504\">\u00dcberall dort, wo h\u00e4ufig kleine \u00c4nderungen getestet werden, spart dieser Ablauf enorm Zeit.<\/p>\n<hr data-start=\"8506\" data-end=\"8509\" \/>\n<h2 data-section-id=\"likf30\" data-start=\"8511\" data-end=\"8545\">Praxistipp: erst klein anfangen<\/h2>\n<p data-start=\"8547\" data-end=\"8600\">Auch wenn die komplette Automatisierung reizvoll ist:<\/p>\n<p data-start=\"8602\" data-end=\"8636\">\ud83d\udc49 Am Anfang lieber klein starten.<\/p>\n<p data-start=\"8638\" data-end=\"8650\">Also zuerst:<\/p>\n<ul data-start=\"8652\" data-end=\"8755\">\n<li data-section-id=\"10oh610\" data-start=\"8652\" data-end=\"8678\">Binary sauber erzeugen<\/li>\n<li data-section-id=\"v9wd1c\" data-start=\"8679\" data-end=\"8706\">per CLI manuell flashen<\/li>\n<li data-section-id=\"32r26j\" data-start=\"8707\" data-end=\"8755\">danach Flash-Schritt ins Makefile \u00fcbernehmen<\/li>\n<\/ul>\n<p data-start=\"8757\" data-end=\"8835\">So l\u00e4sst sich jeder Schritt einzeln testen und Fehler sind leichter zu finden.<\/p>\n<hr data-start=\"8837\" data-end=\"8840\" \/>\n<h2 data-section-id=\"x8o1ad\" data-start=\"8842\" data-end=\"8850\">Fazit<\/h2>\n<p data-start=\"8852\" data-end=\"8979\">One ROM ist als EPROM-Ersatz nicht nur praktisch \u2013 mit CLI und Makefile wird daraus ein richtig angenehmer Entwickler-Workflow.<\/p>\n<p data-start=\"8981\" data-end=\"9001\">Die Kombination aus:<\/p>\n<ul data-start=\"9003\" data-end=\"9065\">\n<li data-section-id=\"4tfnqu\" data-start=\"9003\" data-end=\"9019\">Build-System<\/li>\n<li data-section-id=\"1p6gjve\" data-start=\"9020\" data-end=\"9035\">One ROM CLI<\/li>\n<li data-section-id=\"128vk3v\" data-start=\"9036\" data-end=\"9065\">schnellem Flashen per USB<\/li>\n<\/ul>\n<p data-start=\"9067\" data-end=\"9139\">macht aus einem fr\u00fcher eher m\u00fchsamen Prozess einen sehr direkten Ablauf.<\/p>\n<p data-start=\"9141\" data-end=\"9243\">\ud83d\udc49 Gerade f\u00fcr Firmware-Entwicklung an \u00e4lteren oder EPROM-basierten Systemen ist das ein echter Gewinn.<\/p>\n<hr data-start=\"9245\" data-end=\"9248\" \/>\n<h2 data-section-id=\"p7qrot\" data-start=\"9250\" data-end=\"9261\">Ausblick<\/h2>\n<p data-start=\"9263\" data-end=\"9318\">Ein sinnvoller n\u00e4chster Schritt w\u00e4re dann zum Beispiel:<\/p>\n<ul data-start=\"9320\" data-end=\"9461\">\n<li data-section-id=\"1pe60ei\" data-start=\"9320\" data-end=\"9369\">mehrere Firmware-Versionen parallel verwalten<\/li>\n<li data-section-id=\"1oww0j4\" data-start=\"9370\" data-end=\"9402\">automatische Vergleichstests<\/li>\n<li data-section-id=\"wvhdzd\" data-start=\"9403\" data-end=\"9461\">ein Setup mit Debug- und Release-ROM im selben One ROM<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>One ROM \u2013 Praxis: Entwickler-Workflow mit Makefile und automatischem Flash per CLI Im letzten Beitrag ging es darum, One ROM als EPROM-Ersatz f\u00fcr schnelle Firmware-Tests zu verwenden.Diesmal gehen wir noch einen Schritt weiter: \ud83d\udc49 Wie sieht ein wirklich praxisnaher Entwickler-Workflow &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?p=5357\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[133],"tags":[340,342],"class_list":["post-5357","post","type-post","status-publish","format-standard","hentry","category-hardware","tag-one-rom","tag-one-rom-cli"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5357"}],"version-history":[{"count":3,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5357\/revisions"}],"predecessor-version":[{"id":5360,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5357\/revisions\/5360"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}