diff --git a/assets/cortex-m-layers.svg b/assets/cortex-m-layers.svg new file mode 100644 index 0000000000000000000000000000000000000000..8998168cba48f74273fc20a369b736a050970972 --- /dev/null +++ b/assets/cortex-m-layers.svg @@ -0,0 +1,352 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="800" + height="240" + viewBox="0 0 211.66666 63.5" + version="1.1" + id="svg8" + inkscape:version="0.92.1 r" + sodipodi:docname="multitask.svg"> + <defs + id="defs2" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.98994949" + inkscape:cx="-8.2091291" + inkscape:cy="337.09993" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + units="px" + inkscape:window-width="1920" + inkscape:window-height="1080" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-233.49998)"> + <rect + style="fill:#a8b3cd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect875-6" + width="66.145836" + height="31.749998" + x="105.83334" + y="249.37497" /> + <rect + id="rect10" + width="66.145836" + height="31.75" + x="39.6875" + y="-281.12497" + style="fill:#ffd1aa;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="scale(1,-1)" /> + <flowRoot + xml:space="preserve" + id="flowRoot855" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:25px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + transform="matrix(0.26458333,0,0,0.26458333,0,138.24998)"><flowRegion + id="flowRegion857"><rect + id="rect859" + width="253.54829" + height="54.548237" + x="-44.446712" + y="110.07602" /></flowRegion><flowPara + id="flowPara861" /></flowRoot> <rect + style="fill:#526491;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect875-7" + width="52.916664" + height="15.874998" + x="119.0625" + y="249.37498" /> + <rect + style="fill:#67989a;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect907" + width="132.29167" + height="15.874999" + x="39.6875" + y="233.49998" /> + <g + aria-label="f3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819-35"> + <path + d="m 143.93921,254.09514 c -0.92287,0 -1.6256,0.51647 -1.6256,1.33774 v 0.889 h -1.05833 v 0.56726 h 1.05833 v 3.54754 h 0.71967 v -3.54754 h 1.43086 l 0.0762,-0.56726 h -1.50706 v -0.90594 c 0,-0.49106 0.31326,-0.7366 0.93133,-0.7366 0.33867,0 0.66887,0.0593 0.95673,0.18627 l 0.2286,-0.5334 c -0.34713,-0.14393 -0.72813,-0.23707 -1.21073,-0.23707 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4812" /> + <path + d="m 147.81364,254.51001 c -0.60114,0 -1.15994,0.2032 -1.65947,0.67733 l 0.38947,0.4318 c 0.38946,-0.3556 0.7366,-0.5334 1.23613,-0.5334 0.61807,0 1.10067,0.34714 1.10067,0.98214 0,0.70273 -0.54187,1.016 -1.10067,1.016 h -0.34713 l -0.0847,0.56726 h 0.4826 c 0.69427,0 1.21073,0.27094 1.21073,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47413,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47413,0.38946 c 0.44027,0.5334 1.13453,0.77047 1.78647,0.77047 1.21073,0 2.02353,-0.762 2.02353,-1.76953 0,-0.90594 -0.64347,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13453,-0.65193 1.13453,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78646,-1.46473 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4814" /> + </g> + <g + aria-label="cortex-m" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458302px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819"> + <path + d="m 55.152861,272.75569 c -0.770466,0 -1.329266,-0.49953 -1.329266,-1.69333 0,-1.17687 0.550333,-1.74414 1.3208,-1.74414 0.397933,0 0.770466,0.13547 1.151466,0.38947 l 0.347134,-0.46567 c -0.414867,-0.34713 -0.9144,-0.52493 -1.490134,-0.52493 -1.329266,0 -2.099733,1.00753 -2.099733,2.34527 0,1.397 0.762,2.30293 2.099733,2.30293 0.516467,0 1.1176,-0.2032 1.4986,-0.5334 l -0.338666,-0.46567 c -0.338667,0.2286 -0.7112,0.38947 -1.159934,0.38947 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4753" /> + <path + d="m 59.907821,268.71709 c -1.253067,0 -1.9304,0.95673 -1.9304,2.32833 0,1.40547 0.668866,2.31987 1.921933,2.31987 1.2446,0 1.921933,-0.95673 1.921933,-2.32833 0,-1.40547 -0.6604,-2.31987 -1.913466,-2.31987 z m 0,0.5842 c 0.762,0 1.142999,0.5588 1.142999,1.73567 0,1.1938 -0.380999,1.74413 -1.151466,1.74413 -0.770467,0 -1.151467,-0.55033 -1.151467,-1.73567 0,-1.18533 0.389467,-1.74413 1.159934,-1.74413 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4755" /> + <path + d="m 66.296846,268.71709 c -0.804333,0 -1.261533,0.42333 -1.6002,1.15147 l -0.135466,-1.05834 h -1.236133 v 0.55034 h 0.702733 v 3.36126 h -0.702733 v 0.55034 h 2.319866 v -0.55034 H 64.73898 v -1.8796 c 0.287866,-0.98213 0.778933,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95674 h 0.575734 l 0.1016,-1.51554 c -0.194734,-0.0508 -0.381,-0.0931 -0.626534,-0.0931 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4757" /> + <path + d="m 71.906939,273.04356 -0.2794,-0.4826 c -0.237067,0.127 -0.524933,0.21166 -0.855133,0.21166 -0.6096,0 -0.855134,-0.26246 -0.855134,-0.75353 v -2.65007 h 1.456267 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.024466 v 0.5588 h 1.024466 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423334,0 0.889,-0.11853 1.202267,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4759" /> + <path + d="m 74.003365,271.29096 h 2.9972 c 0.0085,-0.0931 0.01693,-0.2286 0.01693,-0.381 0,-1.35467 -0.694266,-2.19287 -1.820333,-2.19287 -1.185333,0 -1.938867,0.98213 -1.938867,2.32833 0,1.38854 0.7366,2.31987 2.040467,2.31987 0.550333,0 1.109133,-0.19473 1.524,-0.51647 l -0.3302,-0.47413 c -0.397933,0.26247 -0.7366,0.39793 -1.1938,0.39793 -0.6858,0 -1.261533,-0.44873 -1.2954,-1.48166 z m 1.202267,-1.98967 c 0.677333,0 1.100666,0.49107 1.1176,1.4478 h -2.319867 c 0.05927,-0.98213 0.541867,-1.4478 1.202267,-1.4478 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4761" /> + <path + d="m 78.953058,273.27216 1.227666,-1.91347 1.227667,1.91347 h 0.8636 l -1.642533,-2.3876 1.447799,-2.07434 h -0.821266 l -1.0414,1.65947 -1.032933,-1.65947 h -0.846667 l 1.4478,2.1082 -1.642533,2.35374 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4763" /> + <path + d="m 83.589484,271.26556 h 3.386666 v -0.6096 h -3.386666 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4765" /> + <path + d="m 91.604111,268.71709 c -0.448733,0 -0.7366,0.23707 -0.982133,0.59267 -0.135467,-0.4572 -0.465667,-0.59267 -0.804333,-0.59267 -0.448734,0 -0.728134,0.27093 -0.9652,0.61807 l -0.0508,-0.52494 h -0.550334 v 4.46194 h 0.651934 v -3.46287 c 0.245533,-0.381 0.499533,-0.5334 0.778933,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.245534,-0.381 0.508,-0.5334 0.778934,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.651933 v -3.31894 c 0,-1.02446 -0.4318,-1.23613 -0.8636,-1.23613 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4767" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + x="85.486809" + y="296.99997" + id="text819-3-9"><tspan + sodipodi:role="line" + id="tspan817-6-3" + x="85.486809" + y="296.99997" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332">HARDWARE</tspan></text> + <rect + style="fill:#d79f6e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect873" + height="10.583332" + x="42.333332" + y="275.83331" + width="60.854164" /> + <g + aria-label="cortex-m-rt" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819-3"> + <path + d="m 47.664817,283.339 c -0.770467,0 -1.329267,-0.49953 -1.329267,-1.69333 0,-1.17687 0.550333,-1.74413 1.3208,-1.74413 0.397933,0 0.770467,0.13546 1.151466,0.38946 l 0.347134,-0.46566 c -0.414867,-0.34714 -0.9144,-0.52494 -1.490133,-0.52494 -1.329267,0 -2.099734,1.00754 -2.099734,2.34527 0,1.397 0.762,2.30293 2.099734,2.30293 0.516466,0 1.117599,-0.2032 1.498599,-0.5334 l -0.338666,-0.46566 c -0.338667,0.2286 -0.7112,0.38946 -1.159933,0.38946 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4770" /> + <path + d="m 52.419776,279.3004 c -1.253067,0 -1.9304,0.95674 -1.9304,2.32834 0,1.40546 0.668867,2.31986 1.921933,2.31986 1.2446,0 1.921933,-0.95673 1.921933,-2.32833 0,-1.40547 -0.6604,-2.31987 -1.913466,-2.31987 z m 0,0.5842 c 0.762,0 1.143,0.5588 1.143,1.73567 0,1.1938 -0.381,1.74413 -1.151467,1.74413 -0.770466,0 -1.151466,-0.55033 -1.151466,-1.73566 0,-1.18534 0.389466,-1.74414 1.159933,-1.74414 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4772" /> + <path + d="m 58.808802,279.3004 c -0.804334,0 -1.261534,0.42334 -1.6002,1.15147 l -0.135467,-1.05833 h -1.236133 v 0.55033 h 0.702733 v 3.36127 h -0.702733 v 0.55033 h 2.319866 v -0.55033 h -0.905933 v -1.8796 c 0.287867,-0.98214 0.778933,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95673 h 0.575733 l 0.1016,-1.51553 c -0.194733,-0.0508 -0.381,-0.0931 -0.626533,-0.0931 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4774" /> + <path + d="m 64.418894,283.62687 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21167 -0.855133,0.21167 -0.6096,0 -0.855133,-0.26247 -0.855133,-0.75354 v -2.65006 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00754 h -1.024467 v 0.5588 h 1.024467 v 2.65853 c 0,0.77893 0.541866,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4776" /> + <path + d="m 66.51532,281.87427 h 2.9972 c 0.0085,-0.0931 0.01693,-0.2286 0.01693,-0.381 0,-1.35467 -0.694266,-2.19287 -1.820333,-2.19287 -1.185333,0 -1.938866,0.98214 -1.938866,2.32834 0,1.38853 0.7366,2.31986 2.040466,2.31986 0.550334,0 1.109133,-0.19473 1.524,-0.51646 l -0.3302,-0.47414 c -0.397933,0.26247 -0.7366,0.39794 -1.1938,0.39794 -0.6858,0 -1.261533,-0.44874 -1.2954,-1.48167 z m 1.202267,-1.98967 c 0.677333,0 1.100666,0.49107 1.1176,1.4478 H 66.51532 c 0.05927,-0.98213 0.541867,-1.4478 1.202267,-1.4478 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4778" /> + <path + d="m 71.465013,283.85547 1.227666,-1.91347 1.227667,1.91347 h 0.8636 l -1.642533,-2.3876 1.4478,-2.07433 h -0.821267 l -1.0414,1.65946 -1.032933,-1.65946 h -0.846667 l 1.4478,2.1082 -1.642533,2.35373 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4780" /> + <path + d="m 76.101439,281.84887 h 3.386666 v -0.6096 h -3.386666 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4782" /> + <path + d="m 84.116066,279.3004 c -0.448733,0 -0.736599,0.23707 -0.982133,0.59267 -0.135466,-0.4572 -0.465666,-0.59267 -0.804333,-0.59267 -0.448733,0 -0.728133,0.27094 -0.9652,0.61807 l -0.0508,-0.52493 h -0.550333 v 4.46193 H 81.4152 v -3.46287 c 0.245533,-0.381 0.499533,-0.5334 0.778933,-0.5334 0.321734,0 0.347134,0.2286 0.347134,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.245533,-0.381 0.507999,-0.5334 0.778933,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.651933 v -3.31893 c 0,-1.02447 -0.4318,-1.23614 -0.8636,-1.23614 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4784" /> + <path + d="m 86.254824,281.84887 h 3.386666 v -0.6096 h -3.386666 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4786" /> + <path + d="m 94.345648,279.3004 c -0.804333,0 -1.261533,0.42334 -1.6002,1.15147 l -0.135467,-1.05833 h -1.236133 v 0.55033 h 0.702733 v 3.36127 h -0.702733 v 0.55033 h 2.319867 v -0.55033 h -0.905934 v -1.8796 c 0.287867,-0.98214 0.778934,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95673 h 0.575733 l 0.1016,-1.51553 c -0.194733,-0.0508 -0.381,-0.0931 -0.626533,-0.0931 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4788" /> + <path + d="m 99.955742,283.62687 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21167 -0.855133,0.21167 -0.6096,0 -0.855133,-0.26247 -0.855133,-0.75354 v -2.65006 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00754 h -1.024467 v 0.5588 h 1.024467 v 2.65853 c 0,0.77893 0.541866,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4790" /> + </g> + <g + aria-label="stm32f30x" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819-7"> + <path + d="m 118.35396,275.82061 c -0.52494,0 -0.99907,-0.19473 -1.3462,-0.4826 l -0.39794,0.46567 c 0.381,0.3302 0.93134,0.60113 1.74414,0.60113 0.94826,0 1.87113,-0.37253 1.87113,-1.32927 0,-0.82973 -0.57573,-1.13453 -1.4478,-1.3716 -0.89747,-0.24553 -1.17687,-0.381 -1.17687,-0.7874 0,-0.33866 0.254,-0.5842 0.9652,-0.5842 0.57574,0 0.95674,0.1778 1.28694,0.4064 l 0.32173,-0.49106 c -0.381,-0.27094 -0.90593,-0.49107 -1.6256,-0.49107 -1.00753,0 -1.69333,0.47413 -1.69333,1.2192 0,0.77893 0.60113,1.05833 1.524,1.28693 0.94826,0.23707 1.07526,0.44874 1.07526,0.84667 0,0.4318 -0.41486,0.7112 -1.10066,0.7112 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4793" /> + <path + d="m 125.45418,276.08308 -0.2794,-0.4826 c -0.23706,0.127 -0.52493,0.21166 -0.85513,0.21166 -0.6096,0 -0.85513,-0.26246 -0.85513,-0.75353 v -2.65007 h 1.45626 l 0.0931,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.02447 v 0.5588 h 1.02447 v 2.65854 c 0,0.77893 0.54186,1.33773 1.4986,1.33773 0.42333,0 0.889,-0.11853 1.20226,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4795" /> + <path + d="m 129.92128,271.75661 c -0.44874,0 -0.7366,0.23707 -0.98214,0.59267 -0.13546,-0.4572 -0.46566,-0.59267 -0.80433,-0.59267 -0.44873,0 -0.72813,0.27093 -0.9652,0.61807 l -0.0508,-0.52494 h -0.55033 v 4.46194 h 0.65193 v -3.46287 c 0.24553,-0.381 0.49953,-0.5334 0.77893,-0.5334 0.32174,0 0.34714,0.2286 0.34714,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.24553,-0.381 0.508,-0.5334 0.77893,-0.5334 0.32173,0 0.34713,0.2286 0.34713,0.79587 v 3.2004 h 0.65194 v -3.31894 c 0,-1.02446 -0.4318,-1.23613 -0.8636,-1.23613 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4797" /> + <path + d="m 133.4909,270.38501 c -0.60113,0 -1.15993,0.2032 -1.65946,0.67733 l 0.38946,0.4318 c 0.38947,-0.3556 0.7366,-0.5334 1.23614,-0.5334 0.61806,0 1.10066,0.34714 1.10066,0.98214 0,0.70273 -0.54186,1.016 -1.10066,1.016 h -0.34714 l -0.0847,0.56726 h 0.4826 c 0.69426,0 1.21073,0.27094 1.21073,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47413,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47413,0.38946 c 0.44026,0.5334 1.13453,0.77047 1.78646,0.77047 1.21074,0 2.02354,-0.762 2.02354,-1.76953 0,-0.90594 -0.64347,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13453,-0.65193 1.13453,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78647,-1.46473 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4799" /> + <path + d="m 138.5676,270.38501 c -0.7874,0 -1.3208,0.2794 -1.778,0.8382 l 0.49106,0.381 c 0.37254,-0.4318 0.6858,-0.61807 1.25307,-0.61807 0.65193,0 1.04987,0.39794 1.04987,1.04987 0,0.94827 -0.47414,1.59173 -2.67547,3.69993 v 0.57574 h 3.47133 l 0.0847,-0.6096 h -2.7432 c 1.92193,-1.7526 2.60773,-2.6162 2.60773,-3.69147 0,-0.92287 -0.6604,-1.6256 -1.76106,-1.6256 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4801" /> + <path + d="m 144.84655,269.97014 c -0.92286,0 -1.6256,0.51647 -1.6256,1.33774 v 0.889 h -1.05833 v 0.56726 h 1.05833 v 3.54754 h 0.71967 v -3.54754 h 1.43087 l 0.0762,-0.56726 h -1.50707 v -0.90594 c 0,-0.49106 0.31327,-0.7366 0.93133,-0.7366 0.33867,0 0.66887,0.0593 0.95674,0.18627 l 0.2286,-0.5334 c -0.34714,-0.14393 -0.72814,-0.23707 -1.21074,-0.23707 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4803" /> + <path + d="m 148.72098,270.38501 c -0.60113,0 -1.15993,0.2032 -1.65947,0.67733 l 0.38947,0.4318 c 0.38947,-0.3556 0.7366,-0.5334 1.23613,-0.5334 0.61807,0 1.10067,0.34714 1.10067,0.98214 0,0.70273 -0.54187,1.016 -1.10067,1.016 h -0.34713 l -0.0847,0.56726 h 0.4826 c 0.69427,0 1.21074,0.27094 1.21074,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47414,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47414,0.38946 c 0.44027,0.5334 1.13454,0.77047 1.78647,0.77047 1.21073,0 2.02353,-0.762 2.02353,-1.76953 0,-0.90594 -0.64346,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13454,-0.65193 1.13454,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78647,-1.46473 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4805" /> + <path + d="m 154.06014,270.38501 c -1.25307,0 -1.905,1.07527 -1.905,3.00567 0,1.93886 0.65193,3.01413 1.905,3.01413 1.25307,0 1.905,-1.07527 1.905,-3.01413 0,-1.9304 -0.65193,-3.00567 -1.905,-3.00567 z m 0,0.57573 c 0.72813,0 1.15993,0.7112 1.15993,2.42994 0,1.7272 -0.4318,2.4384 -1.15993,2.4384 -0.71967,0 -1.15993,-0.7112 -1.15993,-2.4384 0,-1.71874 0.44026,-2.42994 1.15993,-2.42994 z m 0,1.8796 c -0.31327,0 -0.55033,0.24554 -0.55033,0.55034 0,0.31326 0.23706,0.5588 0.55033,0.5588 0.32173,0 0.5588,-0.24554 0.5588,-0.5588 0,-0.3048 -0.23707,-0.55034 -0.5588,-0.55034 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4807" /> + <path + d="m 157.88377,276.31168 1.22766,-1.91347 1.22767,1.91347 h 0.8636 l -1.64253,-2.3876 1.4478,-2.07434 h -0.82127 l -1.0414,1.65947 -1.03293,-1.65947 h -0.84667 l 1.4478,2.1082 -1.64253,2.35374 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4809" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 39.6875,288.7979 H 171.97917" + id="path4629" + inkscape:connector-curvature="0" /> + <rect + id="rect10-0" + width="52.916664" + height="15.874999" + x="39.6875" + y="-265.24997" + style="fill:#86c98a;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="scale(1,-1)" /> + <g + aria-label="???" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819-6"> + <path + d="m 61.115704,254.30258 c -0.677333,0 -1.278466,0.26247 -1.769533,0.8382 l 0.499534,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202266,-0.62653 0.567267,0 0.999067,0.2794 0.999067,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532466,-1.04987 1.532466,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186266,4.88527 c -0.321733,0 -0.567267,0.254 -0.567267,0.56726 0,0.32174 0.245534,0.56727 0.567267,0.56727 0.3302,0 0.567266,-0.24553 0.567266,-0.56727 0,-0.31326 -0.237066,-0.56726 -0.567266,-0.56726 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4746" /> + <path + d="m 66.192397,254.30258 c -0.677333,0 -1.278467,0.26247 -1.769533,0.8382 l 0.499533,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202267,-0.62653 0.567266,0 0.999066,0.2794 0.999066,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532467,-1.04987 1.532467,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186267,4.88527 c -0.321733,0 -0.567266,0.254 -0.567266,0.56726 0,0.32174 0.245533,0.56727 0.567266,0.56727 0.3302,0 0.567267,-0.24553 0.567267,-0.56727 0,-0.31326 -0.237067,-0.56726 -0.567267,-0.56726 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4748" /> + <path + d="m 71.26909,254.30258 c -0.677334,0 -1.278467,0.26247 -1.769534,0.8382 l 0.499534,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202266,-0.62653 0.567267,0 0.999067,0.2794 0.999067,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532467,-1.04987 1.532467,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186267,4.88527 c -0.321733,0 -0.567267,0.254 -0.567267,0.56726 0,0.32174 0.245534,0.56727 0.567267,0.56727 0.3302,0 0.567267,-0.24553 0.567267,-0.56727 0,-0.31326 -0.237067,-0.56726 -0.567267,-0.56726 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4750" /> + </g> + <g + aria-label="Multitask app" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" + id="text819-9" + transform="translate(5.1317439,9.2643738e-6)"> + <path + d="M 72.379284,237.97884 H 71.34635 l -0.905933,3.99627 -0.948267,-3.99627 h -1.024466 l -0.3302,5.83354 h 0.694267 l 0.152399,-3.048 c 0.04233,-0.72814 0.03387,-1.78647 0.01693,-2.1082 l 1.049866,4.10633 h 0.7366 l 0.982134,-4.10633 c 0,0.28786 0,1.30386 0.0508,2.1082 l 0.1778,3.048 h 0.7112 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4721" + inkscape:connector-curvature="0" /> + <path + d="m 74.518043,239.35044 h -0.7112 v 3.24274 c 0,0.82973 0.423333,1.31233 1.286933,1.31233 0.524934,0 1.075267,-0.24553 1.430867,-0.69427 l 0.05927,0.60114 h 0.6096 v -4.46194 h -0.7112 v 3.28507 c -0.245534,0.381 -0.719667,0.7112 -1.210734,0.7112 -0.516466,0 -0.753533,-0.254 -0.753533,-0.82973 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4723" + inkscape:connector-curvature="0" /> + <path + d="m 80.627669,237.55551 h -2.0828 v 0.56727 h 1.3716 v 4.55506 c 0,0.77047 0.5334,1.22767 1.3208,1.22767 0.4572,0 0.821267,-0.1016 1.058333,-0.2286 l -0.186266,-0.51647 c -0.245534,0.0931 -0.4826,0.1524 -0.745067,0.1524 -0.4318,0 -0.7366,-0.16086 -0.7366,-0.60113 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4725" + inkscape:connector-curvature="0" /> + <path + d="m 87.507761,243.58378 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21166 -0.855133,0.21166 -0.6096,0 -0.855133,-0.26246 -0.855133,-0.75353 v -2.65007 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.024467 v 0.5588 h 1.024467 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4727" + inkscape:connector-curvature="0" /> + <path + d="m 90.730254,237.26764 c -0.3048,0 -0.508,0.21167 -0.508,0.49954 0,0.28786 0.2032,0.49953 0.508,0.49953 0.313267,0 0.524933,-0.21167 0.524933,-0.49953 0,-0.28787 -0.211666,-0.49954 -0.524933,-0.49954 z m 0.567267,2.0828 h -2.040467 v 0.56727 h 1.329267 v 3.3274 h -1.3716 v 0.56727 h 3.335866 v -0.56727 h -1.253066 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4729" + inkscape:connector-curvature="0" /> + <path + d="m 97.661147,243.58378 -0.2794,-0.4826 c -0.237067,0.127 -0.524934,0.21166 -0.855134,0.21166 -0.6096,0 -0.855133,-0.26246 -0.855133,-0.75353 v -2.65007 h 1.456267 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 H 93.93581 v 0.5588 h 1.024467 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202267,-0.32173 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4731" + inkscape:connector-curvature="0" /> + <path + d="m 102.39071,242.83871 v -2.14207 c 0,-0.88053 -0.5588,-1.43933 -1.66794,-1.43933 -0.44026,0 -0.914397,0.0847 -1.464731,0.2794 l 0.194734,0.54187 c 0.4572,-0.16087 0.863597,-0.2286 1.159937,-0.2286 0.6604,0 1.05833,0.23706 1.05833,0.889 v 0.36406 h -0.6604 c -1.346201,0 -2.082801,0.51647 -2.082801,1.43087 0,0.82973 0.541867,1.3716 1.439331,1.3716 0.57574,0 1.07527,-0.21167 1.397,-0.62653 0.11854,0.4064 0.4318,0.5842 0.8128,0.635 l 0.1778,-0.508 c -0.254,-0.0762 -0.36406,-0.21167 -0.36406,-0.56727 z m -1.84574,0.5334 c -0.584197,0 -0.855131,-0.28787 -0.855131,-0.84667 0,-0.57573 0.355601,-0.93133 1.337731,-0.93133 h 0.64347 v 1.143 c -0.26247,0.39793 -0.6858,0.635 -1.12607,0.635 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4733" + inkscape:connector-curvature="0" /> + <path + d="m 105.791,243.32131 c -0.52493,0 -0.99907,-0.19473 -1.3462,-0.4826 l -0.39793,0.46567 c 0.381,0.3302 0.93133,0.60113 1.74413,0.60113 0.94827,0 1.87113,-0.37253 1.87113,-1.32927 0,-0.82973 -0.57573,-1.13453 -1.4478,-1.3716 -0.89746,-0.24553 -1.17686,-0.381 -1.17686,-0.7874 0,-0.33866 0.254,-0.5842 0.9652,-0.5842 0.57573,0 0.95673,0.1778 1.28693,0.4064 l 0.32173,-0.49106 c -0.381,-0.27094 -0.90593,-0.49107 -1.6256,-0.49107 -1.00753,0 -1.69333,0.47413 -1.69333,1.2192 0,0.77893 0.60113,1.05833 1.524,1.28693 0.94827,0.23707 1.07527,0.44874 1.07527,0.84667 0,0.4318 -0.41487,0.7112 -1.10067,0.7112 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4735" + inkscape:connector-curvature="0" /> + <path + d="m 110.10569,237.47084 -0.7112,0.0847 v 6.25687 h 0.7112 z m 2.9718,1.8796 h -0.9144 l -1.9812,2.02354 2.19287,2.4384 h 0.9398 l -2.2352,-2.44687 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4737" + inkscape:connector-curvature="0" /> + <path + d="m 122.69748,242.83871 v -2.14207 c 0,-0.88053 -0.5588,-1.43933 -1.66794,-1.43933 -0.44026,0 -0.9144,0.0847 -1.46473,0.2794 l 0.19473,0.54187 c 0.4572,-0.16087 0.8636,-0.2286 1.15994,-0.2286 0.6604,0 1.05833,0.23706 1.05833,0.889 v 0.36406 h -0.6604 c -1.3462,0 -2.0828,0.51647 -2.0828,1.43087 0,0.82973 0.54187,1.3716 1.43933,1.3716 0.57574,0 1.07527,-0.21167 1.397,-0.62653 0.11854,0.4064 0.4318,0.5842 0.8128,0.635 l 0.1778,-0.508 c -0.254,-0.0762 -0.36406,-0.21167 -0.36406,-0.56727 z m -1.84574,0.5334 c -0.5842,0 -0.85513,-0.28787 -0.85513,-0.84667 0,-0.57573 0.3556,-0.93133 1.33773,-0.93133 h 0.64347 v 1.143 c -0.26247,0.39793 -0.6858,0.635 -1.12607,0.635 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4739" + inkscape:connector-curvature="0" /> + <path + d="m 126.5719,239.25731 c -0.5334,0 -1.00753,0.26247 -1.32926,0.71967 l -0.0593,-0.62654 h -0.6096 v 6.25687 l 0.7112,-0.0847 v -2.12513 c 0.3048,0.33867 0.69427,0.508 1.18533,0.508 1.15994,0 1.71874,-0.97367 1.71874,-2.32833 0,-1.397 -0.4318,-2.31987 -1.61714,-2.31987 z m -0.16933,0.57573 c 0.70273,0 1.016,0.5842 1.016,1.74414 0,1.18533 -0.37253,1.73566 -1.10913,1.73566 -0.42334,0 -0.7874,-0.21166 -1.02447,-0.5588 v -2.2098 c 0.24553,-0.3556 0.62653,-0.7112 1.1176,-0.7112 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4741" + inkscape:connector-curvature="0" /> + <path + d="m 131.64859,239.25731 c -0.5334,0 -1.00753,0.26247 -1.32926,0.71967 l -0.0593,-0.62654 h -0.6096 v 6.25687 l 0.7112,-0.0847 v -2.12513 c 0.3048,0.33867 0.69427,0.508 1.18533,0.508 1.15994,0 1.71874,-0.97367 1.71874,-2.32833 0,-1.397 -0.4318,-2.31987 -1.61714,-2.31987 z m -0.16933,0.57573 c 0.70273,0 1.016,0.5842 1.016,1.74414 0,1.18533 -0.37253,1.73566 -1.10913,1.73566 -0.42334,0 -0.7874,-0.21166 -1.02447,-0.5588 v -2.2098 c 0.24553,-0.3556 0.62653,-0.7112 1.1176,-0.7112 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332" + id="path4743" + inkscape:connector-curvature="0" /> + </g> + </g> +</svg> diff --git a/assets/vscode-build.png b/assets/vscode-build.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1ad1db0fbeb5fc2578bcaf373fb08964112c36 Binary files /dev/null and b/assets/vscode-build.png differ diff --git a/assets/vscode-debug.png b/assets/vscode-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..d76847733ee38fa0ca5cc8d34e0777d633806f21 Binary files /dev/null and b/assets/vscode-debug.png differ diff --git a/doc/Quickstart.md b/doc/Quickstart.md new file mode 100644 index 0000000000000000000000000000000000000000..d1ba92cd5421dd7d47896376c3f1c96e17e401b3 --- /dev/null +++ b/doc/Quickstart.md @@ -0,0 +1,639 @@ +# Quickstart: a template for Cortex-M development + +## Abstraction layers + + + +- `cortex-m` is a crate that provides an API to use functionality common to all Cortex-M + microcontrollers. + +- `stm32f30x` is a *device crate*. It provides an API to access the hardware of a device. This crate + is automatically generated from a [SVD file][svd] and provides a low level API to manipulate + registers. + +[svd]: https://github.com/posborne/cmsis-svd/blob/master/data/STMicro/STM32F103xx.svd + +- `f3` is a *board support crate*. It provides a higher level API (`Serial`, `I2C`, etc.) tailored + to a specific development board. + +- `cortex-m-rt` is a minimal "runtime" that handles initialization of RAM and provides the default + exception handling behavior. It is also gives your program the required memory layout. + +- `???` is a concurrency framework that we'll introduce in a later lecture. + +## Dependencies for development + +- `arm-none-eabi-ld`, linker + +- `arm-none-eabi-gdb`, debugger + +- `openocd`, for flashing / debugging the device + +- `xargo`, for compiling the `core` crate. Xargo is a Cargo wrapper -- it has the exact same UI. + Xargo takes care of building the `core` crate and linking it to your program / library. + +- And other handy Cargo subcommands + +### Linux + +- Arch Linux + +``` console +$ sudo pacman -Sy arm-none-eabi-{ld,gdb} openocd +``` + +### macOS + +``` console +$ brew cask install gcc-arm-embedded +$ brew install openocd +``` + +If the brew cask command doesn't work (Error: Unknown command: cask), then run `brew tap +Caskroom/tap` first and try again. + +### Windows + +Installers below + +- [`arm-none-eabi` toolchain](https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q3-update/+download/gcc-arm-none-eabi-5_4-2016q3-20160926-win32.exe) + +- [OpenOCD](http://sysprogs.com/files/gnutoolchains/arm-eabi/openocd/OpenOCD-20170821.7z). Unzip to + your C (system) drive + +## All + +``` console +$ # we have to use the nightly channel for embedded development +$ rustup default nightly + +$ cargo install cargo-clone xargo +``` + +## Demo + +In the first part of the demo we'll use command line tools in the terminal then we'll transition to +the Visual Studio Code IDE. It's a good idea to get familiar with the command line tools. The IDE is +nice because it calls these tools with the right arguments for you but when things go south it pays +off to understand what the IDE is doing under the hood. + +### Creating a new project + +These steps will give you a minimal Cortex-M project. If you run into any problem running these +commands check out the [troubleshooting guide][troubleshoot]. + +[troubleshoot]: https://docs.rs/cortex-m-quickstart/0.2.1/cortex_m_quickstart/#troubleshooting + +``` console +$ # fetch the Cargo project template +$ cargo clone cortex-m-quickstart + +$ # rename it as you wish +$ mv cortex-m-quickstart app + +$ cd app + +$ # Cargo.toml.orig has a nicer format so let's use that instead of the reformatted one +$ mv Cargo.toml{.orig,} + +$ # update the crate name and author +$ $EDITOR Cargo.toml +$ cat Cargo.toml +[package] +authors = ["Jorge Aparicio <jorge@japaric.io>"] +name = "app" +version = "0.1.0" + +[dependencies] +cortex-m = "0.3.0" +cortex-m-semihosting = "0.2.0" + +[dependencies.cortex-m-rt] +features = ["abort-on-panic"] +version = "0.3.3" + +[profile.release] +debug = true +lto = true + +$ # we need to specify the memory layout of the device +$ $EDITOR memory.x + +$ # for the blue-pill you should have +$ cat memory.x +MEMORY +{ + /* NOTE K = KiBi = 1024 bytes */ + FLASH : ORIGIN = 0x08000000, LENGTH = 64K + RAM : ORIGIN = 0x20000000, LENGTH = 20K +} + +$ # for the NUCLEO-F401RE you should have +$ cat memory.x +{ + /* NOTE K = KiBi = 1024 bytes */ + FLASH : ORIGIN = 0x08000000, LENGTH = 512K + RAM : ORIGIN = 0x20000000, LENGTH = 96K +} +``` + +### Hello world + +Let's start with the hello world example: + +``` console +$ rm -rf src +$ mkdir src +$ cp examples/hello.rs src/main.rs +``` + +This is the hello world program. You can ignore the `INTERRUPTS` + `default_handler` part -- that's +a generic interrupt table that we'll remove later. + +``` rust +#![feature(used)] +#![no_std] + +extern crate cortex_m; +extern crate cortex_m_rt; +extern crate cortex_m_semihosting; + +use core::fmt::Write; + +use cortex_m::asm; +use cortex_m_semihosting::hio; + +fn main() { + // get a handle to the *host* standard output + let mut stdout = hio::hstdout().unwrap(); + + // write "Hello, world!" to it + writeln!(stdout, "Hello, world!").unwrap(); +} + +// As we are not using interrupts, we just register a dummy catch all handler +#[link_section = ".vector_table.interrupts"] +#[used] +static INTERRUPTS: [extern "C" fn(); 240] = [default_handler; 240]; + +extern "C" fn default_handler() { + asm::bkpt(); +} +``` + +The new thing here is the `#![no_std]` attribute. This indicates that this program will *not* link +to the `std`, standard, crate. Instead it will link to the `core` crate. The `core` crate is a +subset of the `std` crate that has no dependencies to OS mechanisms like threads, dynamic memory +allocation, sockets, etc. `core` provides the minimal amount of support to run Rust on a bare metal +system. + +### Build and analyze + +Let's build this: + +``` console +$ # NOTE use `thumbv7m-none-eabi` for the blue-pill, and `thumbv7em-none-eabihf` for the nucleo +$ xargo build --target thumbv7m-none-eabi +``` + +> The `thumbv7m-none-eabi` target corresponds to the Cortex-M3 architecture. The +> `thumbv7em-none-eabihf` target corresponds to the Cortex-M4F architecture -- note the "F": this +> means that the architecture has hardware support for floating point operations). + +This produces an unoptimized binary. + +``` console +$ # mind the target name (use thumbv7em-none-eabihf for the nucleo) +$ arm-none-eabi-size target/thumbv7m-none-eabi/debug/app + text data bss dec hex filename + 14596 0 0 14596 3904 target/thumbv7m-none-eabi/debug/app +``` + +Let's rebuild in release mode. To avoid repeating myself I'll create a `$TARGET` variable that +contains the name of the target. + +``` console +$ TARGET=thumbv7m-none-eabi + +$ xargo build --target $TARGET --release +``` + +Now the binary is much smaller. + +``` console +$ arm-none-eabi-size target/$TARGET/release/app + text data bss dec hex filename + 3646 0 0 3646 e3e target/thumbv7m-none-eabi/release/app +``` + +You can get a breakdown of the memory usage by passing the `-Ax` flag: + +``` console +$ arm-none-eabi-size -Ax target/$TARGET/debug/app +section size addr +.vector_table 0x400 0x8000000 +.text 0x27f8 0x8000400 +.rodata 0xd0c 0x8002c00 +.bss 0x0 0x20000000 +.data 0x0 0x20000000 +``` + +`.bss` and `.data` are statically allocated (`static`) variables; there are none in this program. +`.text` holds the program code. `.rodata` are constants, usually you'll find strings like our +"Hello, world!" in this section. `.vector_table` is a region of memory that holds the vector table. + +> **Exercise** Do you remember the start address of the Flash memory and RAM? (hint: memory.x) Which +> sections are located in Flash memory? Which sections are located in RAM? + +Another interesting thing to do here is to look at the disassembly of the program: + +``` console +$ arm-none-eabi-objdump -CD target/$TARGET/release/app +Disassembly of section .vector_table: + +08000000 <_svector_table>: + 8000000: 20005000 andcs r5, r0, r0 + +08000004 <cortex_m_rt::RESET_VECTOR>: + 8000004: 08000401 stmdaeq r0, {r0, sl} + +08000008 <EXCEPTIONS>: + 8000008: 08000639 stmdaeq r0, {r0, r3, r4, r5, r9, sl} + (..) + +Disassembly of section .text: + +08000400 <cortex_m_rt::reset_handler>: + 8000400: b580 push {r7, lr} + 8000402: 466f mov r7, sp + 8000404: b088 sub sp, #32 + 8000406: f240 0000 movw r0, #0 + 800040a: f240 0100 movw r1, #0 + 800040e: f2c2 0000 movt r0, #8192 ; 0x2000 + 8000412: f2c2 0100 movt r1, #8192 ; 0x2000 + 8000416: 4281 cmp r1, r0 + (..) + +08000638 <BUS_FAULT>: + 8000638: f3ef 8008 mrs r0, MSP + 800063c: f7ff bffa b.w 8000634 <cortex_m_rt::default_handler> + (..) + +Disassembly of section .rodata: + +08000d44 <vtable.8>: + 8000d44: 080004cb stmdaeq r0, {r0, r1, r3, r6, r7, sl} + 8000d48: 00000004 andeq r0, r0, r4 + 8000d4c: 00000004 andeq r0, r0, r4 + 8000d50: 080005e9 stmdaeq r0, {r0, r3, r5, r6, r7, r8, sl} + (..) +``` + +> **Exercise** Compare the contents of the `.vector_table` linker section, see above (or look at +> your local output), to the diagram of the vector table in the [ARM documentation][vector_table]. +> What are the values of the "Initial SP value", "Reset", "NMI", "Hard fault" entries according to +> the disassembly? What do these values mean? Investigate how these values are used in the boot +> process and the exception handling mechanism. + +[vector_table]: https://developer.arm.com/docs/dui0552/latest/the-cortex-m3-processor/exception-model/vector-table + +If you are curious about how the program ended with this particular memory layout look at the linker +scripts in the `target` directory -- these scripts instruct the linker where to place things. + +``` console +$ # list of linker scripts +$ find target -name '*.x' +target/thumbv7m-none-eabi/release/build/app-4c6a87e0e5f739ae/out/memory.x +target/thumbv7m-none-eabi/release/build/cortex-m-rt-4f13cf879b7980df/out/link.x +``` + +You can also visualize the exact linker command `rustc` used to link the binary by running the +following command: + +``` console +$ xargo rustc --target $TARGET --release -- -Z print-link-args +"arm-none-eabi-ld" "-L" (..) +``` + +### Flash and debug + +To flash the program into the microcontroller we must first start OpenOCD. OpenOCD will connect to +the SWD programmer (built into the NUCLEO-F401RE board; for the blue-pill you'll need an external +one) and start a GDB server. + +``` console +$ # for the blue-pill +$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg + +$ # for the NUCLE-F401RE +$ openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg +``` + +You should see some output like this: + +``` console +Open On-Chip Debugger 0.10.0 +Licensed under GNU GPL v2 +For bug reports, read + http://openocd.org/doc/doxygen/bugs.html +Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'. +Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD +adapter speed: 2000 kHz +adapter_nsrst_delay: 100 +none separate +Info : Unable to match requested speed 2000 kHz, using 1800 kHz +Info : Unable to match requested speed 2000 kHz, using 1800 kHz +Info : clock speed 1800 kHz +Info : STLINK v2 JTAG v27 API v2 SWIM v15 VID 0x0483 PID 0x374B +Info : using stlink api v2 +Info : Target voltage: 3.268993 +Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints +``` + +You should definitively get the last line -- maybe with some different numbers -- if you don't that +indicates a problem: it could be a connection problem, or you could have used the wrong +configuration file. + +The program will block. That's OK. Leave it running. + +Apart from the GDB server OpenOCD also starts a telnet server. You can connect to this server and +issue commands to the SWD programmer. + +``` console +$ telnet localhost 4444 + +> # this is the telnet propmt + +> # the following command will reset the microcontroller and halt the processor + +> reset halt +adapter speed: 1800 kHz +target halted due to debug-request, current mode: Thread +xPSR: 0x01000000 pc: 0x08000188 msp: 0x20018000 + +> exit +``` + +The documentation of these commands is [here][openocd-commands]. + +[openocd-commands]: http://openocd.org/doc/html/General-Commands.html + +With OpenOCD working now we can flash and debug the program using GDB. + +``` console +$ # enable .gdbinit files +$ echo 'add-auto-load-safe-path /' >> ~/.gdbinit + +$ arm-none-eabi-gdb target/$TARGET/debug/app + +(gdb) # this is the GDB shell +``` + +The processor will be halted at the entry point. You can print the source code that the processor is +about to execute using the `list` command: + +``` console +(gdb) # source code +(gdb) list +331 /// +332 /// This is the entry point of all programs +333 #[cfg(target_arch = "arm")] +334 #[link_section = ".reset_handler"] +335 unsafe extern "C" fn reset_handler() -> ! { +336 r0::zero_bss(&mut _sbss, &mut _ebss); +337 r0::init_data(&mut _sdata, &mut _edata, &_sidata); +338 +339 match () { +340 #[cfg(not(has_fpu))] +``` + +We can skip to our program `main` by creating a breakpoint and then calling `continue`. + +``` console +(gdb) break app::main +Breakpoint 1 at 0x800045c: file src/main.rs, line 18. + +(gdb) continue +Continuing. +Note: automatically using hardware breakpoints for read-only addresses. + +Breakpoint 1, app::main () at src/main.rs:18 +18 let mut stdout = hio::hstdout().unwrap(); +``` + +We are now in `main` we can execute each line of code in this function be repeatedly calling the +`next` command. + +``` console +(gdb) next +19 writeln!(stdout, "Hello, world!").unwrap(); + +(gdb) next +20 } +``` + +After executing `writeln!` you should see "Hello, world!" printed *on the OpenOCD console*. + +``` console +$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg +(..) +Info : halted: PC: 0x08000aee +Hello, world! +Info : halted: PC: 0x0800049c +(..) +``` + +One more thing we can do here is to reset the microcontroller using the `monitor` command. `monitor` +will forward the command to the telnet server. + +``` console +(gdb) monitor reset halt +target halted due to debug-request, current mode: Thread +xPSR: 0x01000000 pc: 0x08000400 msp: 0x20005000, semihosting +``` + +This is the same command we ran before from the `telnet` prompt. + +You can find the list of all the GDB commands [here][gdb-commands]. + +Note that semihosting is *very slow*. Each write operation takes *hundreds* of milliseconds; the +processor will be in a halted state for the duration of the write operation. Semihosting is nice +because it requires no extra wiring or stream but it's only appropriate for simple programs where +timing is not a concern. + +### Device specific program + +Let's replace that weird `INTERRUPTS` + `default_handler` with something proper. Change +`src/main.rs` to: + +``` rust +#![no_std] + +extern crate cortex_m_semihosting; +extern crate stm32f103xx; // heads up! use `stm32f40x` for the NUCLEO-401RE + +use core::fmt::Write; + +use cortex_m_semihosting::hio; + +fn main() { + // get a handle to the *host* standard output + let mut stdout = hio::hstdout().unwrap(); + + // write "Hello, world!" to it + writeln!(stdout, "Hello, world!").unwrap(); +} +``` + +What we have done here is replace the *generic* vector table with one tailored for the device we +are targeting. Note that `cortex-m-rt` is gone; that crate is now provided by the device crate. + +Before we can compile this we have to tell Cargo where to get the device crate from. This info goes +in the Cargo.toml file: + +``` console +$ $EDITOR Cargo.toml + +$ cat Cargo.toml +# .. + +# for the blue-pill (NOTE use this dependency or the other but not both) +[dependencies.stm32f103xx] +features = ["rt"] # this feature indicates that the device crate will provide the vector table +version = "0.7.5" + +# for the blue-pill (NOTE use this dependency or the other but not both) +[dependencies.stm32f40x] +features = ["rt"] # see comment above +git = "https://gitlab.henriktjader.com/pln/STM32F40x" + +# .. +``` + +You should now be able to compile the program again. + +``` console +$ xargo build --target $TARGET --release + +$ arm-none-eabi-size -Ax target/$TARGET/release/app +section size addr +.vector_table 0x130 0x8000000 +.text 0x944 0x8000130 +.rodata 0xfc 0x8000a74 +.bss 0x0 0x20000000 +.data 0x0 0x20000000 +``` + +If you are careful observer you probably have noticed that the `.vector_table` is now smaller. +All the interrupts of a device are listed in the vector table and each device has a different number +of interrupts thus the size of the vector table will vary according to the device. + +In the original program we were using a "generic" vector table that assumed that the device had 240 +interrupts -- that's the maximum number of interrupts a device can have but devices usually have way +less interrupts. + +### Bonus: setting a default target + +So far we have always been calling Xargo with the `--target` flag. We can skip that by setting a +default target in `.cargo/config`. + +``` console +$ cat >>.cargo/config <<EOF +[build] +target = "$TARGET" +EOF +``` + +Now you can build your program by simply calling `xargo build` or `xargo build --release`. + +## Transitioning to Visual Code Studio + +> **NOTE** Here I assume that you have already installed the [vscode-rust] plugin. + +[vscode-rust]: https://github.com/editor-rs/vscode-rust + +First some cleanup: + +- Terminate any open GDB clients connected to the OpenOCD GDB server. + +- Terminate the OpenOCD process. + +- Remove, or rename, the local `.gdbinit` file. + +Now open the `app` folder with VSCode. + +``` console +$ code . +``` + +### Formatting + +You can enable format on save by adding `"editor.formatOnSave": true` to the User settings which you +can open hitting `Ctrl + ,` + +### Build task + +You make the build task work with Cortex-M projects you'll have to tweak the default build task. +Pick from the menu: `Tasks > Configure Tasks...` then pick `Rust: cargo build`. In `tasks.json` +write: + +``` js +{ + "version": "2.0.0", + "tasks": [ + { + "type": "shell", + "taskName": "xargo build", + "command": "xargo", + "args": [ + "build" + ], + "problemMatcher": [ + "$rustc" + ] + } + ] +} +``` + +Now pick from the menu: `Tasks > Configure Default Build Task...` and pick `xargo build`. + +Now you should be able to build your project by picking `Tasks > Run Build Task...` from the menu or +by hitting the shorcut `Ctrl + Shift + B`. + + + +### Debugging + +You'll need to configure Native Debug to work with embedded projects. Pick `Debug > Open +Configurations` from the menu, pick `GDB` from the drop down menu and then write this into +`launch.json`. + +``` js +{ + "configurations": [ + { + "autorun": [ + "monitor arm semihosting enable", + "load", + "break app::main" // Heads up: crate name + ], + "cwd": "${workspaceRoot}", + "gdbpath": "arm-none-eabi-gdb", + "executable": "./target/thumbv7m-none-eabi/debug/app", // Heads up: target name + "name": "Debug", + "remote": true, + "request": "attach", + "target": ":3333", + "type": "gdb" + } + ], + "version": "0.2.0" +} +``` + +Now you should be able to debug your program by pressing `F5`. Note that (a) you have to build the +program first (e.g. by pressing `Ctrl + Shift + B`) and that (b) the debugger will execute your +program right after flashing the device so you'll always need at least one breakpoint. + +