diff --git a/20171109/es-20171109.pdf b/20171109/es-20171109.pdf index 338358f02eb66f98401067d8e18a973ac968d565..49ad1b3758f02c3d46d60ad04840d11d1e593d49 100644 Binary files a/20171109/es-20171109.pdf and b/20171109/es-20171109.pdf differ diff --git a/20171109/es-20171109.tex b/20171109/es-20171109.tex index 2ab58f85cecc457c753d8bf3b4960cb0fb41b180..00de850716866cf946deb15cbed875388e0d2e99 100644 --- a/20171109/es-20171109.tex +++ b/20171109/es-20171109.tex @@ -219,7 +219,7 @@ \medskip - synchron + asynchron \begin{itemize} \item \emph{keine\/} Taktleitung für Abgleich, wann Daten anliegen @@ -306,9 +306,9 @@ seriell \begin{itemize} \item - \newterm{MISO\/}: Master Out, Slave In + \newterm{MOSI\/}: Master Out, Slave In \item - \newterm{MOSI\/}: Master In, Slave Out + \newterm{MISO\/}: Master In, Slave Out \item \newterm{SCLK\/}: Taktleitung (Clock) \item diff --git a/20171116/I2C_data_transfer.pdf b/20171116/I2C_data_transfer.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d5b8a241c624391cbf6f3a30f26320559358e1d Binary files /dev/null and b/20171116/I2C_data_transfer.pdf differ diff --git a/20171116/I2C_data_transfer.svg b/20171116/I2C_data_transfer.svg new file mode 100644 index 0000000000000000000000000000000000000000..4dba5a7e2ac2388dd69e52c8da66667716ed66f8 --- /dev/null +++ b/20171116/I2C_data_transfer.svg @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="840" + height="140" + id="svg2"> + <defs + id="defs4" /> + <g + transform="translate(-416.4952,-467.9166)" + style="display:inline" + id="layer2"> + <rect + width="40" + height="95" + x="483.14081" + y="479.86218" + style="opacity:1;fill:#fc0;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect3673" /> + <rect + width="40" + height="95" + x="588.14081" + y="479.86218" + style="opacity:1;fill:#3771c8;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect8102" /> + <rect + width="40" + height="95" + x="648.14081" + y="479.86218" + style="opacity:1;fill:#aad400;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect8104" /> + <rect + width="40" + height="95" + x="708.14081" + y="479.86218" + style="opacity:1;fill:#3771c8;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect8991" /> + <rect + width="40" + height="95" + x="768.14081" + y="479.86218" + style="opacity:1;fill:#aad400;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect9898" /> + <rect + width="40" + height="95" + x="1003.1408" + y="479.86218" + style="opacity:1;fill:#aad400;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect12566" /> + <rect + width="40" + height="95" + x="1168.1409" + y="479.86218" + style="opacity:1;fill:#fc0;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect14346" /> + <rect + width="40" + height="95" + x="828.14081" + y="479.86218" + style="opacity:1;fill:#3771c8;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect14348" /> + <rect + width="40" + height="95" + x="943.14081" + y="479.86218" + style="opacity:1;fill:#3771c8;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect14350" /> + <rect + width="40" + height="95" + x="1063.1409" + y="479.86218" + style="opacity:1;fill:#3771c8;fill-opacity:0.78431373;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" + id="rect14352" /> + </g> + <g + transform="translate(-416.4952,-467.9166)" + style="opacity:1;display:inline" + id="layer1"> + <path + d="M 468.14082,489.86218 L 498.14082,489.86218 L 508.14082,514.86218 L 603.14082,514.86218 L 613.14082,489.86218 L 723.14082,489.86218 L 733.14082,514.86218 L 843.14082,514.86218 L 853.14082,489.86218 L 893.14082,489.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path1872" /> + <path + d="M 468.14082,539.86218 L 572.89082,540.11218 L 583.14082,564.86218 L 633.14082,564.86218 L 643.39082,539.61218 L 693.39082,539.61218 L 703.39082,564.61218 L 753.39082,564.61218 L 763.39082,539.61218 L 813.39082,539.61218 L 823.14082,564.86218 L 873.14082,564.86218 L 883.14082,539.86218 L 893.14082,539.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2780" /> + <path + d="M 468.14082,489.86218 L 443.14082,489.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 2;stroke-dashoffset:0;stroke-opacity:1" + id="path2782" /> + <path + d="M 608.57609,500.90013 L 613.57609,515.90013 L 723.14082,514.86218 C 733.14082,489.86218 733.14082,489.86218 733.14082,489.86218 L 843.14082,489.86218 L 853.14082,514.86218 L 893.14082,514.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path9011" /> + <path + d="M 892.20309,514.86218 L 918.90804,514.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1" + id="path9903" /> + <path + d="M 892.20309,489.86218 L 919.24904,489.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1" + id="path9905" /> + <path + d="M 892.20309,539.86218 C 900.53643,539.86218 910.48947,539.86218 918.8228,539.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 2;stroke-dashoffset:0;stroke-opacity:1" + id="path9907" /> + <path + d="M 918.14082,539.86218 L 928.14082,539.86218 L 938.14082,564.86218 L 988.14082,564.86218 L 998.14082,539.86218 L 1048.1408,539.86218 L 1058.1408,564.86218 L 1108.1408,564.86218 L 1118.1408,539.86218 L 1243.1408,539.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path11679" /> + <path + d="M 1243.1408,489.86218 L 1218.1408,489.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6, 2;stroke-dashoffset:0;stroke-opacity:1" + id="path12572" /> + <path + d="M 918.14082,514.86218 L 958.14082,514.86218 L 968.14082,489.86218 L 1078.1408,489.86218 L 1088.1408,514.86218 L 1183.1408,514.86218 L 1193.1408,489.86218 L 1218.1408,489.86218" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path12570" /> + <path + d="M 918.14082,489.86218 L 958.14082,489.86218 L 968.14082,514.86218 L 1078.1408,514.86218 L 1082.6831,500.9039" + style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path12568" /> + <text + x="428.36386" + y="506.65417" + style="font-size:6px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + id="text17011" + xml:space="preserve"><tspan + x="428.36386" + y="506.65417" + style="font-size:12px;font-style:normal;font-weight:bold" + id="tspan17013">SDA</tspan></text> + <text + x="429.19003" + y="556.52917" + style="font-size:6px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + id="text17019" + xml:space="preserve"><tspan + x="429.19003" + y="556.52917" + style="font-size:12px;font-style:normal;font-weight:bold" + id="tspan17021">SCL</tspan></text> + </g> + <g + transform="translate(-395.1819,-35.5544)" + id="layer3"> + <text + x="1158.5015" + y="163.23318" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#ffd737;fill-opacity:1;stroke:black;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" + id="text25013" + xml:space="preserve"><tspan + x="1158.5015" + y="163.23318" + style="font-size:24px;font-weight:bold;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none" + id="tspan25015">P</tspan></text> + <text + x="473.97595" + y="163.52615" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#ffd737;fill-opacity:1;stroke:black;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" + id="text24124" + xml:space="preserve"><tspan + x="473.97595" + y="163.52615" + style="font-size:24px;font-weight:bold;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none" + id="tspan24126">S</tspan></text> + <text + x="633.73474" + y="163.23318" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#bcdd37;fill-opacity:1;stroke:black;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" + id="text25021" + xml:space="preserve"><tspan + x="633.73474" + y="163.23318" + style="font-size:24px;font-weight:bold;fill:#bcdd37;fill-opacity:1;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none" + id="tspan25023">B<tspan + style="font-size:18px" + id="tspan25029">1</tspan></tspan></text> + <text + x="752.724" + y="163.23318" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#bcdd37;fill-opacity:1;stroke:black;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" + id="text25031" + xml:space="preserve"><tspan + x="752.724" + y="163.23318" + style="font-size:24px;font-weight:bold;fill:#bcdd37;fill-opacity:1;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none" + id="tspan25033">B<tspan + style="font-size:18px" + id="tspan25045">2</tspan></tspan></text> + <text + x="986.49792" + y="163.23318" + style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#bcdd37;fill-opacity:1;stroke:black;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" + id="text25037" + xml:space="preserve"><tspan + x="986.49792" + y="163.23318" + style="font-size:24px;font-weight:bold;fill:#bcdd37;fill-opacity:1;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none" + id="tspan25039">B<tspan + style="font-size:18px" + id="tspan25043">N</tspan></tspan></text> + </g> +</svg> diff --git a/20171116/RS-232_timing-no-text.png b/20171116/RS-232_timing-no-text.png new file mode 100644 index 0000000000000000000000000000000000000000..eb877b4e33bfb87f6a3230c82373db9f7470344d Binary files /dev/null and b/20171116/RS-232_timing-no-text.png differ diff --git a/20171116/Retribution_Engine_Screenshot_120807.jpg b/20171116/Retribution_Engine_Screenshot_120807.jpg new file mode 120000 index 0000000000000000000000000000000000000000..19f4cb3e4aae1e24c3466a25b2c0e5ad90ee49e7 --- /dev/null +++ b/20171116/Retribution_Engine_Screenshot_120807.jpg @@ -0,0 +1 @@ +../common/Retribution_Engine_Screenshot_120807.jpg \ No newline at end of file diff --git a/20171116/SPI_single_slave.pdf b/20171116/SPI_single_slave.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f724dad4a8ed23b262b0b1c672bf85b72405155 Binary files /dev/null and b/20171116/SPI_single_slave.pdf differ diff --git a/20171116/SPI_single_slave.svg b/20171116/SPI_single_slave.svg new file mode 100644 index 0000000000000000000000000000000000000000..b20e01c319aaa346f92e8921a37b5cf2c88ef19d --- /dev/null +++ b/20171116/SPI_single_slave.svg @@ -0,0 +1,293 @@ +<?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://web.resource.org/cc/" + 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="305pt" + height="95pt" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/cburnett/wikipedia/images/electronics" + sodipodi:docname="SPI single slave.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <marker + inkscape:stockid="TriangleInL" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleInL" + style="overflow:visible"> + <path + id="path2502" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(-0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mend" + style="overflow:visible;"> + <path + id="path2585" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" + transform="scale(0.4) rotate(180)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Mstart" + style="overflow:visible"> + <path + id="path2588" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.4)" /> + </marker> + <marker + inkscape:stockid="TriangleOutL" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleOutL" + style="overflow:visible"> + <path + id="path2493" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3298" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(-1.1,0,0,-1.1,5.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3316" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3319" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(0.8,0.8)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="4" + inkscape:cx="177.79428" + inkscape:cy="27.981633" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="976" + inkscape:window-height="962" + inkscape:window-x="0" + inkscape:window-y="31" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g1994"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96931434px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 140.09375,31.34375 L 140.09375,32.3125 C 185.02221,32.3125 207.48663,32.3125 218.71875,32.3125 C 224.33481,32.3125 227.12724,32.3125 228.53125,32.3125 C 229.23326,32.3125 229.5745,32.3125 229.75,32.3125 C 229.83775,32.3125 229.88431,32.3125 229.90625,32.3125 C 229.91722,32.3125 229.93476,32.3125 229.9375,32.3125 L 229.9375,31.84375 L 229.9375,31.34375 C 229.9375,31.34375 229.95068,31.343751 140.09375,31.34375 z " + id="path3144" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77545147pt;marker-start:none" + d="M 234.41172,31.830319 L 227.70407,35.707576 L 227.70407,27.953062 L 234.41172,31.830319 z " + id="path2000" /> + </g> + <g + id="g2002"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96867871px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 140.09375,46.9375 L 140.09375,47.90625 C 184.96331,47.90625 207.37636,47.90625 218.59375,47.90625 C 224.20245,47.90625 227.00408,47.90625 228.40625,47.90625 C 229.10734,47.90625 229.48098,47.90625 229.65625,47.90625 C 229.74389,47.90625 229.79059,47.90625 229.8125,47.90625 L 229.8125,47.4375 L 229.8125,46.9375 C 229.8125,46.9375 229.83288,46.937499 140.09375,46.9375 z " + id="path3330" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77494297pt;marker-start:none" + d="M 234.29035,47.433902 L 227.58709,51.308617 L 227.58709,43.559187 L 234.29035,47.433902 z " + id="path2008" /> + </g> + <g + id="g2018"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96931434px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 140.09375,78.15625 L 140.09375,79.125 C 185.02221,79.124999 207.48663,79.125 218.71875,79.125 C 224.33481,79.125 227.12724,79.125 228.53125,79.125 C 229.23326,79.125 229.5745,79.125 229.75,79.125 C 229.83775,79.125 229.88431,79.125 229.90625,79.125 C 229.91722,79.125 229.93476,79.125 229.9375,79.125 L 229.9375,78.65625 L 229.9375,78.15625 C 229.9375,78.15625 229.95068,78.156247 140.09375,78.15625 z " + id="path3334" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77545147pt;marker-start:none" + d="M 234.41172,78.641034 L 227.70407,82.518291 L 227.70407,74.763777 L 234.41172,78.641034 z " + id="path2024" /> + </g> + <g + id="g2010"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00844264px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 145.75,63.4375 L 145.75,64.46875 C 190.60367,64.468751 213.03658,64.46875 224.25,64.46875 C 229.85671,64.46875 232.66082,64.46875 234.0625,64.46875 C 234.76334,64.46875 235.10604,64.46875 235.28125,64.46875 C 235.36885,64.46875 235.4156,64.46875 235.4375,64.46875 C 235.44845,64.46875 235.46601,64.46875 235.46875,64.46875 L 235.46875,63.9375 L 235.46875,63.4375 C 235.46875,63.4375 235.45733,63.437501 145.75,63.4375 z " + id="path2783" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.80675411pt;marker-start:none" + d="M 141.09578,63.949224 L 148.0742,59.915453 L 148.0742,67.982995 L 141.09578,63.949224 z " + id="path2016" /> + </g> + <g + id="g2395"> + <rect + y="19.101088" + x="21.676456" + height="72.187675" + width="118.28313" + id="rect1307" + style="fill:#ffc2a1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text2182" + y="52.045509" + x="46.81802" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="52.045509" + x="46.81802" + id="tspan2184" + sodipodi:role="line">SPI</tspan><tspan + id="tspan2186" + y="67.045509" + x="46.81802" + sodipodi:role="line">Master</tspan></text> + <text + id="text3061" + y="37.057228" + x="92.818016" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="37.057228" + x="92.818016" + id="tspan3063" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3065" + y="52.057228" + x="92.818016" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3067" + y="67.057228" + x="92.818016" + sodipodi:role="line">MISO</tspan><tspan + id="tspan3069" + y="82.057228" + x="92.818016" + sodipodi:role="line">SS</tspan></text> + <path + id="path2341" + d="M 93.8125,71.0625 L 107.03125,71.0625" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g2374"> + <rect + y="19.101088" + x="235.67645" + height="72.187675" + width="118.28313" + id="rect3084" + style="fill:#b9e179;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text3086" + y="52.045509" + x="328.81802" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="52.045509" + x="328.81802" + id="tspan3088" + sodipodi:role="line">SPI</tspan><tspan + id="tspan3090" + y="67.045509" + x="328.81802" + sodipodi:role="line">Slave</tspan></text> + <text + id="text3092" + y="37.057228" + x="244.81802" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="37.057228" + x="244.81802" + id="tspan3094" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3096" + y="52.057228" + x="244.81802" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3098" + y="67.057228" + x="244.81802" + sodipodi:role="line">MISO</tspan><tspan + id="tspan3100" + y="82.057228" + x="244.81802" + sodipodi:role="line">SS</tspan></text> + <path + id="path2343" + d="M 245.39063,71.0625 L 258.60938,71.0625" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/20171116/SPI_three_slaves.pdf b/20171116/SPI_three_slaves.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b67dc94c790a62935c7b353449e2ce8c75a7d9fe Binary files /dev/null and b/20171116/SPI_three_slaves.pdf differ diff --git a/20171116/SPI_three_slaves.svg b/20171116/SPI_three_slaves.svg new file mode 100644 index 0000000000000000000000000000000000000000..c24a19730fd4bcd4b0305e255fadc772cca5ceeb --- /dev/null +++ b/20171116/SPI_three_slaves.svg @@ -0,0 +1,546 @@ +<?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://web.resource.org/cc/" + 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="290pt" + height="230pt" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/cburnett/wikipedia/images/electronics" + sodipodi:docname="SPI three slaves.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible"> + <path + id="path2570" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(0.6,0,0,0.6,-3,0)" /> + </marker> + <marker + inkscape:stockid="TriangleInL" + orient="auto" + refY="0" + refX="0" + id="TriangleInL" + style="overflow:visible"> + <path + id="path2502" + d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" /> + </marker> + <marker + inkscape:stockid="TriangleOutL" + orient="auto" + refY="0" + refX="0" + id="TriangleOutL" + style="overflow:visible"> + <path + id="path2493" + d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(0.8,0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lstart" + style="overflow:visible"> + <path + id="path2576" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(1.1,0,0,1.1,-5.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3298" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(-1.1,0,0,-1.1,5.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3316" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3319" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(0.8,0.8)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2" + inkscape:cx="210.40651" + inkscape:cy="140.60009" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="976" + inkscape:window-height="962" + inkscape:window-x="0" + inkscape:window-y="31" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2202"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,25 L 131.25,25.96875 C 176.07915,25.96875 198.51146,25.96875 209.71875,25.96875 C 215.32239,25.96875 218.13034,25.96875 219.53125,25.96875 C 220.23171,25.96875 220.57489,25.96875 220.75,25.96875 C 220.83756,25.96875 220.88436,25.96875 220.90625,25.96875 L 220.90625,25.5 L 220.90625,25 C 220.90625,25 220.90829,25 131.25,25 z " + id="path3144" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,25.497581 L 218.6888,29.37055 L 218.6888,21.624612 L 225.38904,25.497581 z " + id="path2208" /> + </g> + <g + id="g2210"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,40.625 L 131.25,41.59375 C 176.07915,41.593749 198.51146,41.59375 209.71875,41.59375 C 215.32239,41.59375 218.13034,41.59375 219.53125,41.59375 C 220.23171,41.59375 220.57489,41.59375 220.75,41.59375 C 220.83756,41.59375 220.88436,41.59375 220.90625,41.59375 L 220.90625,41.09375 L 220.90625,40.625 C 220.90625,40.625 220.90829,40.624998 131.25,40.625 z " + id="path3330" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,41.101164 L 218.6888,44.974133 L 218.6888,37.228195 L 225.38904,41.101164 z " + id="path2216" /> + </g> + <g + id="g2226"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,71.8125 L 131.25,72.78125 C 176.07915,72.78125 198.51146,72.78125 209.71875,72.78125 C 215.32239,72.78125 218.13034,72.78125 219.53125,72.78125 C 220.23171,72.78125 220.57489,72.78125 220.75,72.78125 C 220.83756,72.78125 220.88436,72.78125 220.90625,72.78125 L 220.90625,72.3125 L 220.90625,71.8125 C 220.90625,71.8125 220.90829,71.8125 131.25,71.8125 z " + id="path3334" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,72.308296 L 218.6888,76.181265 L 218.6888,68.435327 L 225.38904,72.308296 z " + id="path2232" /> + </g> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2607" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-12.09375,-18)" /> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2609" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-23.59098,-2.4645)" /> + <g + id="g2254"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02442479px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.03125,85.34375 L 131.03125,86.375 L 162.53125,86.375 L 162.53125,162.375 L 162.53125,162.875 L 163.03125,162.875 L 220.5,162.875 L 220.5,161.84375 L 163.53125,161.84375 L 163.53125,85.875 L 163.53125,85.34375 L 163.03125,85.34375 L 131.03125,85.34375 z " + id="path2677" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.81953983pt;marker-start:none" + d="M 225.21856,162.36218 L 218.12955,166.45988 L 218.12955,158.26448 L 225.21856,162.36218 z " + id="path2260" /> + </g> + <g + id="g2262"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.0245285px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.03125,100.46875 L 131.03125,101.5 L 145.9375,101.5 L 145.9375,252.46875 L 145.9375,253 L 146.4375,253 L 220.65625,253 L 220.65625,251.96875 L 146.9375,251.96875 L 146.9375,100.96875 L 146.9375,100.46875 L 146.4375,100.46875 L 131.03125,100.46875 z " + id="path2679" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.8196228pt;marker-start:none" + d="M 225.38937,252.47886 L 218.29964,256.57697 L 218.29964,248.38075 L 225.38937,252.47886 z " + id="path2268" /> + </g> + <g + id="g2242"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.0321871px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 185.625,41.0625 L 185.625,132.4375 L 185.625,132.96875 L 186.15625,132.96875 L 220.78125,132.96875 L 220.78125,131.9375 L 186.65625,131.9375 L 186.65625,41.0625 L 185.625,41.0625 z " + id="path2687" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.82574968pt;marker-start:none" + d="M 225.55987,132.44748 L 218.41713,136.57623 L 218.41713,128.31873 L 225.55987,132.44748 z " + id="path2248" /> + </g> + <g + id="g2234"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04614723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 197.09375,25.5 L 197.09375,117.40625 L 197.09375,117.9375 L 197.625,117.9375 L 220.65625,117.9375 L 220.65625,116.90625 L 198.15625,116.90625 L 198.15625,25.5 L 197.09375,25.5 z " + id="path2689" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.83691778pt;marker-start:none" + d="M 225.48174,117.42146 L 218.2424,121.60605 L 218.2424,113.23687 L 225.48174,117.42146 z " + id="path2240" /> + </g> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 174.25,56.375 L 174.25,147.875 L 174.25,148.375 L 174.75,148.375 L 226.5,148.375 L 226.5,147.375 L 175.25,147.375 L 175.25,56.375 L 174.25,56.375 z " + id="path2691" /> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99764985px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 174.25,148.375 L 174.25,239.125 L 174.25,239.625 L 174.75,239.625 L 226.75,239.625 L 226.75,238.625 L 175.25,238.625 L 175.25,148.375 L 174.25,148.375 z " + id="path2693" /> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2695" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-34.89167,13.09186)" /> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2697" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-34.78125,104.5938)" /> + <g + id="g2274"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02505863px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 185.6875,132.28125 L 185.6875,223.5 L 185.6875,224 L 186.1875,224 L 220.5625,224 L 220.5625,222.96875 L 186.71875,222.96875 L 186.71875,132.28125 L 185.6875,132.28125 z " + id="path2699" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.8200469pt;marker-start:none" + d="M 225.28696,223.48748 L 218.19355,227.58771 L 218.19355,219.38725 L 225.28696,223.48748 z " + id="path2280" /> + </g> + <g + id="g2282"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.03560543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 197.1875,117.25 L 197.1875,208.09375 L 197.1875,208.625 L 197.6875,208.625 L 220.4375,208.625 L 220.4375,207.59375 L 198.21875,207.59375 L 198.21875,117.25 L 197.1875,117.25 z " + id="path2701" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.82848434pt;marker-start:none" + d="M 225.22445,208.10791 L 218.05807,212.25033 L 218.05807,203.96549 L 225.22445,208.10791 z " + id="path2288" /> + </g> + <g + id="g2218"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.98819256px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 136.71875,56.375 L 136.71875,57.375 C 181.77434,57.375 204.2986,57.375 215.5625,57.375 C 221.19445,57.375 223.99826,57.375 225.40625,57.375 C 226.11024,57.375 226.449,57.375 226.625,57.375 C 226.713,57.375 226.75925,57.375 226.78125,57.375 C 226.79225,57.375 226.80975,57.375 226.8125,57.375 L 226.8125,56.875 L 226.8125,56.375 C 226.8125,56.375 226.82993,56.375 136.71875,56.375 z " + id="path2789" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.79055405pt;marker-start:none" + d="M 132.14357,56.869228 L 138.98187,52.916458 L 138.98187,60.821998 L 132.14357,56.869228 z " + id="path2224" /> + </g> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2567" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-23.48829,88.96704)" /> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2569" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-12.01454,73.9631)" /> + <g + id="g2794"> + <rect + y="12.917446" + x="12.858437" + height="100.88948" + width="118.28313" + id="rect1307" + style="fill:#ffc2a1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.88664234px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text2182" + y="60.212772" + x="38" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="60.212772" + x="38" + id="tspan2184" + sodipodi:role="line">SPI</tspan><tspan + id="tspan2186" + y="75.212772" + x="38" + sodipodi:role="line">Master</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3061" + y="30.724487" + x="120" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="30.724487" + x="120" + id="tspan3063" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3065" + y="45.724487" + x="120" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3067" + y="60.724487" + x="120" + sodipodi:role="line">MISO</tspan><tspan + id="tspan3069" + y="75.724487" + x="120" + sodipodi:role="line">SS1</tspan><tspan + id="tspan2673" + y="90.724487" + x="120" + sodipodi:role="line">SS2</tspan><tspan + id="tspan2675" + y="105.72449" + x="120" + sodipodi:role="line">SS3</tspan></text> + <path + id="path2341" + d="M 97.886043,64.584585 L 118.40024,64.584585" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path2624" + d="M 97.886044,79.919953 L 118.40024,79.919953" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + id="path2626" + d="M 97.886043,95.255342 L 118.40024,95.255342" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g2771"> + <rect + y="12.768347" + x="226.85843" + height="72.187675" + width="118.28313" + id="rect3084" + style="fill:#b9e179;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text3086" + y="45.712769" + x="320" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="45.712769" + x="320" + id="tspan3088" + sodipodi:role="line">SPI</tspan><tspan + id="tspan3090" + y="60.712769" + x="320" + sodipodi:role="line">Slave</tspan></text> + <text + id="text3092" + y="30.724487" + x="236" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="30.724487" + x="236" + id="tspan3094" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3096" + y="45.724487" + x="236" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3098" + y="60.724487" + x="236" + sodipodi:role="line">MISO</tspan><tspan + id="tspan3100" + y="75.724487" + x="236" + sodipodi:role="line">SS</tspan></text> + <path + id="path2694" + d="M 236.92188,65.124998 L 250.14063,65.124998" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g2750"> + <rect + y="103.46392" + x="226.87628" + height="72.187675" + width="118.28313" + id="rect1462" + style="fill:#8fbbdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text1464" + y="136.40834" + x="320.01785" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="136.40834" + x="320.01785" + id="tspan1466" + sodipodi:role="line">SPI</tspan><tspan + id="tspan1468" + y="151.40834" + x="320.01785" + sodipodi:role="line">Slave</tspan></text> + <text + id="text1470" + y="121.42006" + x="236.01785" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="121.42006" + x="236.01785" + id="tspan1472" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan1474" + y="136.42006" + x="236.01785" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan1476" + y="151.42006" + x="236.01785" + sodipodi:role="line">MISO</tspan><tspan + id="tspan1478" + y="166.42006" + x="236.01785" + sodipodi:role="line">SS</tspan></text> + <path + id="path2696" + d="M 236.95313,155.4375 L 250.17188,155.4375" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g2729"> + <rect + y="194.15945" + x="226.87628" + height="72.187675" + width="118.28313" + id="rect1482" + style="fill:#bfa1d1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text1484" + y="227.10387" + x="320.01785" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="227.10387" + x="320.01785" + id="tspan1486" + sodipodi:role="line">SPI</tspan><tspan + id="tspan1488" + y="242.10387" + x="320.01785" + sodipodi:role="line">Slave</tspan></text> + <text + id="text1490" + y="212.11559" + x="236.01785" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="212.11559" + x="236.01785" + id="tspan1492" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan1494" + y="227.11559" + x="236.01785" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan1496" + y="242.11559" + x="236.01785" + sodipodi:role="line">MISO</tspan><tspan + id="tspan1498" + y="257.11559" + x="236.01785" + sodipodi:role="line">SS</tspan></text> + <path + id="path2698" + d="M 236.57813,246 L 249.79688,246" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/20171116/SPI_three_slaves_daisy_chained.pdf b/20171116/SPI_three_slaves_daisy_chained.pdf new file mode 100644 index 0000000000000000000000000000000000000000..46ac2027cfcbd598a609e43ce74e19e75d374ead Binary files /dev/null and b/20171116/SPI_three_slaves_daisy_chained.pdf differ diff --git a/20171116/SPI_three_slaves_daisy_chained.svg b/20171116/SPI_three_slaves_daisy_chained.svg new file mode 100644 index 0000000000000000000000000000000000000000..5256fcff4a1fe1c6e70a5e4926623944c47b9e5a --- /dev/null +++ b/20171116/SPI_three_slaves_daisy_chained.svg @@ -0,0 +1,537 @@ +<?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://web.resource.org/cc/" + 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="290pt" + height="230pt" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.45" + sodipodi:docbase="/home/cburnett/wikipedia/images/electronics" + sodipodi:docname="SPI three slaves daisy chained.svg" + version="1.0" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + sodipodi:modified="true"> + <defs + id="defs4"> + <marker + inkscape:stockid="TriangleInM" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleInM" + style="overflow:visible"> + <path + id="path2480" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none" + transform="scale(-0.4)" /> + </marker> + <marker + inkscape:stockid="Arrow2Mstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Mstart" + style="overflow:visible"> + <path + id="path2570" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(0.6,0,0,0.6,-3,0)" /> + </marker> + <marker + inkscape:stockid="TriangleInL" + orient="auto" + refY="0" + refX="0" + id="TriangleInL" + style="overflow:visible"> + <path + id="path2502" + d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" /> + </marker> + <marker + inkscape:stockid="TriangleOutL" + orient="auto" + refY="0" + refX="0" + id="TriangleOutL" + style="overflow:visible"> + <path + id="path2493" + d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(0.8,0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lstart" + style="overflow:visible"> + <path + id="path2576" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(1.1,0,0,1.1,-5.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend" + style="overflow:visible"> + <path + id="path3298" + style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="matrix(-1.1,0,0,-1.1,5.5,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lend" + style="overflow:visible"> + <path + id="path3316" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(-0.8,-0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lstart" + orient="auto" + refY="0" + refX="0" + id="Arrow1Lstart" + style="overflow:visible"> + <path + id="path3319" + d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" + transform="scale(0.8,0.8)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.0000001" + inkscape:cx="217.78144" + inkscape:cy="139.15758" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1272" + inkscape:window-height="965" + inkscape:window-x="0" + inkscape:window-y="31" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2202"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,25 L 131.25,25.96875 C 176.07915,25.96875 198.51146,25.96875 209.71875,25.96875 C 215.32239,25.96875 218.13034,25.96875 219.53125,25.96875 C 220.23171,25.96875 220.57489,25.96875 220.75,25.96875 C 220.83756,25.96875 220.88436,25.96875 220.90625,25.96875 L 220.90625,25.5 L 220.90625,25 C 220.90625,25 220.90829,25 131.25,25 z " + id="path3144" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,25.497581 L 218.6888,29.37055 L 218.6888,21.624612 L 225.38904,25.497581 z " + id="path2208" /> + </g> + <g + id="g2210"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,40.625 L 131.25,41.59375 C 176.07915,41.593749 198.51146,41.59375 209.71875,41.59375 C 215.32239,41.59375 218.13034,41.59375 219.53125,41.59375 C 220.23171,41.59375 220.57489,41.59375 220.75,41.59375 C 220.83756,41.59375 220.88436,41.59375 220.90625,41.59375 L 220.90625,41.09375 L 220.90625,40.625 C 220.90625,40.625 220.90829,40.624998 131.25,40.625 z " + id="path3330" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,41.101164 L 218.6888,44.974133 L 218.6888,37.228195 L 225.38904,41.101164 z " + id="path2216" /> + </g> + <g + id="g2226"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96824229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 131.25,71.8125 L 131.25,72.78125 C 176.07915,72.78125 198.51146,72.78125 209.71875,72.78125 C 215.32239,72.78125 218.13034,72.78125 219.53125,72.78125 C 220.23171,72.78125 220.57489,72.78125 220.75,72.78125 C 220.83756,72.78125 220.88436,72.78125 220.90625,72.78125 L 220.90625,72.3125 L 220.90625,71.8125 C 220.90625,71.8125 220.90829,71.8125 131.25,71.8125 z " + id="path3334" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77459383pt;marker-start:none" + d="M 225.38904,72.308296 L 218.6888,76.181265 L 218.6888,68.435327 L 225.38904,72.308296 z " + id="path2232" /> + </g> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2607" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-12.09375,-18)" /> + <g + id="g2234"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.04614723px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 197.09375,25.5 L 197.09375,117.40625 L 197.09375,117.9375 L 197.625,117.9375 L 220.65625,117.9375 L 220.65625,116.90625 L 198.15625,116.90625 L 198.15625,25.5 L 197.09375,25.5 z " + id="path2689" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.83691778pt;marker-start:none" + d="M 225.48174,117.42146 L 218.2424,121.60605 L 218.2424,113.23687 L 225.48174,117.42146 z " + id="path2240" /> + </g> + <g + id="g2282"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.03560543px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 197.1875,117.25 L 197.1875,208.09375 L 197.1875,208.625 L 197.6875,208.625 L 220.4375,208.625 L 220.4375,207.59375 L 198.21875,207.59375 L 198.21875,117.25 L 197.1875,117.25 z " + id="path2701" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.82848434pt;marker-start:none" + d="M 225.22445,208.10791 L 218.05807,212.25033 L 218.05807,203.96549 L 225.22445,208.10791 z " + id="path2288" /> + </g> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2569" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-12.01454,73.9631)" /> + <g + id="g1955" + transform="matrix(1.008289,0,0,1,-1.516952,0)"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.97181958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183,56.625 L 183,133.625 L 183,134.125 L 183.5,134.125 L 220.6875,134.125 L 220.6875,133.125 L 183.96875,133.125 L 183.96875,56.625 L 183,56.625 z " + id="path1398" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77745566pt;marker-start:none" + d="M 225.16559,133.625 L 218.4406,137.51228 L 218.4406,129.73772 L 225.16559,133.625 z " + id="path1961" /> + </g> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99899px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" + d="M 183,56.3125 L 183,57.3125 L 183.5038,57.3125 C 205.01279,57.312499 215.78552,57.3125 221.16276,57.3125 C 223.85139,57.3125 225.18223,57.3125 225.85439,57.3125 C 225.94283,57.3125 225.94512,57.3125 226.01183,57.3125 C 226.19858,57.3125 226.39074,57.3125 226.45265,57.3125 L 226.51562,57.3125 C 226.51562,57.3125 226.51562,56.8125 226.51562,56.8125 L 226.51562,56.3125 C 226.51562,56.3125 226.0119,56.3125 226.01183,56.3125 C 226.00599,56.3125 226.01789,56.312498 183.5038,56.3125 L 183,56.3125 z " + id="path2273" /> + <g + id="g1971" + transform="matrix(1.007327,0,0,1,-1.340809,0)"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.97181958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 183,147.0625 L 183,224.0625 L 183,224.53125 L 183.5,224.53125 L 220.6875,224.53125 L 220.6875,223.5625 L 183.96875,223.5625 L 183.96875,147.0625 L 183,147.0625 z " + id="path2275" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.77745566pt;marker-start:none" + d="M 225.16559,224.05636 L 218.4406,227.94364 L 218.4406,220.16908 L 225.16559,224.05636 z " + id="path1977" /> + </g> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99899px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" + d="M 183,146.75 L 183,147.75 L 183.50409,147.75 C 205.02565,147.75 215.80467,147.75 221.18506,147.75 C 223.87526,147.75 225.20688,147.75 225.87943,147.75 C 225.96792,147.75 225.97022,147.75 226.03696,147.75 C 226.22383,147.75 226.4161,147.75 226.47804,147.75 L 226.54105,147.75 C 226.54105,147.75 226.54105,147.25 226.54105,147.25 L 226.54105,146.75 C 226.54105,146.75 226.03703,146.75 226.03696,146.75 C 226.03112,146.75 226.04303,146.75001 183.50409,146.75 L 183,146.75 z " + id="path2277" /> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2586" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-70.19016,28.79256)" /> + <g + id="g1987"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.98554045px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 139.5,162 C 139.5,162 139.5,162.5 139.5,162.5 L 139.5,163 C 139.5,163 139.49105,163 220.59375,163 L 220.59375,162 C 180.0424,162 159.76284,162 149.625,162 C 144.55608,162 142.01723,162 140.75,162 C 140.11639,162 139.81465,162 139.65625,162 C 139.57705,162 139.5198,162 139.5,162 z " + id="path2588" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.78843236pt;marker-start:none" + d="M 225.13765,162.5 L 218.31771,166.44216 L 218.31771,158.55784 L 225.13765,162.5 z " + id="path1993" /> + </g> + <path + sodipodi:type="arc" + style="fill:#000000;fill-opacity:1" + id="path2590" + sodipodi:cx="209.65625" + sodipodi:cy="43.518429" + sodipodi:rx="1.9375" + sodipodi:ry="1.9375" + d="M 211.59375 43.518429 A 1.9375 1.9375 0 1 1 207.71875,43.518429 A 1.9375 1.9375 0 1 1 211.59375 43.518429 z" + transform="translate(-70.29688,118.9503)" /> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 138.96875,72.375 C 138.96875,163.44362 138.96875,208.9516 138.96875,231.71875 C 138.96875,243.10233 138.96875,248.81036 138.96875,251.65625 C 138.96875,253.0792 138.96875,253.80051 138.96875,254.15625 C 138.96875,254.33412 138.96875,254.42428 138.96875,254.46875 C 138.96875,254.49098 138.96875,254.49444 138.96875,254.5 L 139.96875,254.5 C 139.96875,254.5 139.96875,254.51224 139.96875,72.375 L 138.96875,72.375 z " + id="path2592" /> + <g + id="g1979"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 139.875,253.25 L 139.875,254.25 C 180.33454,254.25 200.57261,254.25 210.6875,254.25 C 215.74494,254.25 218.26689,254.25 219.53125,254.25 C 220.16343,254.25 220.46695,254.25 220.625,254.25 C 220.70402,254.25 220.76149,254.25 220.78125,254.25 L 220.78125,253.75 L 220.78125,253.25 C 220.78125,253.25 220.79409,253.25 139.875,253.25 z " + id="path2594" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.8pt;marker-start:none" + d="M 225.41009,253.75 L 218.49009,257.75 L 218.49009,249.75 L 225.41009,253.75 z " + id="path1985" /> + </g> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 167.78125,238.125 L 167.78125,239.125 L 226.53125,239.125 L 226.53125,238.125 L 167.78125,238.125 z " + id="path3158" /> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00033176px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 167.77935,56.8125 C 167.77935,56.8125 167.77935,56.817075 167.77935,238.4375 L 168.77935,238.4375 C 168.77935,147.62729 168.77935,102.2338 168.77935,79.53125 C 168.77935,68.179973 168.77935,62.494069 168.77935,59.65625 C 168.77935,58.23734 168.77935,57.510977 168.77935,57.15625 C 168.77935,56.978886 168.77935,56.919341 168.77935,56.875 C 168.77935,56.85283 168.77935,56.818043 168.77935,56.8125 L 167.77935,56.8125 z " + id="path4045" /> + <g + id="g4057"> + <path + style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 136.90625,56.8125 C 136.90625,56.8125 136.90625,57.3125 136.90625,57.3125 L 136.90625,57.8125 C 136.90625,57.8125 136.9085,57.8125 168.28125,57.8125 L 168.28125,56.8125 C 152.59487,56.8125 144.73409,56.8125 140.8125,56.8125 C 138.8517,56.8125 137.89645,56.8125 137.40625,56.8125 C 137.16115,56.8125 137.03002,56.8125 136.96875,56.8125 C 136.93811,56.8125 136.91391,56.8125 136.90625,56.8125 z " + id="path4047" /> + <path + style="fill-rule:evenodd;stroke:black;stroke-width:0.8pt;marker-start:none" + d="M 132.28476,57.3125 L 139.20476,53.3125 L 139.20476,61.3125 L 132.28476,57.3125 z " + id="path4063" /> + </g> + <g + id="g3941"> + <rect + y="12.791164" + x="12.858437" + height="72.150665" + width="118.28313" + id="rect1307" + style="fill:#ffc2a1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74980044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text2182" + y="45.712769" + x="38" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="45.712769" + x="38" + id="tspan2184" + sodipodi:role="line">SPI</tspan><tspan + id="tspan2186" + y="60.712769" + x="38" + sodipodi:role="line">Master</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3061" + y="30.724487" + x="120" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="30.724487" + x="120" + id="tspan3063" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3065" + y="45.724487" + x="120" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3067" + y="60.724487" + x="120" + sodipodi:role="line">MISO</tspan><tspan + id="tspan2675" + y="75.724487" + x="120" + sodipodi:role="line">SS</tspan></text> + <path + id="path2694" + d="M 105.55543,64.540399 L 118.77418,64.540399" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g3920"> + <rect + y="12.768347" + x="226.85843" + height="72.187675" + width="118.28313" + id="rect3084" + style="fill:#b9e179;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text3086" + y="45.712769" + x="320" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="45.712769" + x="320" + id="tspan3088" + sodipodi:role="line">SPI</tspan><tspan + id="tspan3090" + y="60.712769" + x="320" + sodipodi:role="line">Slave</tspan></text> + <text + id="text3092" + y="30.724487" + x="236" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="30.724487" + x="236" + id="tspan3094" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan3096" + y="45.724487" + x="236" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan3098" + y="60.724487" + x="236" + sodipodi:role="line">MISO</tspan><tspan + id="tspan3100" + y="75.724487" + x="236" + sodipodi:role="line">SS</tspan></text> + <path + id="path3863" + d="M 236.89062,64.500006 L 250.10937,64.500006" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g3899"> + <rect + y="103.46392" + x="226.87628" + height="72.187675" + width="118.28313" + id="rect1462" + style="fill:#8fbbdf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text1464" + y="136.40834" + x="320.01785" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="136.40834" + x="320.01785" + id="tspan1466" + sodipodi:role="line">SPI</tspan><tspan + id="tspan1468" + y="151.40834" + x="320.01785" + sodipodi:role="line">Slave</tspan></text> + <text + id="text1470" + y="121.42006" + x="236.01785" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="121.42006" + x="236.01785" + id="tspan1472" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan1474" + y="136.42006" + x="236.01785" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan1476" + y="151.42006" + x="236.01785" + sodipodi:role="line">MISO</tspan><tspan + id="tspan1478" + y="166.42006" + x="236.01785" + sodipodi:role="line">SS</tspan></text> + <path + id="path3865" + d="M 236.95312,154.875 L 250.17187,154.875" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g3878"> + <rect + y="194.15945" + x="226.87628" + height="72.187675" + width="118.28313" + id="rect1482" + style="fill:#bfa1d1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74999273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text1484" + y="227.10387" + x="320.01785" + style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="227.10387" + x="320.01785" + id="tspan1486" + sodipodi:role="line">SPI</tspan><tspan + id="tspan1488" + y="242.10387" + x="320.01785" + sodipodi:role="line">Slave</tspan></text> + <text + id="text1490" + y="212.11559" + x="236.01785" + style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" + xml:space="preserve"><tspan + y="212.11559" + x="236.01785" + id="tspan1492" + sodipodi:role="line">SCLK</tspan><tspan + id="tspan1494" + y="227.11559" + x="236.01785" + sodipodi:role="line">MOSI</tspan><tspan + id="tspan1496" + y="242.11559" + x="236.01785" + sodipodi:role="line">MISO</tspan><tspan + id="tspan1498" + y="257.11559" + x="236.01785" + sodipodi:role="line">SS</tspan></text> + <path + id="path3867" + d="M 236.82812,245.75 L 250.04687,245.75" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + </g> +</svg> diff --git a/20171116/Telefon_t-sinus-700.jpg b/20171116/Telefon_t-sinus-700.jpg new file mode 120000 index 0000000000000000000000000000000000000000..27c322c50b0f05edc8b07cfb0cc99b1876eb506d --- /dev/null +++ b/20171116/Telefon_t-sinus-700.jpg @@ -0,0 +1 @@ +../common/Telefon_t-sinus-700.jpg \ No newline at end of file diff --git a/20171116/Zeichen_123.pdf b/20171116/Zeichen_123.pdf new file mode 120000 index 0000000000000000000000000000000000000000..fdbc897227df059cfda790a16555e6e417682116 --- /dev/null +++ b/20171116/Zeichen_123.pdf @@ -0,0 +1 @@ +../common/Zeichen_123.pdf \ No newline at end of file diff --git a/20171116/a380.jpg b/20171116/a380.jpg new file mode 120000 index 0000000000000000000000000000000000000000..33a5d1fd18843bf7385e5a6d90f69af9fd8720da --- /dev/null +++ b/20171116/a380.jpg @@ -0,0 +1 @@ +../common/a380.jpg \ No newline at end of file diff --git a/20171116/curiosity.jpg b/20171116/curiosity.jpg new file mode 120000 index 0000000000000000000000000000000000000000..4452844da537414b751c5283ca8468b3ced9afb3 --- /dev/null +++ b/20171116/curiosity.jpg @@ -0,0 +1 @@ +../common/curiosity.jpg \ No newline at end of file diff --git a/20171116/dsc_8208.jpg b/20171116/dsc_8208.jpg new file mode 120000 index 0000000000000000000000000000000000000000..5796341ebc774aa09965a3a29854c65ce1144fb8 --- /dev/null +++ b/20171116/dsc_8208.jpg @@ -0,0 +1 @@ +../common/dsc_8208.jpg \ No newline at end of file diff --git a/20171116/es-20171116.pdf b/20171116/es-20171116.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e0fd1fe2cfcc18f261509b849357bcab3db98942 Binary files /dev/null and b/20171116/es-20171116.pdf differ diff --git a/20171116/es-20171116.tex b/20171116/es-20171116.tex new file mode 100644 index 0000000000000000000000000000000000000000..b6d4ae9f1ac2fab461d16455d5f0ecf34cbd2e42 --- /dev/null +++ b/20171116/es-20171116.tex @@ -0,0 +1,2230 @@ +% es-20171116.pdf - Lecture Slides on Embedded Systems +% Copyright (C) 2013, 2014, 2015, 2016, 2017 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +% README: Bus-Systeme, evtl. Echtzeit + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{rotating} +\usepackage{tikz} +\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} + +\newrgbcolor{lightyellow}{0.95 0.85 0.0} +\newrgbcolor{lightorange}{1.0 0.7 0.0} +\newrgbcolor{lightgreen}{0.0 0.8 0.0} + +\newcommand{\underconstruction}{\vspace*{-5cm plus 1filll}% + \begin{picture}(0,0) + \put(9,1.3){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}} + \put(9,1.0){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}} + \end{picture}} + +\title{Vertiefung Systemtechnik\\Eingebettete Systeme} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{16.\ November 2017} + +\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} + +\begin{document} + +\newlength{\normalpdfpageheight} +\setlength{\normalpdfpageheight}{\pdfpageheight} + +\maketitleframe + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \begin{itemize} + \color{medgreen} + \item[5.1] Was sind Bus-Systeme? + \item[5.2] RS-232 + \item[5.3] \ItwoC\ (TWI) + \item[5.4] SPI + \item[5.5] Beispiel: Benutzung des \ItwoC-Busses + \end{itemize} + \item[\textbf{6}] \textbf{Echtzeit} + \begin{itemize} + \color{medgreen} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \color{orange} + \item[5.3] Multitasking + \color{red} + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\setcounter{section}{3} +\section{Bus-Systeme} +\subsection{Was sind Bus-Systeme?} + +\begin{frame} + \showsection + \showsubsection + + \begin{quote} + Ein Bus ist ein System zur Datenübertragung zwischen mehreren + Teilnehmern über einen gemeinsamen Übertragungsweg. +% \color{gray} +% Findet eine Datenübertragung zwischen zwei Teilnehmern statt, so +% müssen die übrigen Teilnehmer schweigen, da sie sich sonst +% gegenseitig stören würden. Umgangssprachlich werden mitunter -- +% oft aus historischen Gründen – auch Datenübertragungssysteme als +% "`Bus"' bezeichnet, die technisch eigentlich eine andere +% Topologie besitzen. + + \medskip + + \strut\hfill\url{https://de.wikipedia.org/wiki/Bus_(Datenverarbeitung)} + \end{quote} + Beispiele: + \begin{itemize} + \item + Computer kommuniziert mit Peripherie + \item + Computer kommunizieren (direkt) miteinander + \item + Prozessor kommuniziert mit externem Speicher + \item + Teile eines Prozessors kommunizieren miteinander + \end{itemize} +\end{frame} + +\begin{frame} + \showsection + \showsubsection + Standard-Computer: + \begin{itemize} + \item + Einsteckkarten: PCI (und Vorgänger) + \item + Festplatten: SATA (und Vorgänger) + \item + USB, FireWire, \dots + \item + Ethernet, CAN-Bus, \dots + \item + WLAN, BlueTooth, IR, \dots + \item + PS/2, RS-232, Centronics + \end{itemize} + + \medskip + + Minimal-Hardware: + \begin{itemize} + \item + RS-232 + \item + \ItwoC\ (TWI) + \item + SPI + \end{itemize} + + \begin{onlyenv}<1> + \begin{picture}(0,0) + \put(5,1.5){\includegraphics[height=3cm]{motherboard-anschluesse.jpg}} + \end{picture} + \end{onlyenv} + \begin{onlyenv}<2> + \begin{picture}(0,0)(-1.3,-4) + \put(1.8,-4.9){\includegraphics[height=3.5cm]{kompassmodul-an-roboter.jpg}} + \put(6.1,-3.3){\includegraphics[height=4.5cm]{kompassmodul.jpg}} + \put(6.1,1.2){\makebox(0,0)[tr]{\tikz{\draw(0,0)--(-1.9,-3.6);}}} + \put(6.1,-3.3){\makebox(0,0)[br]{\tikz{\draw(0,0)--(-1.8,0.2);}}} + \end{picture} + \end{onlyenv} +\end{frame} + +\begin{frame}[fragile] + + \showsection + \showsubsection + + \vspace*{-\bigskipamount} + \begin{tabbing} + \newterm{Punkt-zu-Punkt}\quad\=\kill + \newterm{seriell} \> jedes Bit einzeln übertragen\\ + \newterm{parallel} \> mehrere Bits gleichzeitig\\[\smallskipamount] + \newterm{synchron} \> Abgleich über Steuerleitung: \newterm{Takt}\\ + \newterm{asynchron} \> Abgleich über Zeitvereinbarungen\\[\smallskipamount] + \newterm{Punkt-zu-Punkt} \> genau zwei Teilnehmer\\ + \newterm{busfähig} \> mehrere Teilnehmer, mit \newterm{Adressierung} + \end{tabbing} + + \begin{itemize} + \item + \ItwoC: seriell, synchron, mit Adressierung + \item + RS-232: seriell, asynchron, Punkt-zu-Punkt + \item + RS-485, USB, CAN: seriell, asynchron, mit Adressierung + \item + SPI: seriell, synchron, Punkt-zu-Punkt oder mit Adressierung + \end{itemize} + +\end{frame} + +\subsection{RS-232} + +\begin{frame} + \showsection + \showsubsection + + seriell + \begin{itemize} + \item + \newterm{TX\/}: 1 Leitung für Daten + \item + \newterm{RX\/}: ggf.\ 1 Leitung für Daten in der anderen Richtung + \item + \newterm{GND\/}: gemeinsame \newterm{Masse} + \item + evtl.\ zusätzliche Steuerleitungen + \end{itemize} + + \medskip + + asynchron + \begin{itemize} + \item + \emph{keine\/} Taktleitung für Abgleich, wann Daten anliegen + \item + Stattdessen: Abgleich über Zeitvereinbarungen + \arrowitem + Jeder Teilnehmer braucht eine eigene Zeitbasis. + \end{itemize} + + \medskip + + Punkt-zu-Punkt + \begin{itemize} + \item + nur 2 Teilnehmer vorgesehen + \end{itemize} +\end{frame} + +\begin{frame} + \showsubsection + \vspace*{-0.35cm} + \begin{center} + \includegraphics[scale=0.9]{rs-232.pdf} + \end{center} +\end{frame} + +\subsection{\protect\ItwoC\ (TWI)} + +\begin{frame} + \showsection + \showsubsection + + \ItwoC\ = Inter-IC; TWI = Two-Wire-Interface + + \medskip + + seriell + \begin{itemize} + \item + \newterm{SDA\/}: 1 Leitung für Daten (in beiden Richtungen) + \item + \newterm{SCL\/}: Taktleitung (Clock) + \item + \newterm{GND\/}: gemeinsame Masse + \item + evtl.\ \newterm{VCC\/}: Stromversorgung für Peripheriegerät + \end{itemize} + + \medskip + + synchron + \begin{itemize} + \item + Abgleich über\\Taktleitung + \begin{picture}(0,0) + \put(0.4,-0.4){\includegraphics[width=9.7cm]{I2C_data_transfer.pdf}} + \end{picture} + \end{itemize} + + \medskip + + busfähig + \begin{itemize} + \item + \newterm{Master\/} initiiert Kommuniation und steuert Taktleitung + \item + erstes gesendetes Byte: \newterm{Adresse\/} des Teilnehmers + \item + 2 Adressen pro Teilnehmer: Lesen/Schreiben + \end{itemize} + \vspace*{-1cm} +\end{frame} + +\subsection{SPI} + +\begin{frame} + \showsection + \showsubsection + + Serial Peripheral Interface + + \medskip + + seriell + \begin{itemize} + \item + \newterm{MOSI\/}: Master Out, Slave In + \item + \newterm{MISO\/}: Master In, Slave Out + \item + \newterm{SCLK\/}: Taktleitung (Clock) + \item + \newterm{$\overline{\text{SS}}$\/}: Slave Select (invertiert) + \item + \newterm{GND\/}: gemeinsame Masse + \item + evtl.\ \newterm{VCC\/}: Stromversorgung für Peripheriegerät + \end{itemize} + + \medskip + + synchron + \begin{itemize} + \item + Abgleich über Taktleitung + \end{itemize} + + \medskip + + busfähig + \begin{itemize} + \item + \newterm{Master\/} initiiert Kommuniation und steuert Taktleitung + \item + \newterm{Slave\/} wird über \newterm{Slave Select\/} ausgewählt + \begin{picture}(0,0) + \only<1>{\put(-2.175,2.875){\includegraphics[scale=0.7]{SPI_single_slave.pdf}}} + \only<2>{\put(-2.0,3.0){\includegraphics[scale=0.7]{SPI_three_slaves.pdf}}} + \only<2>{\put(2.55,3.1){\begin{minipage}[t]{2.5cm} + \newterm{Stern} + \end{minipage}}} + \only<3->{\put(-2.0,3.0){\includegraphics[scale=0.7]{SPI_three_slaves_daisy_chained.pdf}}} + \only<3->{\put(2.55,3.1){\begin{minipage}[t]{2.5cm} + \newterm{Kaskade}\\ + \newterm{Daisy Chain}\pause[4]\par\smallskip + \setlength{\leftskip}{-3.5cm}\small + Slave gibt MOSI-Input um 1 Takt verzögert + an MISO aus \textarrow\ Master setzt + "`im richtigen Moment"' $\overline{\text{SS}}$ + \end{minipage}}} + \end{picture} + \end{itemize} + \vspace*{-1cm} + +\end{frame} + + +\subsection{Beispiel: Benutzung des \protect\ItwoC-Busses} + +\begin{frame}[fragile] + + \showsection + \showsubsection + + \begin{picture}(0,0) + \put(8.75,-0.75){\includegraphics[height=2.75cm]{kompassmodul.jpg}} + \end{picture}% + + \begin{onlyenv}<1> + \begin{lstlisting}[gobble=6] + void read_compass (uint16_t *x, uint16_t *y) + { + I2CTWI_transmit2Bytes (0x60, 0x00, 0x02); // set coil + mSleep (1); + I2CTWI_transmit2Bytes (0x60, 0x00, 0x04); // reset coil + mSleep (5); + uint8_t result[5]; + I2CTWI_transmit2Bytes (0x60, 0x00, 0x01); // Messung starten + mSleep (5); // 5ms warten, bis Sensor fertig gemessen hat + I2CTWI_transmitByte (0x60, 0x01); // Leseindex setzen + I2CTWI_readBytes (0x61, result, 4); // lesen: msb x, lsb x, msb y, lsb y + result[0] &= 0b00001111; // Unwichtge Bits vom msb abschneiden + result[2] &= 0b00001111; + *x = (result[0] << 8) + result[1]; // Wert berechnen aus msb und lsb + *y = (result[2] << 8) + result[3]; + } + \end{lstlisting} + \end{onlyenv} + \begin{onlyenv}<2-3> + \begin{lstlisting}[gobble=6,style=shy] + ²void read_compass (uint16_t *x, uint16_t *y) + { ... } + + int main (void) + { + uint16_t compass_x, compass_y; + read_compass (&compass_x, &compass_y);¿ + ³writeInteger (compass_x, DEC); + writeChar (' '); + writeInteger (compass_y, DEC); + writeChar ('\n');¿ + ²return 0; + }¿ + \end{lstlisting} + \end{onlyenv} + \begin{onlyenv}<4-> + \begin{lstlisting}[gobble=6,style=shy] + °void read_compass (uint16_t *x, uint16_t *y) + { + I2CTWI_transmit2Bytes (0x60, 0x00, 0x02); // set coil + ¿mSleep (1); + I2CTWI_transmit2Bytes (0x60, 0x00, 0x04); // reset coil + mSleep (5); + uint8_t result[5]; + I2CTWI_transmit2Bytes (0x60, 0x00, 0x01); // Messung starten + mSleep (5); // 5ms warten, bis Sensor fertig gemessen hat + I2CTWI_transmitByte (0x60, 0x01); // Leseindex setzen + I2CTWI_readBytes (0x61, result, 4); // lesen: msb x, lsb x, msb y, lsb y + result[0] &= 0b00001111; // Unwichtge Bits vom msb abschneiden + result[2] &= 0b00001111; + *x = (result[0] << 8) + result[1]; // Wert berechnen aus msb und lsb + *y = (result[2] << 8) + result[3]; + °}¿ + \end{lstlisting} + \end{onlyenv} + \begin{onlyenv}<5-7> + \begin{picture}(0,0) + \color{red} + \put(3.85,5.3){\vector(1,1){0.5}} + \put(3.5,5.2){\makebox(0,0)[t]{\shortstack{Gerät adressieren:\\Schreib-Adresse}}} + \end{picture} + \end{onlyenv} + \begin{onlyenv}<6-7> + \begin{picture}(0,0) + \color{red} + \put(5.25,4.5){\vector(0,1){1.3}} + \put(5.25,4.4){\makebox(0,0)[t]{\shortstack{Register-Nr.\\innerhalb des Geräts}}} + \end{picture} + \end{onlyenv} + \begin{onlyenv}<7> + \begin{picture}(0,0) + \color{red} + \put(6.6,5.3){\vector(-1,1){0.5}} + \put(6.95,5.2){\makebox(0,0)[t]{Befehl: Spule an}} + \end{picture} + \end{onlyenv} + \vspace*{-2cm} + +\end{frame} + +\begin{frame}[fragile] + + \showsection + \showsubsection + + \begin{picture}(0,0) + \put(8.75,-0.75){\includegraphics[height=2.75cm]{kompassmodul.jpg}} + \end{picture}% + + \begin{lstlisting}[style=shy] + ¡void read_compass (uint16_t *x, uint16_t *y) + { + I2CTWI_transmit2Bytes (0x60, 0x00, 0x02); // set coil + mSleep (1); + I2CTWI_transmit2Bytes (0x60, 0x00, 0x04); // reset coil + mSleep (5); + ¿²uint8_t result[5]; + I2CTWI_transmit2Bytes (0x60, 0x00, 0x01); // Messung starten + mSleep (5); // 5ms warten, bis Sensor fertig gemessen hat + ¿³I2CTWI_transmitByte (0x60, 0x01); // Leseindex setzen + ¿°I2CTWI_readBytes (0x61, result, 4); // lesen: msb x, lsb x, msb y, lsb y + result[0] &= 0b00001111; // Unwichtge Bits vom msb abschneiden + result[2] &= 0b00001111; + *x = (result[0] << 8) + result[1]; // Wert berechnen aus msb und lsb + *y = (result[2] << 8) + result[3]; + ¿¡}¿ + \end{lstlisting} + \vspace*{-2cm} + +\end{frame} + +\begin{frame}[fragile] + + \showsection + \showsubsection + + \begin{picture}(0,0) + \put(8.75,-0.75){\includegraphics[height=2.75cm]{kompassmodul.jpg}} + \end{picture}% + Messung:\\ + Roboter im Kreis drehen lassen,\\ + x- und y-Werte aufzeichnen\\ + und gegeneinander auftragen + + \smallskip + Ergebnis: Ellipse + \begin{picture}(0,0)(0,0.5) + \put(5,-3){\includegraphics[height=4cm]{kompass-messung.png}} + \end{picture}% + + \bigskip + Anwendung:\\ + Roboter in eine Himmelsrichtung ausrichten + \begin{itemize} + \item + Achsen normieren:\\ + Mittelwert subtrahieren + \begin{picture}(0,0)(0,0.5) + \put(3.75,0.95){\vector(1,0){4}} + \put(7.55,0.90){\makebox(0,0)[t]{x}} + \put(5.75,-1.05){\vector(0,1){4}} + \put(5.75,2.95){\makebox(0,0)[r]{y}} + \end{picture}% + \item + Nulldurchgang einer Achse\\ + markiert eine Himmelsrichtung + \item + Vorzeichen der anderen Achse\\ + sagt aus, welche Himmelsrichtung + \end{itemize} + \vspace{-0.5cm} + \begin{flushright} + Beispiel: nach Norden ausrichten\\ + Grob drehen, bis $y$ positiv ist, + fein drehen, bis $x = 0$ ist + \end{flushright} +% $x = 0$, $y$ positiv: Norden\\ +% $x = 0$, $y$ negativ: Süden +% $y = 0$, $x < 0$: Westen +% $y = 0$, $x > 0$: Osten + \vspace*{-2cm} + +\end{frame} + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \begin{itemize} + \color{medgreen} + \item[5.1] Was sind Bus-Systeme? + \item[5.2] RS-232 + \item[5.3] \ItwoC\ (TWI) + \item[5.4] SPI + \item[5.5] Beispiel: Benutzung des \ItwoC-Busses + \end{itemize} + \item[\textbf{6}] \textbf{Echtzeit} + \begin{itemize} + \color{medgreen} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \color{orange} + \item[5.3] Multitasking + \color{red} + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\section{Echtzeit} + +\subsection{Was ist Echtzeit?} + +\begin{frame} + + \showsection + \showsubsection + + \begin{itemize} + \pause + \item + Animation in Echtzeit:\\ + schnelle Berechnung anstatt Wiedergabe einer Aufzeichnung + \pause + \medskip + \item + Fantasy-Rollenspiel in Echtzeit:\\ + Der Zeitverlauf der Spielwelt entspricht dem der realen Welt. + \pause + \medskip + \item + Datenverarbeitung in Echtzeit:\\ + Die Daten werden so schnell verarbeitet, wie sie anfallen. + \pause + \medskip + \item + speziell: Echtzeit-Steuerung von Maschinen:\\ + Die Berechnung kann mit den physikalischen Vorgängen schritthalten. + \pause + \bigskip + \arrowitem + "`Schnell genug."' + \end{itemize} + +\end{frame} + +\begin{frame} + + \showsubsection + + "`Schnell genug."' \pause-- "`Und wenn nicht?"' + + \pause + + \begin{itemize} + \item + "`Ganz schlecht."' \pause\textarrow\ \newterm{harte Echtzeit} + \begin{onlyenv}<4-8> + \begin{picture}(0,0)(0,-0.3) + \pause + \put(0,-4){\makebox(0,0)[br]{\includegraphics[height=3.5cm]{a380.jpg}}} + % http://de.wikipedia.org/w/index.php?title=Datei:Airbus_A380_overfly.jpg&filetimestamp=20111223141606 + \pause + \put(0.2,-3.9){\makebox(0,0)[bl]{\includegraphics[height=4.0cm]{quadrocopter.jpg}}} + %\put(0.2,-3.5){\makebox(0,0)[bl]{\includegraphics[height=3.5cm]{mercedes-benz-w116.jpg}}} + % http://commons.wikimedia.org/wiki/File:1973-1980_Mercedes-Benz_450_SEL_%28W116%29_sedan_%282010-12-28%29_01.jpg + \pause + \put(-0.5,-4.2){\makebox(0,0)[tr]{\includegraphics[height=3.5cm]{herzschrittmacher.jpg}}} + % http://de.wikipedia.org/w/index.php?title=Datei:Pacemaker_GuidantMeridianSR.jpg&filetimestamp=20051203173642 + \pause + \put(0,-4){\makebox(0,0)[tl]{\includegraphics[height=3.5cm]{curiosity.jpg}}} + % http://mars.jpl.nasa.gov/msl/news/whatsnew/index.cfm?FuseAction=ShowNews&NewsID=1344 + \end{picture} + \end{onlyenv} + \pause\\[2pt] + rechtzeitiges Ergebnis funktionsentscheidend + + \smallskip + + \pause + \item + "`Unschön."' \textarrow\ \newterm{weiche Echtzeit} + \begin{onlyenv}<10-12> + \begin{picture}(0,0)(0,0.3) + \pause + \put(0,-4){\makebox(0,0)[br]{\includegraphics[width=5cm]{Retribution_Engine_Screenshot_120807.jpg}}} + % http://en.wikipedia.org/wiki/File:Retribution_Engine_Screenshot_120807.jpg + \pause + \put(0.1,-4.5){\makebox(0,0)[bl]{\includegraphics[width=5cm]{Telefon_t-sinus-700.jpg}}} + % http://de.wikipedia.org/w/index.php?title=Datei:Telefon_t-sinus-700.jpg&filetimestamp=20050807203655 + \end{picture} + \end{onlyenv} + \pause\\[2pt] + verspätetes Ergebnis qualitätsmindernd + \begin{itemize} + \baselineskip14pt\par + \item + verwenden und Verzögerung in Kauf nehmen + \item + verwerfen und Ausfall in Kauf nehmen + \end{itemize} + + \smallskip + + \pause + \item + "`Es gibt keinen festen Termin. Möglichst schnell halt."'\pause\\[2pt] + \textarrow\ \newterm{keine Echtzeit} + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Das Problem: + \vspace{-\bigskipamount} + \begin{center} + \begin{picture}(6,2) + \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} + \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} +% \put(2.75,0.875){\vector(1,3){0.25}} +% \put(2.75,0.875){\line(2,1){0.5}} +% \put(3.25,1.125){\vector(-1,-3){0.25}} + \put(2.70,0.350){\tikz{\draw[latex-latex](0.25,0.625)--(0,-0.12)--(0.5,0.12)--(0.25,-0.625);}} + \end{picture} +% \begin{pdfpic} +% \begin{pspicture}(6,2) +% \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} +% \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} +% \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) +% \end{pspicture} +% \end{pdfpic} + \end{center} + + \pause + + Beispiel: + \begin{itemize} + \item + Eine Motorsteuerung benötigt alle \SI{2000}{\mics} einen Steuerimpuls,\\ + dessen Berechnung maximal \SI{10}{\mics} dauert. + \pause[3] + \item + Entweder: Der Steuer-Computer macht noch andere Dinge.\\ + \textarrow\ Risiko der Zeitüberschreitung + \pause + \item + Oder: Der Steuer-Computer macht nichts anderes.\\ + \textarrow\ Verschwendung von Rechenzeit\\ + \pause + {\color{red}\textarrow\ Na und?} + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Das Problem: + \vspace{-\bigskipamount} + \begin{center} + \begin{picture}(6,2) + \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} + \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} +% \put(2.75,0.875){\vector(1,3){0.25}} +% \put(2.75,0.875){\line(2,1){0.5}} +% \put(3.25,1.125){\vector(-1,-3){0.25}} + \put(2.70,0.350){\tikz{\draw[latex-latex](0.25,0.625)--(0,-0.12)--(0.5,0.12)--(0.25,-0.625);}} + \end{picture} +% \begin{pdfpic} +% \begin{pspicture}(6,2) +% \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} +% \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} +% \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) +% \end{pspicture} +% \end{pdfpic} + \end{center} + + \medskip + + {\large\color{structure}\textbf{"`Verschwendung von Rechenzeit -- na und?"'}} + + \medskip + + \pause + Große Stückzahlen + \begin{itemize} + \item + 138\,000 Toyota Prius V von Mai 2011 bis April 2012 + \end{itemize} + + \medskip + + \pause + Wertvolle Ressourcen + \begin{itemize} + \item + Fähigkeiten einer Raumsonde optimieren + % (Marsumlaufbahn: ab ca.~127\,000 Euro pro kg) + % 70000000 / 550000 = 127._27 + % http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/ + \only<.(1)>{\\[\medskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.3cm]{curiosity.jpg}}\vspace*{-1cm}} + \pause + \item + Implantat: Platz- und Stromverbrauch minimieren + \only<.(1)>{\\\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.4cm]{herzschrittmacher.jpg}}\vspace*{-1cm}} + \end{itemize} + + \bigskip + + \pause + \textarrow\ {\large\color{structure}\textbf{Echtzeitprogrammierung}}\\[2pt] + \strut \phantom{\textarrow} Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden + +\end{frame} + +\subsection{Echtzeitprogrammierung} + +\begin{frame} + + \showsubsection + + Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden + + \bigskip + + \alt<.(1)>{Aber wie?}{Beispiele für Lösungen:} + + \begin{itemize} + \pause + \item + ZigBee-Modul:\only<.(1)>{\hfill\makebox(0,0)[tr]{\includegraphics[width=5cm]{xbee.jpg}}}\\ + % http://commons.wikimedia.org/wiki/File:Arduino_xbee.JPG + Funk- vs.\ UART-Protokoll\\ + \textarrow\ dedizierte Hardware + \pause + \item + RP6:\\ + Motorsteuerung vs.\ Anwender-Software\\ + \textarrow\ spezielle Software + \only<.(1)>{\hfill\makebox(0,0)[r]{\includegraphics[width=5cm]{rp6.jpg}}} + \pause + \item + Quadrocopter:\\ + Motorsteuerung vs.\ Sensoren-Abfrage\\ + vs.\ Funk-Fernsteuerung \dots\\ + \textarrow\ spezielle Software + \only<.(1)>{\hfill\makebox(0,0)[br]{\includegraphics[width=5cm]{quadrocopter.jpg}}}\\ + \pause + \item + Flugzeugkabinensimulatortür:\\ + Türsteuerung vs.\ Bedienung\\ + \textarrow\ Echtzeitbetriebssystem + \only<.(1)>{\\[-3.2cm]\strut\hfill\makebox(0,0)[r]{\includegraphics[angle=-90,width=5cm]{dsc_8208.jpg}}} + \end{itemize} + +\end{frame} + +\begin{frame} + + \showsubsection + + Quadrocopter-Steuerung \emph{MultiWii} + \begin{itemize} + \item + Konfiguration durch bedingte Compilierung (Präprozessor) + \item + In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ + ansonsten zyklisch einer von bis zu 5 weiteren Tasks. + \end{itemize} + + \pause + + RP6-Steuerung + \begin{itemize} + \item + Konfiguration durch bedingte Compilierung (Präprozessor) + \item + Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ + Die Interrupt-Handler zählen Variable hoch. + \item + 10000mal pro Sekunde: Timer-Interrupt\\ + Durch Zähler im Interrupt-Handler: verschiedene Taktraten\\ + 1000mal pro Sekunde: Stopwatches\\ + 5mal pro Sekunde: Blinkende Power-On-LED\\ + 1000mal pro Sekunde: Bumper, ACS, PWM zur Motorsteuerung\\ + Geschwindigkeitsmessung durch Zählen der Ticks in 0.2\,s\\ + Anpassung der Motorkraft in $\pm$1-Schritten + \pause + \item + Nebenbei: \only<4->{1 }Benutzerprogramm + \end{itemize} + +\end{frame} + +\subsection{Multitasking} + +\begin{frame} + + \showsubsection + + \begin{itemize} + \item + \newterm{Kooperatives Multitasking}\\ + Prozesse geben freiwillig Rechenzeit ab + \item + \newterm{Präemptives Multitasking}\\ + Das Betriebssystem unterbricht laufende Prozesse\\ + (englisch: \emph{to pre-empt\/} -- jemandem zuvorkommen) + \bigskip + \item + \newterm{Scheduler}\\ + Steuerprogramm, das Prozessen Rechenzeit zuteilt + \item + \newterm{Kontextwechsel}\\ + Umschalten zwischen zwei Prozessen + \item + \newterm{Round-Robin-Verfahren (Rundlauf)}\\ + Zuteilung von \newterm{Zeitschlitzen\/} auf einer \newterm{Zeitscheibe} an die Prozesse + \bigskip + \pause + \item + Ausblick: Zuteilung von Rechenzeit = wichtiger Spezialfall\\ + allgemein: Zuteilung von Ressourcen + \end{itemize} + +\end{frame} + +\subsectionnonumber{Beispiele für Multitasking} + +\begin{frame} + + \showsubsectionnonumber + + Quadrocopter-Steuerung \emph{MultiWii} + \begin{itemize} + \item + Konfiguration durch bedingte Compilierung (Präprozessor) + \item + In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ + ansonsten zyklisch einer von bis zu 5 weiteren Tasks. + \end{itemize} + + RP6-Steuerung + \begin{itemize} + \item + Konfiguration durch bedingte Compilierung (Präprozessor) + \item + Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ + Die Interrupt-Handler zählen Variable hoch. + \item + 10000mal pro Sekunde: Timer-Interrupt\\ + verschiedene Tasks werden unterschiedlich häufig aufgerufen + \item + Nebenbei: 1 Benutzerprogramm + \end{itemize} + + Linux 0.01 + \begin{itemize} + \item + Timer-Interrupt:\only<2->{ Zähler des aktuellen Tasks wird dekrementiert;}\\ + Task mit höchstem Zähler bekommt Rechenzeit. + \item + Wenn es keinen laufbereiten Task mit positivem Zähler gibt,\\ + bekommen alle Tasks gemäß ihrer Priorität neue Zähler zugewiesen. + \item + \emph{keine\/} harte Echtzeit + % Aufgabe: Wo wird der Zähler heruntergezählt? + \end{itemize} + +\end{frame} + +\subsectionnonumber{Zombies} + +\begin{frame} + + \showsubsectionnonumber + + \pause + Wikipedia: + \begin{quote} + Als Zombie wird die fiktive Figur eines zum Leben erweckten + Toten (Untoter) oder eines seiner Seele beraubten, willenlosen + Wesens bezeichnet. Der Begriff leitet sich von dem Wort nzùmbe + aus der zentralafrikanischen Sprache Kimbundu ab und bezeichnet + dort ursprünglich einen Totengeist. + \end{quote} + + \bigskip + + \pause + Ein Zombie-Prozeß ist bereits beendet ("`tot"'),\\ + bekommt keine Rechenzeit mehr ("`seiner Seele beraubt"'),\\ + hat alle belegten Ressourcen wieder freigegeben ("`willenlos"'),\\ + wird aber noch in der Prozeßliste geführt ("`untot"'). + \begin{itemize} + \pause + \item + Warum? + \textarrow\ + Ein anderer Prozeß (Elternprozeß) wartet noch auf den + Rückgabewert des beendeten Prozesses. + \pause + \item + Schadet das? + \textarrow\ + Nein. + \pause + \item + Aber? + \textarrow\ + Wenn sich Zombie-Prozesse anhäufen, deutet dies auf einen + Prozeß hin, der andere Prozesse erzeugt und anschließend "`hängt"'. + \pause + \item + Beispiel: + Datenträger entfernt, zugreifender Prozeß "`hängt"'.\\ + \textarrow\ + Tochterprozesse werden zu Zombies. + \end{itemize} + +\end{frame} + +\subsectionnonumber{Multitasking} + +\begin{frame} + + \showsection + \showsubsection + + \begin{minipage}[t]{6cm} + Qualitätssicherung beim Multitasking + \begin{itemize} + \item<3-> + Verschiedene Anforderungen: + \newterm{Latenz\/} vs.\ \newterm{Jitter\/}\\ + vs.\ \newterm{Durchsatz} + \smallskip + \begin{onlyenv}<4> + \begin{itemize} + \item + \newterm{Latenz:} interaktive Anwendungen + \item + \newterm{Jitter:} Echtzeitanwendungen + \item + \newterm{Durchsatz:} Stapelverarbeitung + \end{itemize} + \vspace*{-3cm} + \end{onlyenv} + \item<5-> + Ressourcen reservieren:\\ + \newterm{Mutexe} + \only<6->{(= spezielle \newterm{Semaphore\/})\\} + \only<7->{\textarrow\ kommt gleich} + \item<8-> + Verschiedene Methoden\\ + der Priorisierung\\ + \textarrow\ später\\ + \strut + \item<9-> + Umgehung der Probleme durch + speziell geschriebene Software\\ + (MultiWii, RP6, \dots) + \end{itemize} + \end{minipage} + \hfill + \pause + \begin{minipage}[t]{6.2cm} + Qualitätssicherung für Netzwerke: + \begin{itemize} + \item + Verschiedene Anforderungen: + \newterm{Latenz\/} vs.\ \newterm{Jitter\/} vs.\ \newterm{Verluste\/}\\vs.\ \newterm{Durchsatz} + \item + Ressourcen reservieren:\\ + \newterm{IntServ} mit \newterm{Resource Reservation Protocol (RSVP)} + \item + Klassifizierung und Priorisierung: + \newterm{DiffServ} mit Type-of-Service-Bits (IPv4) + bzw.\ Traffic-Class-Bits (IPv6) im IP-Header + \item + Eigenes Protokoll (Telefondienste):\\ + \newterm{Asynchronous Transfer Mode (ATM)} + \end{itemize} + \end{minipage} + +\end{frame} + +\subsection{Ressourcen} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren + \begin{itemize} + \item + \newterm{Semaphor}\\ + gemeinsame Variable mehrerer Prozesse\\ + zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] + Ressource belegt \textarrow\ Kontextwechsel + \begin{onlyenv}<1> + \par\medskip + griechisch: \emph{sema\/} -- Zeichen, \emph{pherein\/} -- tragen\\ + "`Eisenbahnsignal"' + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Mutex}\\ + Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ + auf eine Ressource zugreifen kann + \begin{onlyenv}<2> + \par\medskip + englisch: \emph{mutual exclusion\/} -- wechselseitiger Ausschluß\\ + spezieller binärer Semaphor: nur "`Besitzer"' darf freigeben\\ + % allgemein: auch jemand anderer dürfte freigeben + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Spinlock} (\emph{busy waiting\/})\\ + leichtgewichtige Alternative zu Kontextwechsel + \begin{onlyenv}<3> + \par\medskip + englisch: \emph{spin\/} -- rotieren, \emph{lock\/} Sperre\\ + \emph{busy waiting} auf etwas Schnelles, z.\,B.\ auf einen Semaphor\\[\medskipamount] + Hardware-Unterstützung: + Prüfen, ob Variable bestimmten Wert hat;\\ + wenn ja, auf anderen Wert setzen; andere Prozessoren solange anhalten + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Kritischer Abschnitt -- critical section}\\ + Programmabschnitt zwischen Reservierung\\ + und Freigabe einer Ressource\\ + \textarrow\ sollte immer so kurz wie möglich sein + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren -- + Beispiel: \file{linux-3.7rc1} + \begin{itemize} + \item + \newterm{Semaphor}\\ + \file{kernel/semaphor.c}\\ + \file{drivers/usb/core/file.c} + \medskip + \item + \newterm{Mutex}\\ + \file{kernel/mutex.c}\\ + \file{drivers/usb/serial/usb-serial.c} + \medskip + \item + \newterm{Spinlock}\\ + \file{kernel/spinlock.c}\\ + \file{kernel/semaphor.c}, + \file{kernel/mutex.c} + \end{itemize} + + % Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren + + % evtl. Aufgabe: Warte-Problem + + % Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme + % das o.a. Zuteilungsproblem? + + % Danach: Semaphoren, Mutexe, Spinlocks + % Priorisierungsmethoden und -probleme + + % Festplatten: completely fair queueing + % cat /sys/block/sdc/queue/scheduler + % "noop" hat sich für SVG gelohnt + + % Virtualisierung + Kernel-Threads + Multiprozessorsystem = Chaos + +\end{frame} + +\begin{frame}[fragile] + + \textbf{Beispiel:} + \lstinline{usb_serial_get_by_index()} -- serielle Schnittstelle reservieren + + Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 + + \medskip + + \begin{lstlisting} + struct usb_serial *usb_serial_get_by_index (unsigned index) + { + struct usb_serial *serial; + mutex_lock (&table_lock); + serial = serial_table[index]; + if (serial) + { + mutex_lock (&serial->disc_mutex); + if (serial->disconnected) + { + mutex_unlock (&serial->disc_mutex); + serial = NULL; + } + else + kref_get (&serial->kref); + } + mutex_unlock (&table_lock); + return serial; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(5.1,6.85){\vector(-1,0){0.5}} + \put(5.2,6.85){\makebox(0,0)[l]{exklusiven Zugriff auf Tabelle sichern}} + \put(5.4,1.35){\vector(-1,0){0.5}} + \put(5.5,1.35){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Tabelle\\wieder freigeben}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{48cm} + +\begin{frame}[fragile] + + \lstinline{mutex_lock()} -- Ressource beanspruchen, notfalls warten + + Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 + + \medskip + + \begin{lstlisting} + void __sched mutex_lock (struct mutex *lock) + { + might_sleep (); + __mutex_fastpath_lock (&lock->count, __mutex_lock_slowpath); + mutex_set_owner (lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.6,1.35){\line(-1,0){1}} + \put(11.6,1.35){\line(0,-1){2.45}} + \put(11.6,-1.10){\vector(-1,0){2.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/arch/x86/include/asm/mutex\_32.h}, ab Zeile 24 + + Macro-Definition für \lstinline{__mutex_fastpath_lock} (expandiert) + + \medskip + + Assembler: + \begin{lstlisting}[language={[x86masm]Assembler}] + lock dec (lock->count) + jns 1 + call __mutex_lock_slowpath + 1: + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9,0.95){\line(-1,0){3.5}} + \put(9,0.95){\line(0,-1){2.5}} + \put(9.0,-1.55){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 398 + + \medskip + + \begin{lstlisting} + static __used noinline void __sched + __mutex_lock_slowpath (atomic_t *lock_count) + { + struct mutex *lock = container_of (lock_count, struct mutex, count); + __mutex_lock_common (lock, TASK_UNINTERRUPTIBLE, 0, + NULL, _RET_IP_); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.0,1.40){\line(-1,0){1.0}} + \put(11.0,1.40){\vector(0,-1){2.5}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 132 + + \medskip + + \begin{lstlisting} + static inline int __sched + __mutex_lock_common (struct mutex *lock, long state, unsigned int subclass, + struct lockdep_map *nest_lock, unsigned long ip) + { + struct task_struct *task = current; + struct mutex_waiter waiter; + unsigned long flags; + + preempt_disable (); + mutex_acquire_nest (&lock->dep_map, subclass, 0, nest_lock, ip); + + /* ... */ + + spin_lock_mutex (&lock->wait_lock, flags); + + debug_mutex_lock_common (lock, &waiter); + debug_mutex_add_waiter (lock, &waiter, task_thread_info (task)); + + /* add waiting tasks to the end of the waitqueue (FIFO): */ + list_add_tail (&waiter.list, &lock->wait_list); + waiter.task = task; + + if (atomic_xchg (&lock->count, -1) == 1) + goto done; + + lock_contended (&lock->dep_map, ip); + + for (;;) + { + /* + * Lets try to take the lock again - this is needed even if + * we get here for the first time (shortly after failing to + * acquire the lock), to make sure that we get a wakeup once + * it's unlocked. Later on, if we sleep, this is the + * operation that gives us the lock. We xchg it to -1, so + * that when we release the lock, we properly wake up the + * other waiters: + */ + if (atomic_xchg (&lock->count, -1) == 1) + break; + + /* + * got a signal? (This code gets eliminated in the + * TASK_UNINTERRUPTIBLE case.) + */ + if (unlikely (signal_pending_state (state, task))) + { + mutex_remove_waiter (lock, &waiter, task_thread_info (task)); + mutex_release (&lock->dep_map, 1, ip); + spin_unlock_mutex (&lock->wait_lock, flags); + + debug_mutex_free_waiter (&waiter); + preempt_enable (); + return -EINTR; + } + __set_task_state (task, state); + + /* didn't get the lock, go to sleep: */ + spin_unlock_mutex (&lock->wait_lock, flags); + schedule_preempt_disabled (); + spin_lock_mutex (&lock->wait_lock, flags); + } + + done: + lock_acquired (&lock->dep_map, ip); + /* got the lock - rejoice! */ + mutex_remove_waiter (lock, &waiter, current_thread_info ()); + mutex_set_owner (lock); + + /* set it to 0 if there are no waiters left: */ + if (likely (list_empty (&lock->wait_list))) + atomic_set (&lock->count, 0); + + spin_unlock_mutex (&lock->wait_lock, flags); + + debug_mutex_free_waiter (&waiter); + preempt_enable (); + + return 0; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(7.9,28.3){\vector(-1,0){0.5}} + \put(8.0,28.3){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff\\auf Mutex sichern}}} + \put(7.4,2.3){\vector(-1,1){0.4}} + \put(7.5,2.0){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Mutex\\wieder freigeben}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{40.5cm} + +\begin{frame}[fragile] + + \lstinline{spin_lock_mutex()} -- Mutex beanspruchen, notfalls \emph{busy waiting} + + Datei \file{linux-3.7-rc1/kernel/mutex.h}, ab Zeile 12 + + \medskip + + \begin{lstlisting} + #define spin_lock_mutex(lock, flags) \ + do \ + { \ + spin_lock (lock); \ + (void) (flags); \ + } \ + while (0) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(8.5,1.75){\line(-1,0){4.5}} + \put(8.5,1.75){\line(0,-1){2.9}} + \put(8.5,-1.15){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.h}, ab Zeile 283 + + \medskip + + \begin{lstlisting} + static inline void spin_lock (spinlock_t *lock) + { + raw_spin_lock (&lock->rlock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.3,0.95){\line(-1,0){4.0}} + \put(9.3,0.95){\line(0,-1){2.1}} + \put(9.3,-1.15){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.h}, Zeile 170 + + \medskip + + \begin{lstlisting} + #define raw_spin_lock(lock) _raw_spin_lock (lock) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.0,0.55){\line(-1,0){0.5}} + \put(10.0,0.55){\line(0,-1){1.7}} + \put(10.0,-1.15){\vector(-1,0){1.3}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/include/linux/spinlock\_api\_smp.h}, Zeile 47 + + \medskip + + \begin{lstlisting} + #define _raw_spin_lock(lock) __raw_spin_lock (lock) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.7,0.55){\line(-1,0){0.5}} + \put(10.7,0.55){\line(0,-1){1.75}} + \put(10.7,-1.2){\vector(-1,0){2.3}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.c}, ab Zeile 46 (expandiert): + + \medskip + + \begin{lstlisting} + void __lockfunc __raw_spin_lock (spinlock_t *lock) + { + for (;;) + { + preempt_disable (); + if (likely (do_raw_spin_trylock (lock))) + break; + preempt_enable (); + + if (!(lock)->break_lock) + (lock)->break_lock = 1; + while (!raw_spin_can_lock (lock) && (lock)->break_lock) + arch_spin_relax (&lock->raw_lock); + } + (lock)->break_lock = 0; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.7,4.75){\line(-1,0){3.5}} + \put(10.7,4.75){\line(0,-1){5.95}} + \put(10.7,-1.2){\vector(-1,0){1.1}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/include/linux/spinlock.h}, ab Zeile 150: + + \medskip + + \begin{lstlisting} + static inline int do_raw_spin_trylock (raw_spinlock_t *lock) + { + return arch_spin_trylock (&(lock)->raw_lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.5,0.95){\line(-1,0){3.5}} + \put(11.5,0.95){\line(0,-1){2.1}} + \put(11.5,-1.15){\vector(-1,0){0.7}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 116: + + \medskip + + \begin{lstlisting} + static __always_inline int arch_spin_trylock (arch_spinlock_t *lock) + { + return __ticket_spin_trylock (lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.5,0.95){\line(-1,0){3.5}} + \put(9.5,0.95){\vector(0,-1){1.7}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 65: + + \medskip + + \begin{lstlisting} + static __always_inline int __ticket_spin_trylock (arch_spinlock_t *lock) + { + arch_spinlock_t old, new; + + old.tickets = ACCESS_ONCE (lock->tickets); + if (old.tickets.head != old.tickets.tail) + return 0; + + new.head_tail = old.head_tail + (1 << TICKET_SHIFT); + + /* cmpxchg is a full barrier, so nothing can move before it */ + return cmpxchg (&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,0.3){\line(0,1){0.4}} + \put(9.0,0.3){\line(-1,0){6.8}} + \put(9.0,0.3){\line(0,-1){1.45}} + \put(9.0,-1.15){\vector(-1,0){3.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 147: + + \medskip + + \begin{lstlisting} + #define cmpxchg(ptr, old, new) \ + __cmpxchg (ptr, old, new, sizeof (*(ptr))) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.0,0.5){\line(-1,0){1.8}} + \put(9.0,0.5){\line(0,-1){1.65}} + \put(9.0,-1.15){\vector(-1,0){2.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 131: + + \medskip + + \begin{lstlisting} + #define __cmpxchg(ptr, old, new, size) \ + __raw_cmpxchg ((ptr), (old), (new), (size), LOCK_PREFIX) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,-0.1){\line(0,1){0.3}} + \put(9.0,-0.1){\line(-1,0){6.8}} + \put(9.0,-0.1){\line(0,-1){1.05}} + \put(9.0,-1.15){\vector(-1,0){2.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 110: + + \medskip + + \begin{lstlisting} + asm volatile (lock "cmpxchgl %2,%1" \ + : "=a" (__ret), "+m" (*__ptr) \ + : "r" (__new), "0" (__old) \ + : "memory"); + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.8,1.8){\vector(-1,0){0.6}} + \put(9.8,1.2){\line(0,1){0.6}} + \put(9.8,1.1){\makebox(0,0)[t]{\shortstack{atomarer und exklusiver\\Zugriff auf Spinlock\\durch Hardware-Unterstützung}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{\normalpdfpageheight} + +%\sectionnonumber{Literaturempfehlung} +%\subsectionnonumber{Automotive Embedded Systeme} +% +%\begin{frame}[c] +% +% \showsectionnonumber +% +% Prof.\ Dr.\ Joachim Wietzke, FH Darmstadt,\\ +% Prof.\ Dr.\ Manh Tien Tran, FH Kaiserslautern: +% +% \medskip +% +% \showsubsectionnonumber +% +% \vspace{-\medskipamount} +% +% Springer-Verlag, Berlin, Heidelberg 2005 +% +% \bigskip +% +% Lizenz: proprietär +% +% \medskip +% +% (gesetzt mit \textrm{\LaTeX}, ca.\ \EUR{10}) +% +%\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren + \begin{itemize} + \item + \newterm{Semaphor}\\ + gemeinsame Variable mehrerer Prozesse\\ + zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] + Ressource belegt \textarrow\ Kontextwechsel + \medskip + \item + \newterm{Mutex}\\ + Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ + auf eine Ressource zugreifen kann + \medskip + \item + \newterm{Spinlock} (\emph{busy waiting\/})\\ + leichtgewichtige Alternative zu Kontextwechsel + \medskip + \item + \newterm{Kritischer Abschnitt -- critical section}\\ + Programmabschnitt zwischen Reservierung\\ + und Freigabe einer Ressource\\ + \textarrow\ sollte immer so kurz wie möglich sein + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \begin{picture}(0,0) + \only<2-3>{\put(6.3,-7){\includegraphics[height=6cm]{philosophenproblem.jpg}}} + \end{picture}% + \newterm{Verklemmungen\/}: Gegenseitiges Blockieren von Ressourcen + \begin{itemize} + \item + \newterm{Deadlock\/}: Prozeß wartet + \item + \newterm{Livelock\/}: Prozeß macht andere Dinge\\ + (z.\,B.\ \emph{busy waiting\/}) + \end{itemize} + + \pause + \bigskip + + Beispiel: Philosophenproblem + + \only<2-3>{% + \begin{itemize} + \item + 5 Philosophen, 5 Gabeln + \item + 2 Gabeln zum Essen notwendig + \item + Wer essen will, nimmt eine Gabel\\ + und wartet notfalls auf die zweite. + \item + Keiner legt eine einzelne Gabel\\ + wieder zurück. + \end{itemize} + Jeder hält 1 Gabel \textarrow\ \newterm{Verklemmung}\\[0.5\smallskipamount] + \pause + \strut\quad schweigen \textarrow\ \newterm{Deadlock}\\ + \strut\quad philosophieren weiter \textarrow\ \newterm{Livelock}\\[-1cm] + } + \only<4->{% + \bigskip + + Bedingungen für Verklemmungen: + + \begin{minipage}[t]{4.5cm} + \begin{itemize} + \item + Exklusivität + \item + \newterm{hold and wait} + \item + Entzug nicht möglich + \item + zirkuläre Blockade + \end{itemize} + \end{minipage}\pause[5] + \begin{minipage}[t]{7.5cm} + \begin{itemize} + \arrowitem + Spooling + \arrowitem + simultane Zuteilung + \arrowitem + Prozesse suspendieren, beenden, \newterm{Rollback} + \arrowitem + Reihenfolge abhängig von Ressourcen + \end{itemize} + \end{minipage} + } + +\end{frame} + +\subsection{Prioritäten} + +\begin{frame} + + \showsection + \showsubsection + + Linux 0.01 + \begin{itemize} + \item + Timer-Interrupt: Zähler des aktuellen Prozesses wird dekrementiert;\\ + Prozeß mit höchstem Zähler bekommt Rechenzeit. + \item + Wenn es keinen laufbereiten Prozeß mit positivem Zähler gibt,\\ + bekommen alle Prozesse gemäß ihrer \newterm{Priorität\/} neue Zähler zugewiesen. + \item + \emph{keine\/} harte Echtzeit + \arrowitem + \newterm{dynamische Prioritätenvergabe\/}:\\ + Rechenzeit hängt vom Verhalten des Prozesses ab + \end{itemize} + + \medskip + + Echtzeitbetriebssysteme + \begin{itemize} + \item + Prozesse können einen festen Anteil an Rechenzeit bekommen. + \item + Bei Ereignissen können Prozesse hoher Priorität\\ + Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. + \arrowitem + \newterm{statische Prioritätenvergabe} + \end{itemize} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Echtzeitbetriebssysteme + \begin{itemize} + \item + Prozesse können einen festen Anteil an Rechenzeit bekommen. + \item + Bei Ereignissen können Prozesse hoher Priorität\\ + Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. + \end{itemize} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} + \put(3.7,1){{\color{lightgreen}\rule{0.6cm}{0.4cm}}} + \alt<1>{% + \put(7.9,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + }{% + \put(8.1,1){{\color{lightgreen}\rule{0.9cm}{0.4cm}}} + } + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + + \pause + + \put(4.6,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} + \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} + \put(7.7,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} + \put(0,2){\line(1,0){10}} + + \end{picture} + \end{center} + +\end{frame} + +\subsectionnonumber{Prioritäten \protect\color{darkgray}und Ressourcen} + +\begin{frame} + + \showsection + \showsubsection + + \only<4->{% + Der höher priorisierte Prozeß bewirkt selbst,\\ + daß er eine Ressource verspätet bekommt. + + \medskip + + \textarrow\ \newterm{begrenzte Prioritätsinversion} + + \medskip + + maximale Verzögerung: Länge des kritischen Bereichs + } + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \only<1-2>{\put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}}} + \only<3->{\put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}}} + \only<3-4>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + } + \only<5->{% + \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.7,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + } + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \only<1-2>{% + \put(5.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(6.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + } + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \only<2->{% + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} + \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} + \only<2-4>{% + \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<5->{% + \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.9,1){{\color{lightgreen}\rule{0.1cm}{0.4cm}}} + \put(5.6,1){{\color{lightgreen}\rule{0.2cm}{0.4cm}}} + } + \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \visible<4->{% + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ }\newterm{unbegrenzte Prioritätsinversion} + + \pause + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \only<2>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + } + \put(0,3){\line(1,0){10}} + + \only<2->{% + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + \alt<1-4>{% + \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} + }{% + \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} + } + \only<2>{% + \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<3-4>{% + \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} +% \put(3.9,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<2>{% + \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \put(0,1){\line(1,0){10}} + } + + \only<5->{% + \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} + \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} + \put(0,2){\line(1,0){10}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \medskip + + Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 + + \only<1>{% + \begin{center} + \includegraphics[width=8.7cm]{pathfinder.jpg} + \vspace*{-1.5cm} + \end{center} + } + + \bigskip + + \only<2>{% + Gegenmaßnahmen + \begin{itemize} + \item + \newterm{Priority Inheritance -- Prioritätsvererbung}\\ + Der Besitzer des Mutex erbt die Priorität\\ + des Prozesses, der auf den Mutex wartet. + \end{itemize} + + \bigskip + + \begin{minipage}{7.0cm} + \begin{flushright} + \url{http://research.microsoft.com/en-us/\\um/people/mbj/Mars\_Pathfinder/} + \end{flushright} + \end{minipage} + + \vspace{1.35cm}\strut\hfill\makebox(0,0)[br]{\includegraphics[height=2.8cm]{pathfinder.jpg}}\vspace*{-1cm} + } + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \bigskip + + Gegenmaßnahme: \newterm{Priority Inheritance -- Prioritätsvererbung} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + + \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} + \only<1-2>{% + \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} + } + \put(0,2){\line(1,0){10}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \only<2>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + } + + \only<3->{% + \put(3.4,3){{\color{medgreen}\rule{0.7cm}{0.4cm}}} + \put(4.1,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} + \put(4.9,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \bigskip + + Gegenmaßnahme: \newterm{Priority Ceiling -- Prioritätsobergrenze} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} +% \only<1>{% +% \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} +% } + \put(0,1){\line(1,0){10}} + +% \only<1>{% +% \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} +% \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} +% } + \put(0,2){\line(1,0){10}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} +% \only<1>{% +% \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} +% } + \put(0,3){\line(1,0){10}} + +% \only<2>{% +% \only<2>{% + \put(2.6,3){{\color{medgreen}\rule{0.9cm}{0.4cm}}} + \put(3.5,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.7,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} + \put(5.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} +% } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \medskip + + Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 + + \bigskip + + Gegenmaßnahmen + \begin{itemize} + \item + \newterm{Priority Inheritance -- Prioritätsvererbung}\\ + Der Besitzer des Mutex erbt die Priorität\\ + des Prozesses, der auf den Mutex wartet. + \smallskip + \item + \newterm{Priority Ceiling -- Prioritätsobergrenze}\\ + Der Besitzer des Mutex bekommt sofort\\ + die Priorität des höchstmöglichen Prozesses,\\ + der evtl.\ den Mutex benötigen könnte. + \pause + \begin{picture}(0,0) + \put(1.2,1.45){\makebox(0,0)[l]{$\left\}\rule{0pt}{1.7cm}\right.$ + \begin{minipage}{4cm} + nur möglich, wenn\\ + Mutexe im Spiel sind + \end{minipage}}} + \end{picture} + \smallskip + \pause + \item + \newterm{Priority Aging}\\ + Die Priorität wächst mit der Wartezeit. + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \begin{itemize} + \color{medgreen} + \item[4.1] Was sind Bus-Systeme? + \item[4.2] RS-232 + \item[4.3] \ItwoC\ (TWI) + \item[4.4] SPI + \item[4.5] Beispiel: Benutzung des \ItwoC-Busses + \end{itemize} + \item[\textbf{5}] \textbf{Echtzeit} + \begin{itemize} + \color{medgreen} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \item[5.3] Multitasking + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\end{document} diff --git a/20171116/herzschrittmacher.jpg b/20171116/herzschrittmacher.jpg new file mode 120000 index 0000000000000000000000000000000000000000..92d8f0053003cc555aec83f5d088f1cec822ad81 --- /dev/null +++ b/20171116/herzschrittmacher.jpg @@ -0,0 +1 @@ +../common/herzschrittmacher.jpg \ No newline at end of file diff --git a/20171116/kompass-messung.png b/20171116/kompass-messung.png new file mode 120000 index 0000000000000000000000000000000000000000..85cfa0d3840e7542ebb6dd2092be6c2a6e08fbb1 --- /dev/null +++ b/20171116/kompass-messung.png @@ -0,0 +1 @@ +../common/kompass-messung.png \ No newline at end of file diff --git a/20171116/kompassmodul-an-roboter.jpg b/20171116/kompassmodul-an-roboter.jpg new file mode 120000 index 0000000000000000000000000000000000000000..dab8b38c1a92bf8072d42dc3abcc07be54a58c7b --- /dev/null +++ b/20171116/kompassmodul-an-roboter.jpg @@ -0,0 +1 @@ +../common/kompassmodul-an-roboter.jpg \ No newline at end of file diff --git a/20171116/kompassmodul.jpg b/20171116/kompassmodul.jpg new file mode 120000 index 0000000000000000000000000000000000000000..be108a5341df13a693959dbe69b7b9541b36fc4c --- /dev/null +++ b/20171116/kompassmodul.jpg @@ -0,0 +1 @@ +../common/kompassmodul.jpg \ No newline at end of file diff --git a/20171116/logo-hochschule-bochum-cvh-text.pdf b/20171116/logo-hochschule-bochum-cvh-text.pdf new file mode 120000 index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c --- /dev/null +++ b/20171116/logo-hochschule-bochum-cvh-text.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20171116/logo-hochschule-bochum.pdf b/20171116/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20171116/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20171116/make-zombies.c b/20171116/make-zombies.c new file mode 100644 index 0000000000000000000000000000000000000000..3e1418aa5567a38d274cbb2ba1588d7e765823d4 --- /dev/null +++ b/20171116/make-zombies.c @@ -0,0 +1,39 @@ +#include <sys/wait.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +int main(void){ + pid_t pids[10]; // Platz f�r 10 Prozess-IDs (die Kindprozesse) + int i; // Laufvariable + + for (i = 0; i < 10; ++i) { + // Der Vaterprozess erzeugt nun einen Kindprozess, + // welcher unabh�ngig vom Vaterprozess mit der + // erneuten Ausf�hrung des Programms beginnt. + // Ein Kindprozess erzeugt keinen Fork von sich selbst. + pids[i] = fork(); + if (pids[i] == 0) { + // dann befinden wir uns in einem der 10 Kindprozesse + // Der erste Kindprozess wartet 10 Sekunden und jeder + // weitere Kindprozess wartet 1 Sekunde k�rzer als der + // vorige. + printf ("BRAINS! "); + sleep(10-i); + exit(0); // Kindprozess erfolgreich beenden + } + } +/* + // hier kommt nur der Vaterprozess vorbei + for (i = 0; i < 10; ++i){ + // Der Vaterprozess wartet nun, bis der Reihe nach jeder + // seiner 10 Kindprozesse beendet ist. Leider wird auf das + // Kind mit der l�ngsten Wartezeit zuerst gewartet. Obwohl + // die anderen Kinder l�ngst erfolgreich beendet wurden, + // blockiert das erste Kind eine Bereinigung der Prozesstabelle + waitpid(pids[i], NULL, 0); + } +*/ + while (1); + return 0; // Vaterprozess erfolgreich beenden +} diff --git a/20171116/motherboard-anschluesse.jpg b/20171116/motherboard-anschluesse.jpg new file mode 120000 index 0000000000000000000000000000000000000000..07335d7dff65c71a683588d2ed108485c4653fb7 --- /dev/null +++ b/20171116/motherboard-anschluesse.jpg @@ -0,0 +1 @@ +../common/motherboard-anschluesse.jpg \ No newline at end of file diff --git a/20171116/pathfinder.jpg b/20171116/pathfinder.jpg new file mode 120000 index 0000000000000000000000000000000000000000..23c6444fee26e0cf0dd2f8639484b00aa5021b59 --- /dev/null +++ b/20171116/pathfinder.jpg @@ -0,0 +1 @@ +../common/pathfinder.jpg \ No newline at end of file diff --git a/20171116/pgslides.sty b/20171116/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20171116/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file diff --git a/20171116/philosophenproblem.jpg b/20171116/philosophenproblem.jpg new file mode 120000 index 0000000000000000000000000000000000000000..26591b2ac2dddfd4786814baf3f19ecb67f1f5ee --- /dev/null +++ b/20171116/philosophenproblem.jpg @@ -0,0 +1 @@ +../common/philosophenproblem.jpg \ No newline at end of file diff --git a/20171116/photo-20171116-152713.jpg b/20171116/photo-20171116-152713.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dcca28aba3dab5d07c1e6e638ed696ed05f03e2 Binary files /dev/null and b/20171116/photo-20171116-152713.jpg differ diff --git a/20171116/quadrocopter.jpg b/20171116/quadrocopter.jpg new file mode 120000 index 0000000000000000000000000000000000000000..7eaf0c024b63b7bc1dd3df2c17c8ab93f67fc15c --- /dev/null +++ b/20171116/quadrocopter.jpg @@ -0,0 +1 @@ +../common/quadrocopter.jpg \ No newline at end of file diff --git a/20171116/rp6.jpg b/20171116/rp6.jpg new file mode 120000 index 0000000000000000000000000000000000000000..2a0ecff23845770c3a98178eca6dce3ec73aca58 --- /dev/null +++ b/20171116/rp6.jpg @@ -0,0 +1 @@ +../common/rp6.jpg \ No newline at end of file diff --git a/20171116/rs-232.pdf b/20171116/rs-232.pdf new file mode 100644 index 0000000000000000000000000000000000000000..236ef5bf182048842613c5416b91afb68f451fa6 Binary files /dev/null and b/20171116/rs-232.pdf differ diff --git a/20171116/rs-232.tex b/20171116/rs-232.tex new file mode 100644 index 0000000000000000000000000000000000000000..a174692f177abe0d0ff1afd7e6783160485b5a22 --- /dev/null +++ b/20171116/rs-232.tex @@ -0,0 +1,97 @@ +% rs-232.pdf - Illustration of the RS-232 Protocol +% Copyright (C) 2011, 2016 Peter Gerwinski +% +% based on http://de.wikipedia.org/w/index.php?title=Datei:RS-232_timing.png&filetimestamp=20050719153204 +% Copyright (C) 2005 Wikipedia-Autor Gerald.deppe, released into Public Domain +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{rotating} + +\setbeamertemplate{footline}{} + +\begin{document} + +\begin{frame} + \vspace*{-0.65cm} + \begin{center} + \includegraphics[width=12cm]{RS-232_timing-no-text.png}\\ + \begin{picture}(12,1) + \footnotesize + \put(0.1,9.17){\mbox{Synchronisation}} + \put(0.1,8.77){\mbox{Daten}} + \put(0.1,8.37){\mbox{Check}} +% \put(3,8.77){\mbox{9600\,8O1 = 9600\,Baud, 8 Daten-Bits, ungerade Parität (odd), 1 Stopp-Bit}} + \put(3,9.17){\mbox{9600\,Baud, 8 Daten-Bits, ungerade Parität, 1 Stopp-Bit}} + \put(3,8.77){\mbox{Beispiel-Daten: ASCII "`G"' = 71 = 0100\,0111 binär}} + \put(3,8.37){\mbox{Übertragung der Daten von rechts (Bit 0) nach links (Bit 7)}} + \put(2.000,6.4){\begin{rotate}{90}Ruhe\end{rotate}} + \put(2.900,6.4){\begin{rotate}{90}Start-Bit\end{rotate}} +% \put(3.569,6.4){\begin{rotate}{90}LSB 0\end{rotate}} + \put(3.569,6.4){\begin{rotate}{90}Bit 0\end{rotate}} + \put(4.238,6.4){\begin{rotate}{90}Bit 1\end{rotate}} + \put(4.907,6.4){\begin{rotate}{90}Bit 2\end{rotate}} + \put(5.576,6.4){\begin{rotate}{90}Bit 3\end{rotate}} + \put(6.245,6.4){\begin{rotate}{90}Bit 4\end{rotate}} + \put(6.914,6.4){\begin{rotate}{90}Bit 5\end{rotate}} + \put(7.583,6.4){\begin{rotate}{90}Bit 6\end{rotate}} +% \put(8.252,6.4){\begin{rotate}{90}MSB 7\end{rotate}} + \put(8.252,6.4){\begin{rotate}{90}Bit 7\end{rotate}} + \put(8.921,6.4){\begin{rotate}{90}Parität\end{rotate}} + \put(9.590,6.4){\begin{rotate}{90}Stopp-Bit\end{rotate}} + \put(10.09175,6.4){\begin{rotate}{90}Ruhe\end{rotate}} + \put(10.5935,6.4){\begin{rotate}{90}Start-Bit\end{rotate}} + \put(11.2625,6.4){\begin{rotate}{90}\dots\end{rotate}} + \put(2.000,4.4){\makebox(0,0)[br]{1}} + \put(2.900,4.4){\makebox(0,0)[br]{0}} + \put(3.569,4.4){\makebox(0,0)[br]{1}} + \put(4.238,4.4){\makebox(0,0)[br]{1}} + \put(4.907,4.4){\makebox(0,0)[br]{1}} + \put(5.576,4.4){\makebox(0,0)[br]{0}} + \put(6.245,4.4){\makebox(0,0)[br]{0}} + \put(6.914,4.4){\makebox(0,0)[br]{0}} + \put(7.583,4.4){\makebox(0,0)[br]{1}} + \put(8.252,4.4){\makebox(0,0)[br]{0}} + \put(8.921,4.4){\makebox(0,0)[br]{1}} + \put(9.590,4.4){\makebox(0,0)[br]{1}} + \put(10.09175,4.4){\makebox(0,0)[br]{1}} + \put(10.5935,4.4){\makebox(0,0)[br]{0}} + \put(0.1,5.60){\mbox{logisch 1}} + \put(0.1,5.20){\mbox{logisch 0}} + \put(1,3.8){\makebox(0,0)[r]{$\sf +15$\,V}} + \put(1,2.8){\makebox(0,0)[r]{$\sf +3$\,V}} + \put(1,2.5){\makebox(0,0)[r]{$\sf 0$\,V}} + \put(1,2.2){\makebox(0,0)[r]{$\sf -3$\,V}} + \put(1,1.2){\makebox(0,0)[r]{$\sf -15$\,V}} + \put(1.2,0.6){\vector(1,0){9.6}} + \put(10.8,0.3){\makebox(0,0)[tr]{Zeit/s}} + \multiput(2.45,0.6)(0.669,0){13}{\line(0,-1){0.1}} + \put(2.45,0.4){\makebox(0,0)[t]{\sf 0}} + \put(3.119,0.4){\makebox(0,0)[t]{$\sf\frac{1}{9600}$}} + \put(5.795,0,4){\makebox(0,0)[t]{$\sf\frac{5}{9600}$}} + \put(9.140,0,4){\makebox(0,0)[t]{$\sf\frac{10}{9600}$}} + \end{picture} + \end{center} +\end{frame} + +\end{document} diff --git a/20171116/xbee.jpg b/20171116/xbee.jpg new file mode 120000 index 0000000000000000000000000000000000000000..ff0adff2eadf3d9b775d03cea8cf1f118534e2b9 --- /dev/null +++ b/20171116/xbee.jpg @@ -0,0 +1 @@ +../common/xbee.jpg \ No newline at end of file diff --git a/20171123/Retribution_Engine_Screenshot_120807.jpg b/20171123/Retribution_Engine_Screenshot_120807.jpg new file mode 120000 index 0000000000000000000000000000000000000000..19f4cb3e4aae1e24c3466a25b2c0e5ad90ee49e7 --- /dev/null +++ b/20171123/Retribution_Engine_Screenshot_120807.jpg @@ -0,0 +1 @@ +../common/Retribution_Engine_Screenshot_120807.jpg \ No newline at end of file diff --git a/20171123/Telefon_t-sinus-700.jpg b/20171123/Telefon_t-sinus-700.jpg new file mode 120000 index 0000000000000000000000000000000000000000..27c322c50b0f05edc8b07cfb0cc99b1876eb506d --- /dev/null +++ b/20171123/Telefon_t-sinus-700.jpg @@ -0,0 +1 @@ +../common/Telefon_t-sinus-700.jpg \ No newline at end of file diff --git a/20171123/Zeichen_123.pdf b/20171123/Zeichen_123.pdf new file mode 120000 index 0000000000000000000000000000000000000000..fdbc897227df059cfda790a16555e6e417682116 --- /dev/null +++ b/20171123/Zeichen_123.pdf @@ -0,0 +1 @@ +../common/Zeichen_123.pdf \ No newline at end of file diff --git a/20171123/a380.jpg b/20171123/a380.jpg new file mode 120000 index 0000000000000000000000000000000000000000..33a5d1fd18843bf7385e5a6d90f69af9fd8720da --- /dev/null +++ b/20171123/a380.jpg @@ -0,0 +1 @@ +../common/a380.jpg \ No newline at end of file diff --git a/20171123/curiosity.jpg b/20171123/curiosity.jpg new file mode 120000 index 0000000000000000000000000000000000000000..4452844da537414b751c5283ca8468b3ced9afb3 --- /dev/null +++ b/20171123/curiosity.jpg @@ -0,0 +1 @@ +../common/curiosity.jpg \ No newline at end of file diff --git a/20171123/dsc_8208.jpg b/20171123/dsc_8208.jpg new file mode 120000 index 0000000000000000000000000000000000000000..5796341ebc774aa09965a3a29854c65ce1144fb8 --- /dev/null +++ b/20171123/dsc_8208.jpg @@ -0,0 +1 @@ +../common/dsc_8208.jpg \ No newline at end of file diff --git a/20171123/env.cgi b/20171123/env.cgi new file mode 100755 index 0000000000000000000000000000000000000000..221c600b2510c4847b16c33db2788a13ce1a5549 --- /dev/null +++ b/20171123/env.cgi @@ -0,0 +1,20 @@ +#!/bin/bash + +echo Content-Type: text/plain +echo + +echo "Hello, world!" +echo + +echo "Hier meine Eingabedaten:" +echo +cat +echo +echo + +echo "Hier meine Umgebungsvariablen:" +echo +set +echo + +echo "Tschüs!" diff --git a/20171123/es-20171123.pdf b/20171123/es-20171123.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e90c6ca2c57135ab8eed85c595f76600d7a12709 Binary files /dev/null and b/20171123/es-20171123.pdf differ diff --git a/20171123/es-20171123.tex b/20171123/es-20171123.tex new file mode 100644 index 0000000000000000000000000000000000000000..ac929c8483ed39923262f612207fe82a61247ec0 --- /dev/null +++ b/20171123/es-20171123.tex @@ -0,0 +1,1522 @@ +% es-20171123.pdf - Lecture Slides on Embedded Systems +% Copyright (C) 2013, 2014, 2015, 2016, 2017 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +% README: Bus-Systeme, evtl. Echtzeit + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{rotating} +\usepackage{tikz} +\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} + +\newrgbcolor{lightyellow}{0.95 0.85 0.0} +\newrgbcolor{lightorange}{1.0 0.7 0.0} +\newrgbcolor{lightgreen}{0.0 0.8 0.0} + +\newcommand{\underconstruction}{\vspace*{-5cm plus 1filll}% + \begin{picture}(0,0) + \put(9,1.3){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}} + \put(9,1.0){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}} + \end{picture}} + +\title{Vertiefung Systemtechnik\\Eingebettete Systeme} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{23.\ November 2017} + +\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} + +\begin{document} + +\newlength{\normalpdfpageheight} +\setlength{\normalpdfpageheight}{\pdfpageheight} + +\maketitleframe + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \item[\textbf{6}] \textbf{Echtzeit} + \begin{itemize} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \item[5.3] Multitasking + \color{medgreen} + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \color{red} + \item[5.6] Echtzeitbetriebssysteme + \end{itemize} + \item[\textbf{6}] \textbf{Web-Interfaces} + \begin{itemize} + \color{red} + \item[6.1] HTTP, HTML und CGI + \item[6.2] Externe CGI-Skripte, GET und POST + \item[6.3] Skript im Server: PHP + \item[6.4] Server im Skript: Twisted + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\setcounter{section}{4} +\section{Echtzeit} +\setcounter{subsection}{3} +\subsection{Ressourcen} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren + \begin{itemize} + \item + \newterm{Semaphor}\\ + gemeinsame Variable mehrerer Prozesse\\ + zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] + Ressource belegt \textarrow\ Kontextwechsel + \begin{onlyenv}<1> + \par\medskip + griechisch: \emph{sema\/} -- Zeichen, \emph{pherein\/} -- tragen\\ + "`Eisenbahnsignal"' + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Mutex}\\ + Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ + auf eine Ressource zugreifen kann + \begin{onlyenv}<2> + \par\medskip + englisch: \emph{mutual exclusion\/} -- wechselseitiger Ausschluß\\ + spezieller binärer Semaphor: nur "`Besitzer"' darf freigeben\\ + % allgemein: auch jemand anderer dürfte freigeben + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Spinlock} (\emph{busy waiting\/})\\ + leichtgewichtige Alternative zu Kontextwechsel + \begin{onlyenv}<3> + \par\medskip + englisch: \emph{spin\/} -- rotieren, \emph{lock\/} Sperre\\ + \emph{busy waiting} auf etwas Schnelles, z.\,B.\ auf einen Semaphor\\[\medskipamount] + Hardware-Unterstützung: + Prüfen, ob Variable bestimmten Wert hat;\\ + wenn ja, auf anderen Wert setzen; andere Prozessoren solange anhalten + \vspace*{-3cm} + \end{onlyenv} + \pause + \medskip + \item + \newterm{Kritischer Abschnitt -- critical section}\\ + Programmabschnitt zwischen Reservierung\\ + und Freigabe einer Ressource\\ + \textarrow\ sollte immer so kurz wie möglich sein + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren -- + Beispiel: \file{linux-3.7rc1} + \begin{itemize} + \item + \newterm{Semaphor}\\ + \file{kernel/semaphor.c}\\ + \file{drivers/usb/core/file.c} + \medskip + \item + \newterm{Mutex}\\ + \file{kernel/mutex.c}\\ + \file{drivers/usb/serial/usb-serial.c} + \medskip + \item + \newterm{Spinlock}\\ + \file{kernel/spinlock.c}\\ + \file{kernel/semaphor.c}, + \file{kernel/mutex.c} + \end{itemize} + + % Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren + + % evtl. Aufgabe: Warte-Problem + + % Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme + % das o.a. Zuteilungsproblem? + + % Danach: Semaphoren, Mutexe, Spinlocks + % Priorisierungsmethoden und -probleme + + % Festplatten: completely fair queueing + % cat /sys/block/sdc/queue/scheduler + % "noop" hat sich für SVG gelohnt + + % Virtualisierung + Kernel-Threads + Multiprozessorsystem = Chaos + +\end{frame} + +\begin{frame}[fragile] + + \textbf{Beispiel:} + \lstinline{usb_serial_get_by_index()} -- serielle Schnittstelle reservieren + + Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 + + \medskip + + \begin{lstlisting} + struct usb_serial *usb_serial_get_by_index (unsigned index) + { + struct usb_serial *serial; + mutex_lock (&table_lock); + serial = serial_table[index]; + if (serial) + { + mutex_lock (&serial->disc_mutex); + if (serial->disconnected) + { + mutex_unlock (&serial->disc_mutex); + serial = NULL; + } + else + kref_get (&serial->kref); + } + mutex_unlock (&table_lock); + return serial; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(5.1,6.85){\vector(-1,0){0.5}} + \put(5.2,6.85){\makebox(0,0)[l]{exklusiven Zugriff auf Tabelle sichern}} + \put(5.4,1.35){\vector(-1,0){0.5}} + \put(5.5,1.35){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Tabelle\\wieder freigeben}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{48cm} + +\begin{frame}[fragile] + + \lstinline{mutex_lock()} -- Ressource beanspruchen, notfalls warten + + Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 + + \medskip + + \begin{lstlisting} + void __sched mutex_lock (struct mutex *lock) + { + might_sleep (); + __mutex_fastpath_lock (&lock->count, __mutex_lock_slowpath); + mutex_set_owner (lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.6,1.35){\line(-1,0){1}} + \put(11.6,1.35){\line(0,-1){2.45}} + \put(11.6,-1.10){\vector(-1,0){2.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/arch/x86/include/asm/mutex\_32.h}, ab Zeile 24 + + Macro-Definition für \lstinline{__mutex_fastpath_lock} (expandiert) + + \medskip + + Assembler: + \begin{lstlisting}[language={[x86masm]Assembler}] + lock dec (lock->count) + jns 1 + call __mutex_lock_slowpath + 1: + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9,0.95){\line(-1,0){3.5}} + \put(9,0.95){\line(0,-1){2.5}} + \put(9.0,-1.55){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 398 + + \medskip + + \begin{lstlisting} + static __used noinline void __sched + __mutex_lock_slowpath (atomic_t *lock_count) + { + struct mutex *lock = container_of (lock_count, struct mutex, count); + __mutex_lock_common (lock, TASK_UNINTERRUPTIBLE, 0, + NULL, _RET_IP_); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.0,1.40){\line(-1,0){1.0}} + \put(11.0,1.40){\vector(0,-1){2.5}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 132 + + \medskip + + \begin{lstlisting} + static inline int __sched + __mutex_lock_common (struct mutex *lock, long state, unsigned int subclass, + struct lockdep_map *nest_lock, unsigned long ip) + { + struct task_struct *task = current; + struct mutex_waiter waiter; + unsigned long flags; + + preempt_disable (); + mutex_acquire_nest (&lock->dep_map, subclass, 0, nest_lock, ip); + + /* ... */ + + spin_lock_mutex (&lock->wait_lock, flags); + + debug_mutex_lock_common (lock, &waiter); + debug_mutex_add_waiter (lock, &waiter, task_thread_info (task)); + + /* add waiting tasks to the end of the waitqueue (FIFO): */ + list_add_tail (&waiter.list, &lock->wait_list); + waiter.task = task; + + if (atomic_xchg (&lock->count, -1) == 1) + goto done; + + lock_contended (&lock->dep_map, ip); + + for (;;) + { + /* + * Lets try to take the lock again - this is needed even if + * we get here for the first time (shortly after failing to + * acquire the lock), to make sure that we get a wakeup once + * it's unlocked. Later on, if we sleep, this is the + * operation that gives us the lock. We xchg it to -1, so + * that when we release the lock, we properly wake up the + * other waiters: + */ + if (atomic_xchg (&lock->count, -1) == 1) + break; + + /* + * got a signal? (This code gets eliminated in the + * TASK_UNINTERRUPTIBLE case.) + */ + if (unlikely (signal_pending_state (state, task))) + { + mutex_remove_waiter (lock, &waiter, task_thread_info (task)); + mutex_release (&lock->dep_map, 1, ip); + spin_unlock_mutex (&lock->wait_lock, flags); + + debug_mutex_free_waiter (&waiter); + preempt_enable (); + return -EINTR; + } + __set_task_state (task, state); + + /* didn't get the lock, go to sleep: */ + spin_unlock_mutex (&lock->wait_lock, flags); + schedule_preempt_disabled (); + spin_lock_mutex (&lock->wait_lock, flags); + } + + done: + lock_acquired (&lock->dep_map, ip); + /* got the lock - rejoice! */ + mutex_remove_waiter (lock, &waiter, current_thread_info ()); + mutex_set_owner (lock); + + /* set it to 0 if there are no waiters left: */ + if (likely (list_empty (&lock->wait_list))) + atomic_set (&lock->count, 0); + + spin_unlock_mutex (&lock->wait_lock, flags); + + debug_mutex_free_waiter (&waiter); + preempt_enable (); + + return 0; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(7.9,28.3){\vector(-1,0){0.5}} + \put(8.0,28.3){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff\\auf Mutex sichern}}} + \put(7.4,2.3){\vector(-1,1){0.4}} + \put(7.5,2.0){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Mutex\\wieder freigeben}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{40.5cm} + +\begin{frame}[fragile] + + \lstinline{spin_lock_mutex()} -- Mutex beanspruchen, notfalls \emph{busy waiting} + + Datei \file{linux-3.7-rc1/kernel/mutex.h}, ab Zeile 12 + + \medskip + + \begin{lstlisting} + #define spin_lock_mutex(lock, flags) \ + do \ + { \ + spin_lock (lock); \ + (void) (flags); \ + } \ + while (0) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(8.5,1.75){\line(-1,0){4.5}} + \put(8.5,1.75){\line(0,-1){2.9}} + \put(8.5,-1.15){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.h}, ab Zeile 283 + + \medskip + + \begin{lstlisting} + static inline void spin_lock (spinlock_t *lock) + { + raw_spin_lock (&lock->rlock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.3,0.95){\line(-1,0){4.0}} + \put(9.3,0.95){\line(0,-1){2.1}} + \put(9.3,-1.15){\vector(-1,0){1.0}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.h}, Zeile 170 + + \medskip + + \begin{lstlisting} + #define raw_spin_lock(lock) _raw_spin_lock (lock) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.0,0.55){\line(-1,0){0.5}} + \put(10.0,0.55){\line(0,-1){1.7}} + \put(10.0,-1.15){\vector(-1,0){1.3}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/include/linux/spinlock\_api\_smp.h}, Zeile 47 + + \medskip + + \begin{lstlisting} + #define _raw_spin_lock(lock) __raw_spin_lock (lock) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.7,0.55){\line(-1,0){0.5}} + \put(10.7,0.55){\line(0,-1){1.75}} + \put(10.7,-1.2){\vector(-1,0){2.3}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/kernel/spinlock.c}, ab Zeile 46 (expandiert): + + \medskip + + \begin{lstlisting} + void __lockfunc __raw_spin_lock (spinlock_t *lock) + { + for (;;) + { + preempt_disable (); + if (likely (do_raw_spin_trylock (lock))) + break; + preempt_enable (); + + if (!(lock)->break_lock) + (lock)->break_lock = 1; + while (!raw_spin_can_lock (lock) && (lock)->break_lock) + arch_spin_relax (&lock->raw_lock); + } + (lock)->break_lock = 0; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(10.7,4.75){\line(-1,0){3.5}} + \put(10.7,4.75){\line(0,-1){5.95}} + \put(10.7,-1.2){\vector(-1,0){1.1}} + \end{picture} + + \bigskip + + Datei \file{linux-3.7-rc1/include/linux/spinlock.h}, ab Zeile 150: + + \medskip + + \begin{lstlisting} + static inline int do_raw_spin_trylock (raw_spinlock_t *lock) + { + return arch_spin_trylock (&(lock)->raw_lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(11.5,0.95){\line(-1,0){3.5}} + \put(11.5,0.95){\line(0,-1){2.1}} + \put(11.5,-1.15){\vector(-1,0){0.7}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 116: + + \medskip + + \begin{lstlisting} + static __always_inline int arch_spin_trylock (arch_spinlock_t *lock) + { + return __ticket_spin_trylock (lock); + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.5,0.95){\line(-1,0){3.5}} + \put(9.5,0.95){\vector(0,-1){1.7}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 65: + + \medskip + + \begin{lstlisting} + static __always_inline int __ticket_spin_trylock (arch_spinlock_t *lock) + { + arch_spinlock_t old, new; + + old.tickets = ACCESS_ONCE (lock->tickets); + if (old.tickets.head != old.tickets.tail) + return 0; + + new.head_tail = old.head_tail + (1 << TICKET_SHIFT); + + /* cmpxchg is a full barrier, so nothing can move before it */ + return cmpxchg (&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,0.3){\line(0,1){0.4}} + \put(9.0,0.3){\line(-1,0){6.8}} + \put(9.0,0.3){\line(0,-1){1.45}} + \put(9.0,-1.15){\vector(-1,0){3.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 147: + + \medskip + + \begin{lstlisting} + #define cmpxchg(ptr, old, new) \ + __cmpxchg (ptr, old, new, sizeof (*(ptr))) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.0,0.5){\line(-1,0){1.8}} + \put(9.0,0.5){\line(0,-1){1.65}} + \put(9.0,-1.15){\vector(-1,0){2.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 131: + + \medskip + + \begin{lstlisting} + #define __cmpxchg(ptr, old, new, size) \ + __raw_cmpxchg ((ptr), (old), (new), (size), LOCK_PREFIX) + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,-0.1){\line(0,1){0.3}} + \put(9.0,-0.1){\line(-1,0){6.8}} + \put(9.0,-0.1){\line(0,-1){1.05}} + \put(9.0,-1.15){\vector(-1,0){2.2}} + \end{picture} + + \bigskip + + Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 110: + + \medskip + + \begin{lstlisting} + asm volatile (lock "cmpxchgl %2,%1" \ + : "=a" (__ret), "+m" (*__ptr) \ + : "r" (__new), "0" (__old) \ + : "memory"); + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(9.8,1.8){\vector(-1,0){0.6}} + \put(9.8,1.2){\line(0,1){0.6}} + \put(9.8,1.1){\makebox(0,0)[t]{\shortstack{atomarer und exklusiver\\Zugriff auf Spinlock\\durch Hardware-Unterstützung}}} + \end{picture} + +\end{frame} + +\setlength{\pdfpageheight}{\normalpdfpageheight} + +%\sectionnonumber{Literaturempfehlung} +%\subsectionnonumber{Automotive Embedded Systeme} +% +%\begin{frame}[c] +% +% \showsectionnonumber +% +% Prof.\ Dr.\ Joachim Wietzke, FH Darmstadt,\\ +% Prof.\ Dr.\ Manh Tien Tran, FH Kaiserslautern: +% +% \medskip +% +% \showsubsectionnonumber +% +% \vspace{-\medskipamount} +% +% Springer-Verlag, Berlin, Heidelberg 2005 +% +% \bigskip +% +% Lizenz: proprietär +% +% \medskip +% +% (gesetzt mit \textrm{\LaTeX}, ca.\ \EUR{10}) +% +%\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ressourcen reservieren + \begin{itemize} + \item + \newterm{Semaphor}\\ + gemeinsame Variable mehrerer Prozesse\\ + zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] + Ressource belegt \textarrow\ Kontextwechsel + \medskip + \item + \newterm{Mutex}\\ + Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ + auf eine Ressource zugreifen kann + \medskip + \item + \newterm{Spinlock} (\emph{busy waiting\/})\\ + leichtgewichtige Alternative zu Kontextwechsel + \medskip + \item + \newterm{Kritischer Abschnitt -- critical section}\\ + Programmabschnitt zwischen Reservierung\\ + und Freigabe einer Ressource\\ + \textarrow\ sollte immer so kurz wie möglich sein + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \begin{picture}(0,0) + \only<2-3>{\put(6.3,-7){\includegraphics[height=6cm]{philosophenproblem.jpg}}} + \end{picture}% + \newterm{Verklemmungen\/}: Gegenseitiges Blockieren von Ressourcen + \begin{itemize} + \item + \newterm{Deadlock\/}: Prozeß wartet + \item + \newterm{Livelock\/}: Prozeß macht andere Dinge\\ + (z.\,B.\ \emph{busy waiting\/}) + \end{itemize} + + \pause + \bigskip + + Beispiel: Philosophenproblem + + \only<2-3>{% + \begin{itemize} + \item + 5 Philosophen, 5 Gabeln + \item + 2 Gabeln zum Essen notwendig + \item + Wer essen will, nimmt eine Gabel\\ + und wartet notfalls auf die zweite. + \item + Keiner legt eine einzelne Gabel\\ + wieder zurück. + \end{itemize} + Jeder hält 1 Gabel \textarrow\ \newterm{Verklemmung}\\[0.5\smallskipamount] + \pause + \strut\quad schweigen \textarrow\ \newterm{Deadlock}\\ + \strut\quad philosophieren weiter \textarrow\ \newterm{Livelock}\\[-1cm] + } + \only<4->{% + \bigskip + + Bedingungen für Verklemmungen: + + \begin{minipage}[t]{4.5cm} + \begin{itemize} + \item + Exklusivität + \item + \newterm{hold and wait} + \item + Entzug nicht möglich + \item + zirkuläre Blockade + \end{itemize} + \end{minipage}\pause[5] + \begin{minipage}[t]{7.5cm} + \begin{itemize} + \arrowitem + Spooling + \arrowitem + simultane Zuteilung + \arrowitem + Prozesse suspendieren, beenden, \newterm{Rollback} + \arrowitem + Reihenfolge abhängig von Ressourcen + \end{itemize} + \end{minipage} + } + +\end{frame} + +\subsection{Prioritäten} + +\begin{frame} + + \showsection + \showsubsection + + Linux 0.01 + \begin{itemize} + \item + Timer-Interrupt: Zähler des aktuellen Prozesses wird dekrementiert;\\ + Prozeß mit höchstem Zähler bekommt Rechenzeit. + \item + Wenn es keinen laufbereiten Prozeß mit positivem Zähler gibt,\\ + bekommen alle Prozesse gemäß ihrer \newterm{Priorität\/} neue Zähler zugewiesen. + \item + \emph{keine\/} harte Echtzeit + \arrowitem + \newterm{dynamische Prioritätenvergabe\/}:\\ + Rechenzeit hängt vom Verhalten des Prozesses ab + \end{itemize} + + \medskip + + Echtzeitbetriebssysteme + \begin{itemize} + \item + Prozesse können einen festen Anteil an Rechenzeit bekommen. + \item + Bei Ereignissen können Prozesse hoher Priorität\\ + Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. + \arrowitem + \newterm{statische Prioritätenvergabe} + \end{itemize} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Echtzeitbetriebssysteme + \begin{itemize} + \item + Prozesse können einen festen Anteil an Rechenzeit bekommen. + \item + Bei Ereignissen können Prozesse hoher Priorität\\ + Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. + \end{itemize} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} + \put(3.7,1){{\color{lightgreen}\rule{0.6cm}{0.4cm}}} + \alt<1>{% + \put(7.9,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + }{% + \put(8.1,1){{\color{lightgreen}\rule{0.9cm}{0.4cm}}} + } + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + + \pause + + \put(4.6,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} + \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} + \put(7.7,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} + \put(0,2){\line(1,0){10}} + + \end{picture} + \end{center} + +\end{frame} + +\subsectionnonumber{Prioritäten \protect\color{darkgray}und Ressourcen} + +\begin{frame} + + \showsection + \showsubsection + + \only<4->{% + Der höher priorisierte Prozeß bewirkt selbst,\\ + daß er eine Ressource verspätet bekommt. + + \medskip + + \textarrow\ \newterm{begrenzte Prioritätsinversion} + + \medskip + + maximale Verzögerung: Länge des kritischen Bereichs + } + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \only<1-2>{\put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}}} + \only<3->{\put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}}} + \only<3-4>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + } + \only<5->{% + \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.7,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + } + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \only<1-2>{% + \put(5.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(6.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + } + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \only<2->{% + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} + \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} + \only<2-4>{% + \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<5->{% + \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.9,1){{\color{lightgreen}\rule{0.1cm}{0.4cm}}} + \put(5.6,1){{\color{lightgreen}\rule{0.2cm}{0.4cm}}} + } + \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \visible<4->{% + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ }\newterm{unbegrenzte Prioritätsinversion} + + \pause + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \only<2>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + } + \put(0,3){\line(1,0){10}} + + \only<2->{% + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + \alt<1-4>{% + \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} + }{% + \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} + } + \only<2>{% + \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} + \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<3-4>{% + \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} +% \put(3.9,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \only<2>{% + \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} + \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} + } + \put(0,1){\line(1,0){10}} + } + + \only<5->{% + \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} + \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} + \put(0,2){\line(1,0){10}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \medskip + + Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 + + \only<1>{% + \begin{center} + \includegraphics[width=8.7cm]{pathfinder.jpg} + \vspace*{-1.5cm} + \end{center} + } + + \bigskip + + \only<2>{% + Gegenmaßnahmen + \begin{itemize} + \item + \newterm{Priority Inheritance -- Prioritätsvererbung}\\ + Der Besitzer des Mutex erbt die Priorität\\ + des Prozesses, der auf den Mutex wartet. + \end{itemize} + + \bigskip + + \begin{minipage}{7.0cm} + \begin{flushright} + \url{http://research.microsoft.com/en-us/\\um/people/mbj/Mars\_Pathfinder/} + \end{flushright} + \end{minipage} + + \vspace{1.35cm}\strut\hfill\makebox(0,0)[br]{\includegraphics[height=2.8cm]{pathfinder.jpg}}\vspace*{-1cm} + } + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \bigskip + + Gegenmaßnahme: \newterm{Priority Inheritance -- Prioritätsvererbung} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} + \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} + \put(0,1){\line(1,0){10}} + + \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} + \only<1-2>{% + \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} + } + \put(0,2){\line(1,0){10}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \put(0,3){\line(1,0){10}} + + \only<2>{% + \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} + {\thicklines + \put(3.3,2.95){\line(2,1){1.0}} + \put(3.3,3.45){\line(2,-1){1.0}}} + } + + \only<3->{% + \put(3.4,3){{\color{medgreen}\rule{0.7cm}{0.4cm}}} + \put(4.1,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} + \put(4.9,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} + } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \bigskip + + Gegenmaßnahme: \newterm{Priority Ceiling -- Prioritätsobergrenze} + + \vspace{0cm plus 1filll} + + \begin{center} + \begin{picture}(11,4)(-1,0) + \small + + \put(-0.1,0.5){\vector(1,0){10.1}} + \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} + \put(0,0.4){\vector(0,1){3.6}} + \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} + + \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} + \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} +% \only<1>{% +% \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} +% } + \put(0,1){\line(1,0){10}} + +% \only<1>{% +% \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} +% \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} +% } + \put(0,2){\line(1,0){10}} + + \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} +% \only<1>{% +% \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} +% } + \put(0,3){\line(1,0){10}} + +% \only<2>{% +% \only<2>{% + \put(2.6,3){{\color{medgreen}\rule{0.9cm}{0.4cm}}} + \put(3.5,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} + \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} + \put(4.7,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} + \put(5.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} + \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} + \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} + \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} +% } + \end{picture} + \end{center} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Ein Prozeß mit mittlerer Priorität bewirkt, + daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. + + \medskip + + \textarrow\ \newterm{unbegrenzte Prioritätsinversion} + + \medskip + + Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 + + \bigskip + + Gegenmaßnahmen + \begin{itemize} + \item + \newterm{Priority Inheritance -- Prioritätsvererbung}\\ + Der Besitzer des Mutex erbt die Priorität\\ + des Prozesses, der auf den Mutex wartet. + \smallskip + \item + \newterm{Priority Ceiling -- Prioritätsobergrenze}\\ + Der Besitzer des Mutex bekommt sofort\\ + die Priorität des höchstmöglichen Prozesses,\\ + der evtl.\ den Mutex benötigen könnte. + \pause + \begin{picture}(0,0) + \put(1.2,1.45){\makebox(0,0)[l]{$\left\}\rule{0pt}{1.7cm}\right.$ + \begin{minipage}{4cm} + nur möglich, wenn\\ + Mutexe im Spiel sind + \end{minipage}}} + \end{picture} + \smallskip + \pause + \item + \newterm{Priority Aging}\\ + Die Priorität wächst mit der Wartezeit. + \end{itemize} + \vspace*{-1cm} + +\end{frame} + +\subsection{Echtzeitbetriebssysteme} + +\begin{frame} + + \showsection + \showsubsection + + Wikipedia: + \begin{quote} + Ein \newterm{Echtzeitbetriebssystem\/} (englisch \newterm{real-time operating system},\\ + kurz \newterm{RTOS\/} genannt) ist ein Betriebssystem mit zusätzlichen Echtzeit-Funktionen + für die unbedingte Einhaltung von Zeitbedingungen + und die Vorhersagbarkeit des Prozessverhaltens (hartes Echtzeitverhalten). + \end{quote} + + \pause + \vspace{-0.5cm} + \begin{displaymath} + \text{Echtzeitbetriebssystem} + ~=~ \text{Betriebssystem} + ~+~ \left(\begin{array}{c} + \text{Semaphoren} \\ + \text{Mutexe} \\ + \text{Spinlocks} \\ + \text{Prioritätsvererbung} \\ + \text{Prioritätsobergrenze} \\ + \text{Prioritätsalterung} + \end{array}\right) + \end{displaymath} + +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + Beispiele + + \renewcommand{\arraystretch}{1.2} + + \begin{center} + \begin{tabular}{|l|l|l|l|}\hline + Name & Lizenz & kompatibel zu & Besonderheiten \\\hline\hline + TinyOS & BSD & -- & kooperativ, eigene Sprache \\\hline + FreeRTOS & GPL & -- & \\\hline + MicroC/OS-II & prop. & -- & mehrfach zertifiziert \\\hline + eCos & GPL & Unix & stark konfigurierbar \\\hline + QNX & prop. & Unix & im Automobilbereich beliebt \\\hline + VxWorks & prop. & Unix & mehrfach zertifiziert \\\hline + RTAI & GPL & Unix (Linux) & Linux als Hintergrundprozeß \\\hline + RT\_PREEMPT & GPL & Unix (Linux) & angepaßter Kernel \\\hline + Xenomai & GPL & Unix (Linux) & Dual-Kernel \\\hline + Windows CE / Em- & & & \\[-3pt] + bedded Compact & prop. & MS-Windows & \\\hline + \end{tabular} + \end{center} + \vspace*{-1cm} + +\end{frame} + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \item[\textbf{5}] \textbf{Echtzeit} + \begin{itemize} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \item[5.3] Multitasking + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \color{medgreen} + \item[5.6] Echtzeitbetriebssysteme + \end{itemize} + \item[\textbf{6}] \textbf{Web-Interfaces} + \begin{itemize} + \color{red} + \item[6.1] HTTP, HTML und CGI + \item[6.2] Externe CGI-Skripte, GET und POST + \item[6.3] Skript im Server: PHP + \item[6.4] Server im Skript: Twisted + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\section{Web-Interfaces} +\subsection{HTTP, HTML und CGI} + +\begin{frame}[fragile] + \showsection + \showsubsection + + \begin{lstlisting}[style=terminal] + $ ¡nc -C localhost 80¿ + GET / HTTP/1.1 + Host: localhost + + HTTP/1.1 200 OK + Date: Wed, 22 Nov 2017 19:58:55 GMT + Server: Apache/2.4.25 (Debian) + [...] + Content-Type: text/html + + <html> + <body> + <h1 align="center">Vertiefung<br>Vertiefung Systemtechnik – Eingebettete Systeme</h1> + <p align="center">23. November 2017</p> + <p align="center">Prof. Dr. Peter Gerwinski</p> + </body> + </html> + \end{lstlisting} + \vspace*{-1cm} +\end{frame} + +\begin{frame}[fragile] + \showsection + \showsubsection + + \begin{itemize} + \item + \newterm{Hypertext Transport Protocol (HTTP)}: Netzwerk-Protokoll\\ + HTML-Inhalt + zusätzliche Daten + \pause + \item + \newterm{Hypertext Markup Language (HTML)}: Markup-Sprache\\ + Inhalte + Formulare + \begin{onlyenv}<2> + \bigskip + \begin{lstlisting}[language=html,gobble=10] + <form action="/cgi-bin/welcome.cgi" method="get"> + Your name: <input type="text" name="name"><br> + <input type="submit"> + </form> + \end{lstlisting} + \vspace*{-2cm} + \end{onlyenv} + \pause + \item + \newterm{Common Gateway Interface (CGI)}: Schnittstelle zu Programmen\\ + Liste von Variablen mit Werten + \par\smallskip + \begin{itemize} + \item + \newterm{GET-Methode}: Umgebungsvariable \lstinline{QUERY_STRING} + \smallskip + \item + \newterm{POST-Methode}: Standardeingabe + \end{itemize} + \end{itemize} + \bigskip + \lstinline[style=terminal]{http://localhost/cgi-bin/welcome.cgi?name=Peter&answer=42} +\end{frame} + +\subsection{Externe CGI-Skripte, GET und POST} + +\begin{frame}[fragile] + \showsection + \showsubsection + + \begin{itemize}\itemsep\medskipamount + \item + HTML-Formular verweist auf CGI-Programm ("`CGI-Skript"') + \par + \lstinline[language=html]{<form action="/cgi-bin/welcome.cgi"} + \lstinline[language=html]{method="get">} + \item + Web-Server ruft CGI-Programm auf + \item + CGI-Programm wertet Variablenliste aus + \begin{itemize} + \item + GET-Methode: Umgebungsvariable \lstinline{QUERY_STRING} + \smallskip + \item + POST-Methode: Standardeingabe + \end{itemize} + \item + CGI-Programm gibt HTTP-Header und Inhalt aus + \par\smallskip + \begin{lstlisting}[language=bash] + #!/bin/bash + echo Content-Type: text/plain + echo + echo "Hello, world!" + \end{lstlisting} + \item + speziell: Inhalt ist \lstinline{text/html} + \end{itemize} +\end{frame} + +\subsection{Skript im Server: PHP} + +\begin{frame}[fragile] + \showsection + \showsubsection + + \begin{itemize} + \item + Interpreter in Web-Server integriert + \end{itemize} + + \bigskip + + \begin{lstlisting}[language=php] + <html> + <body> + Hello, <?php echo $_POST["name"]; ?>! + </body> + </html> + \end{lstlisting} +\end{frame} + +\subsection{Server im Skript: Twisted} + +\begin{frame}[fragile] + \showsection + \showsubsection + + \begin{itemize} + \item + individuell geschriebener Web-Server + \item + "`Baukasten"' in JavaScript: \file{node.js} + \item + "`Baukasten"' in Python: \file{Twisted} + \end{itemize} + + \bigskip + + \begin{lstlisting}[language=python] + def render_GET(self, request): + return '<html><body><form method="POST">Your name: ' \ + + '<input name="name" type="text" /><br/>' \ + + '<input type="submit"></form></body></html>' + + def render_POST(self, request): + return '<html><body>Hello, %s!</body></html>' \ + % (cgi.escape(request.args["name"][0]),) + \end{lstlisting} +\end{frame} + +\nosectionnonumber{Vertiefung Systemtechnik -- Eingebettete Systeme} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es.git}}}% + \item[\textbf{2}] \textbf{Einführung in Unix} + \item[\textbf{3}] \textbf{TCP/IP in der Praxis} + \item[\textbf{4}] \textbf{Bus-Systeme} + \item[\textbf{5}] \textbf{Echtzeit} + \begin{itemize} + \item[5.1] Was ist Echtzeit? + \item[5.2] Echtzeitprogrammierung + \item[5.3] Multitasking + \item[5.4] Ressourcen + \item[5.5] Prioritäten + \color{medgreen} + \item[5.6] Echtzeitbetriebssysteme + \end{itemize} + \item[\textbf{6}] \textbf{Web-Interfaces} + \begin{itemize} + \color{medgreen} + \item[6.1] HTTP, HTML und CGI + \item[6.2] Externe CGI-Skripte, GET und POST + \item[6.3] Skript im Server: PHP + \item[6.4] Server im Skript: Twisted + \end{itemize} + \vspace*{-\smallskipamount} + \item[\textbf{\dots}] + \underconstruction + \end{itemize} + +\end{frame} + +\end{document} diff --git a/20171123/filepos-1.c b/20171123/filepos-1.c new file mode 100644 index 0000000000000000000000000000000000000000..d4525c84a17e0c5e9cdedca31c8368a0581e139d --- /dev/null +++ b/20171123/filepos-1.c @@ -0,0 +1,11 @@ +#include <stdio.h> + +int main (void) +{ + FILE *f = fopen ("filepos-1.txt", "w+"); + fprintf (f, "Hello, world!\n"); + char buffer[100] = ""; + fgets (buffer, sizeof (buffer), f); + printf ("buffer = \"%s\"\n", buffer); + return 0; +} diff --git a/20171123/filepos-1.txt b/20171123/filepos-1.txt new file mode 100644 index 0000000000000000000000000000000000000000..af5626b4a114abcb82d63db7c8082c3c4756e51b --- /dev/null +++ b/20171123/filepos-1.txt @@ -0,0 +1 @@ +Hello, world! diff --git a/20171123/filepos-2.c b/20171123/filepos-2.c new file mode 100644 index 0000000000000000000000000000000000000000..c0af4d972d2c5ca4057952dae9f749e430aa560e --- /dev/null +++ b/20171123/filepos-2.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +int main (void) +{ + FILE *f = fopen ("filepos-1.txt", "w+"); + fprintf (f, "Hello, world!\n"); + char buffer[100] = ""; + fseek (f, 0, SEEK_SET); + fgets (buffer, sizeof (buffer), f); + printf ("buffer = \"%s\"\n", buffer); + return 0; +} diff --git a/20171123/grep-find-1.log b/20171123/grep-find-1.log new file mode 100644 index 0000000000000000000000000000000000000000..f45a33b08af556c7d972748594d7677d90fa0111 --- /dev/null +++ b/20171123/grep-find-1.log @@ -0,0 +1,9 @@ +$ grep "Hello" $(find . -type f -name "*.[ch]") + +Falls Argument-Liste zu lang wird: + +$ find . -type f -name "*.[ch]" -exec grep "Hello" {} + + +Das "{}" steht für die von "find" gefundene Datei. +"+" bedeutet, daß "find" das Programm "grep" auch für mehrere gefundene Dateien aufruft. +Mit "\;" statt "+" wird "grep" für jede Datei einzeln aufgerufen. diff --git a/20171123/herzschrittmacher.jpg b/20171123/herzschrittmacher.jpg new file mode 120000 index 0000000000000000000000000000000000000000..92d8f0053003cc555aec83f5d088f1cec822ad81 --- /dev/null +++ b/20171123/herzschrittmacher.jpg @@ -0,0 +1 @@ +../common/herzschrittmacher.jpg \ No newline at end of file diff --git a/20171123/logo-hochschule-bochum-cvh-text.pdf b/20171123/logo-hochschule-bochum-cvh-text.pdf new file mode 120000 index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c --- /dev/null +++ b/20171123/logo-hochschule-bochum-cvh-text.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20171123/logo-hochschule-bochum.pdf b/20171123/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20171123/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20171123/pathfinder.jpg b/20171123/pathfinder.jpg new file mode 120000 index 0000000000000000000000000000000000000000..23c6444fee26e0cf0dd2f8639484b00aa5021b59 --- /dev/null +++ b/20171123/pathfinder.jpg @@ -0,0 +1 @@ +../common/pathfinder.jpg \ No newline at end of file diff --git a/20171123/pgslides.sty b/20171123/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20171123/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file diff --git a/20171123/philosophenproblem.jpg b/20171123/philosophenproblem.jpg new file mode 120000 index 0000000000000000000000000000000000000000..26591b2ac2dddfd4786814baf3f19ecb67f1f5ee --- /dev/null +++ b/20171123/philosophenproblem.jpg @@ -0,0 +1 @@ +../common/philosophenproblem.jpg \ No newline at end of file diff --git a/20171123/photo-20171116-152713.jpg b/20171123/photo-20171116-152713.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5dcca28aba3dab5d07c1e6e638ed696ed05f03e2 Binary files /dev/null and b/20171123/photo-20171116-152713.jpg differ diff --git a/20171123/quadrocopter.jpg b/20171123/quadrocopter.jpg new file mode 120000 index 0000000000000000000000000000000000000000..7eaf0c024b63b7bc1dd3df2c17c8ab93f67fc15c --- /dev/null +++ b/20171123/quadrocopter.jpg @@ -0,0 +1 @@ +../common/quadrocopter.jpg \ No newline at end of file diff --git a/20171123/rp6.jpg b/20171123/rp6.jpg new file mode 120000 index 0000000000000000000000000000000000000000..2a0ecff23845770c3a98178eca6dce3ec73aca58 --- /dev/null +++ b/20171123/rp6.jpg @@ -0,0 +1 @@ +../common/rp6.jpg \ No newline at end of file diff --git a/20171123/sed-screenshot-1.log b/20171123/sed-screenshot-1.log new file mode 100644 index 0000000000000000000000000000000000000000..2dfce306c155d042bfc5735ae0f0a7528a415006 --- /dev/null +++ b/20171123/sed-screenshot-1.log @@ -0,0 +1,26 @@ +cassini/usr/lib/cgi-bin> QUERY_STRING="name=Peter&answer=42" +cassini/usr/lib/cgi-bin> echo $QUERY_STRING +name=Peter&answer=42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/=/FISCH/' +nameFISCHPeter&answer=42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/=/FISCH/g' +nameFISCHPeter&answerFISCH42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/[=&]/FISCH/g' +nameFISCHPeterFISCHanswerFISCH42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/[^=&]/X/g' +XXXX=XXXXX&XXXXXX=XX +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/^[^=&]/X/g' +Xame=Peter&answer=42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/[^=&]$/X/g' +name=Peter&answer=4X +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e '\<s/[^=&]\>/X/g' +sed: -e Ausdruck #1, Zeichen 15: Nicht beendeter regulärer Adressausdruck +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/\<[^=&]\>/X/g' +name=Peter&answer=42 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/\<[^=&]/X/g' +Xame=Xeter&Xnswer=X2 +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/[^=&]\>/X/g' +namX=PeteX&answeX=4X +cassini/usr/lib/cgi-bin> echo $QUERY_STRING | sed -e 's/\([^=&]\)/X\1/g' +XnXaXmXe=XPXeXtXeXr&XaXnXsXwXeXr=X4X2 +cassini/usr/lib/cgi-bin> diff --git a/20171123/templates-1.c b/20171123/templates-1.c new file mode 100644 index 0000000000000000000000000000000000000000..07f1c2097247baf3db831ff8ecff8a52e0c78024 --- /dev/null +++ b/20171123/templates-1.c @@ -0,0 +1,17 @@ +#include <stdio.h> + +#define PRINT_FUNC(name, type, spec) \ + void print_##name (type x) \ + { \ + printf (spec "\n", x); \ + } + +PRINT_FUNC (int, int, "%d") +PRINT_FUNC (string, char *, "%s") + +int main (void) +{ + print_string ("Hello, world!"); + print_int (42); + return 0; +} diff --git a/20171123/twisted-get.py b/20171123/twisted-get.py new file mode 100755 index 0000000000000000000000000000000000000000..0c9e3d61b999cb542b9094f81ba79a7067888e4b --- /dev/null +++ b/20171123/twisted-get.py @@ -0,0 +1,26 @@ +#!/usr/bin/python2 + +from twisted.web.server import Site +from twisted.web.resource import Resource +from twisted.internet import reactor, endpoints + +import cgi + +class FormPage(Resource): + def render_GET(self, request): + return '<html><body><form action="/welcome" method="GET">Your name: ' \ + + '<input name="name" type="text" /><br/>' \ + + '<input type="submit"></form></body></html>' + +class WelcomePage(Resource): + def render_GET(self, request): + return '<html><body>Hello, %s!<br/></body></html>' \ + % (cgi.escape(request.args["name"][0]),) + +root = Resource() +root.putChild("form", FormPage()) +root.putChild("welcome", WelcomePage()) +factory = Site(root) +endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880) +endpoint.listen(factory) +reactor.run() diff --git a/20171123/twisted-post.py b/20171123/twisted-post.py new file mode 100755 index 0000000000000000000000000000000000000000..5b4dbd98a90fdbe316ce0c1c4ed0923baae4a42f --- /dev/null +++ b/20171123/twisted-post.py @@ -0,0 +1,24 @@ +#!/usr/bin/python2 + +from twisted.web.server import Site +from twisted.web.resource import Resource +from twisted.internet import reactor, endpoints + +import cgi + +class FormPage(Resource): + def render_GET(self, request): + return '<html><body><form method="POST">Your name: ' \ + + '<input name="name" type="text" /><br/>' \ + + '<input type="submit"></form></body></html>' + + def render_POST(self, request): + return '<html><body>Hello, %s!</body></html>' \ + % (cgi.escape(request.args["name"][0]),) + +root = Resource() +root.putChild("form", FormPage()) +factory = Site(root) +endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880) +endpoint.listen(factory) +reactor.run() diff --git a/20171123/welcome-post.cgi b/20171123/welcome-post.cgi new file mode 100755 index 0000000000000000000000000000000000000000..85ba7f42ca297c14085859f24a977475c872e3ed --- /dev/null +++ b/20171123/welcome-post.cgi @@ -0,0 +1,8 @@ +#!/bin/bash + +echo Content-Type: text/plain +echo + +name=$(cut -d '&' -f 1 | sed -e "s/\<name=\(.*\)/\1/") + +echo "Hello, $name!" diff --git a/20171123/welcome.cgi b/20171123/welcome.cgi new file mode 100755 index 0000000000000000000000000000000000000000..fb90a257d20970931fad7cc5497e98301749e2c6 --- /dev/null +++ b/20171123/welcome.cgi @@ -0,0 +1,8 @@ +#!/bin/bash + +echo Content-Type: text/plain +echo + +name=$(echo $QUERY_STRING | cut -d '&' -f 1 | sed -e "s/\<name=\(.*\)/\1/") + +echo "Hello, $name!" diff --git a/20171123/welcome.php b/20171123/welcome.php new file mode 100644 index 0000000000000000000000000000000000000000..de6e75cb85dc696080b2320ae3d767460d847303 --- /dev/null +++ b/20171123/welcome.php @@ -0,0 +1,5 @@ +<html> + <body> + Hello, <?php echo $_POST["name"]; ?>! + </body> +</html> diff --git a/20171123/xbee.jpg b/20171123/xbee.jpg new file mode 120000 index 0000000000000000000000000000000000000000..ff0adff2eadf3d9b775d03cea8cf1f118534e2b9 --- /dev/null +++ b/20171123/xbee.jpg @@ -0,0 +1 @@ +../common/xbee.jpg \ No newline at end of file