[{"data":1,"prerenderedAt":1822},["ShallowReactive",2],{"docs-nav-docs_cs":3,"docs-page-\u002Fcs\u002Fdevice-sdk\u002Fbaremetal":366,"docs-surround-\u002Fcs\u002Fdevice-sdk\u002Fbaremetal":1819},[4],{"title":5,"path":6,"stem":7,"children":8},"Cs","\u002Fcs","cs",[9,13,41,58,76,103,157,171,190,211,238,282,302],{"title":10,"path":6,"stem":11,"navTitle":12},"Dokumentace QInsight","cs\u002Findex","Přehled",{"title":14,"navTitle":15,"path":16,"stem":17,"children":18,"page":40},"Začínáme",null,"\u002Fcs\u002Fgetting-started","cs\u002F01.getting-started",[19,23,27,31,36],{"title":20,"path":21,"stem":22,"navTitle":20},"Co je QENEX Suite","\u002Fcs\u002Fgetting-started\u002Fwhat-is-qenex-suite","cs\u002F01.getting-started\u002F1.what-is-qenex-suite",{"title":24,"path":25,"stem":26,"navTitle":24},"Co je QInsight","\u002Fcs\u002Fgetting-started\u002Fwhat-is-qinsight","cs\u002F01.getting-started\u002F2.what-is-qinsight",{"title":28,"path":29,"stem":30,"navTitle":28},"Instalace","\u002Fcs\u002Fgetting-started\u002Finstallation","cs\u002F01.getting-started\u002F3.installation",{"title":32,"path":33,"stem":34,"navTitle":35},"Uživatelské rozhraní QInsight","\u002Fcs\u002Fgetting-started\u002Fthe-qinsight-interface","cs\u002F01.getting-started\u002F4.the-qinsight-interface","Uživatelské rozhraní",{"title":37,"path":38,"stem":39,"navTitle":37},"Licencování","\u002Fcs\u002Fgetting-started\u002Flicensing","cs\u002F01.getting-started\u002F5.licensing",false,{"title":42,"navTitle":15,"path":43,"stem":44,"children":45,"page":40},"První projekt","\u002Fcs\u002Ffirst-project","cs\u002F02.first-project",[46,50,54],{"title":47,"path":48,"stem":49,"navTitle":47},"Založení projektu","\u002Fcs\u002Ffirst-project\u002Fcreate-a-project","cs\u002F02.first-project\u002F1.create-a-project",{"title":51,"path":52,"stem":53,"navTitle":51},"Struktura projektu","\u002Fcs\u002Ffirst-project\u002Fproject-structure","cs\u002F02.first-project\u002F2.project-structure",{"title":55,"path":56,"stem":57,"navTitle":55},"Heslo projektu","\u002Fcs\u002Ffirst-project\u002Fproject-password","cs\u002F02.first-project\u002F3.project-password",{"title":59,"navTitle":15,"path":60,"stem":61,"children":62,"page":40},"Připojení zařízení","\u002Fcs\u002Fconnecting-a-device","cs\u002F03.connecting-a-device",[63,67,71],{"title":64,"path":65,"stem":66,"navTitle":64},"Přidání driveru","\u002Fcs\u002Fconnecting-a-device\u002Fadd-a-driver","cs\u002F03.connecting-a-device\u002F1.add-a-driver",{"title":68,"path":69,"stem":70,"navTitle":68},"Přidání protokolu","\u002Fcs\u002Fconnecting-a-device\u002Fadd-a-protocol","cs\u002F03.connecting-a-device\u002F2.add-a-protocol",{"title":72,"path":73,"stem":74,"navTitle":75},"Propojení driveru a protokolu","\u002Fcs\u002Fconnecting-a-device\u002Flink-driver-and-protocol","cs\u002F03.connecting-a-device\u002F3.link-driver-and-protocol","Propojení",{"title":77,"navTitle":15,"path":78,"stem":79,"children":80,"page":40},"Proměnné","\u002Fcs\u002Fvariables","cs\u002F04.variables",[81,85,89,93,98],{"title":82,"path":83,"stem":84,"navTitle":82},"Co je proměnná","\u002Fcs\u002Fvariables\u002Fwhat-is-a-variable","cs\u002F04.variables\u002F1.what-is-a-variable",{"title":86,"path":87,"stem":88,"navTitle":86},"Konverze a prezentace","\u002Fcs\u002Fvariables\u002Fconversion-and-presentation","cs\u002F04.variables\u002F2.conversion-and-presentation",{"title":90,"path":91,"stem":92,"navTitle":90},"Přidání proměnné","\u002Fcs\u002Fvariables\u002Fadd-a-variable","cs\u002F04.variables\u002F3.add-a-variable",{"title":94,"path":95,"stem":96,"navTitle":97},"Proměnná Matrix (pole, křivka, mapa)","\u002Fcs\u002Fvariables\u002Fmatrix-variable","cs\u002F04.variables\u002F4.matrix-variable","Proměnná Matrix",{"title":99,"path":100,"stem":101,"navTitle":102},"Události (Events)","\u002Fcs\u002Fvariables\u002Fevents","cs\u002F04.variables\u002F5.events","Události",{"title":104,"navTitle":15,"path":105,"stem":106,"children":107,"page":40},"Vizualizace","\u002Fcs\u002Fvisualization","cs\u002F05.visualization",[108,113,118,122,127,132,137,142,147,152],{"title":109,"path":110,"stem":111,"navTitle":112},"Vytvoření pracovní plochy","\u002Fcs\u002Fvisualization\u002Fcreate-a-workspace","cs\u002F05.visualization\u002F1.create-a-workspace","Pracovní plocha",{"title":114,"path":115,"stem":116,"navTitle":117},"Zápis hodnot do zařízení","\u002Fcs\u002Fvisualization\u002Fwrite-to-device","cs\u002F05.visualization\u002F10.write-to-device","Zápis do zařízení",{"title":119,"path":120,"stem":121,"navTitle":119},"Přidání controlu","\u002Fcs\u002Fvisualization\u002Fadd-a-control","cs\u002F05.visualization\u002F2.add-a-control",{"title":123,"path":124,"stem":125,"navTitle":126},"Navázání controlu na proměnnou","\u002Fcs\u002Fvisualization\u002Fbind-a-control","cs\u002F05.visualization\u002F3.bind-a-control","Navázání controlu",{"title":128,"path":129,"stem":130,"navTitle":131},"Graph — časový průběh signálů","\u002Fcs\u002Fvisualization\u002Fgraph-control","cs\u002F05.visualization\u002F4.graph-control","Graph",{"title":133,"path":134,"stem":135,"navTitle":136},"XY Graph — signál proti signálu","\u002Fcs\u002Fvisualization\u002Fxy-graph-control","cs\u002F05.visualization\u002F5.xy-graph-control","XY Graph",{"title":138,"path":139,"stem":140,"navTitle":141},"Gauge — ukazatel okamžité hodnoty","\u002Fcs\u002Fvisualization\u002Fgauge-control","cs\u002F05.visualization\u002F6.gauge-control","Gauge",{"title":143,"path":144,"stem":145,"navTitle":146},"Single-Signal — hodnota s popiskem","\u002Fcs\u002Fvisualization\u002Fsignal-control","cs\u002F05.visualization\u002F7.signal-control","Single-Signal",{"title":148,"path":149,"stem":150,"navTitle":151},"Watch Table — tabulka proměnných","\u002Fcs\u002Fvisualization\u002Fwatch-table-control","cs\u002F05.visualization\u002F8.watch-table-control","Watch Table",{"title":153,"path":154,"stem":155,"navTitle":156},"Matrix control — mapy a kalibrace","\u002Fcs\u002Fvisualization\u002Fmatrix-control","cs\u002F05.visualization\u002F9.matrix-control","Matrix control",{"title":158,"navTitle":15,"path":159,"stem":160,"children":161,"page":40},"Běh a sledování","\u002Fcs\u002Frunning","cs\u002F06.running",[162,166],{"title":163,"path":164,"stem":165,"navTitle":163},"Spuštění a zastavení","\u002Fcs\u002Frunning\u002Fstart-and-stop","cs\u002F06.running\u002F1.start-and-stop",{"title":167,"path":168,"stem":169,"navTitle":170},"Sledování živých dat","\u002Fcs\u002Frunning\u002Fwatching-live-data","cs\u002F06.running\u002F2.watching-live-data","Živá data",{"title":172,"navTitle":15,"path":173,"stem":174,"children":175,"page":40},"Logování a přehrávání","\u002Fcs\u002Flogging-and-replay","cs\u002F07.logging-and-replay",[176,180,185],{"title":177,"path":178,"stem":179,"navTitle":177},"Logování dat","\u002Fcs\u002Flogging-and-replay\u002Flogging-data","cs\u002F07.logging-and-replay\u002F1.logging-data",{"title":181,"path":182,"stem":183,"navTitle":184},"Přehrávání logu","\u002Fcs\u002Flogging-and-replay\u002Freplaying-a-log","cs\u002F07.logging-and-replay\u002F2.replaying-a-log","Přehrávání",{"title":186,"path":187,"stem":188,"navTitle":189},"Export dat","\u002Fcs\u002Flogging-and-replay\u002Fexporting-data","cs\u002F07.logging-and-replay\u002F3.exporting-data","Export",{"title":191,"navTitle":15,"path":192,"stem":193,"children":194,"page":40},"Python skripty","\u002Fcs\u002Fpython-scripts","cs\u002F08.python-scripts",[195,199,203,207],{"title":196,"path":197,"stem":198,"navTitle":12},"Přehled skriptů","\u002Fcs\u002Fpython-scripts\u002Fscripts-overview","cs\u002F08.python-scripts\u002F1.scripts-overview",{"title":200,"path":201,"stem":202,"navTitle":200},"Přístup k proměnným","\u002Fcs\u002Fpython-scripts\u002Faccessing-variables","cs\u002F08.python-scripts\u002F2.accessing-variables",{"title":204,"path":205,"stem":206,"navTitle":204},"Příklad skriptu","\u002Fcs\u002Fpython-scripts\u002Fexample-script","cs\u002F08.python-scripts\u002F3.example-script",{"title":208,"path":209,"stem":210,"navTitle":208},"Post-processing CSV","\u002Fcs\u002Fpython-scripts\u002Fcsv-post-processing","cs\u002F08.python-scripts\u002F4.csv-post-processing",{"title":212,"navTitle":15,"path":213,"stem":214,"children":215,"page":40},"Vlastní rozšíření","\u002Fcs\u002Fcustom-extensions","cs\u002F09.custom-extensions",[216,220,224,228,233],{"title":217,"path":218,"stem":219,"navTitle":217},"Vlastní driver","\u002Fcs\u002Fcustom-extensions\u002Fcustom-driver","cs\u002F09.custom-extensions\u002F1.custom-driver",{"title":221,"path":222,"stem":223,"navTitle":221},"Vlastní protokol","\u002Fcs\u002Fcustom-extensions\u002Fcustom-protocol","cs\u002F09.custom-extensions\u002F2.custom-protocol",{"title":225,"path":226,"stem":227,"navTitle":225},"Vlastní Control","\u002Fcs\u002Fcustom-extensions\u002Fcustom-control","cs\u002F09.custom-extensions\u002F3.custom-control",{"title":229,"path":230,"stem":231,"navTitle":232},"Kompletní ukázka — poloha ISS","\u002Fcs\u002Fcustom-extensions\u002Fiss-example","cs\u002F09.custom-extensions\u002F4.iss-example","Ukázka ISS",{"title":234,"path":235,"stem":236,"navTitle":237},"Kompletní ukázka — teploměr","\u002Fcs\u002Fcustom-extensions\u002Ftemp-sensor-example","cs\u002F09.custom-extensions\u002F5.temp-sensor-example","Ukázka teploměr",{"title":239,"navTitle":15,"path":240,"stem":241,"children":242,"page":40},"QFW SDK","\u002Fcs\u002Fdevice-sdk","cs\u002F10.device-sdk",[243,248,253,258,263,268,272,277],{"title":244,"path":245,"stem":246,"navTitle":247},"QFW SDK — úvod","\u002Fcs\u002Fdevice-sdk\u002Fintroduction","cs\u002F10.device-sdk\u002F1.introduction","Úvod",{"title":249,"path":250,"stem":251,"navTitle":252},"XCP v QFW SDK","\u002Fcs\u002Fdevice-sdk\u002Fxcp","cs\u002F10.device-sdk\u002F2.xcp","XCP",{"title":254,"path":255,"stem":256,"navTitle":257},"Integrace krok za krokem: XCP on TCP s FreeRTOS + lwIP","\u002Fcs\u002Fdevice-sdk\u002Fintegration-tcp","cs\u002F10.device-sdk\u002F3.integration-tcp","Integrace: XCP on TCP",{"title":259,"path":260,"stem":261,"navTitle":262},"XCP on classic CAN — co se mění","\u002Fcs\u002Fdevice-sdk\u002Fcan","cs\u002F10.device-sdk\u002F4.can","XCP on classic CAN",{"title":264,"path":265,"stem":266,"navTitle":267},"Integrace bez RTOS: XCP on TCP z hlavní smyčky","\u002Fcs\u002Fdevice-sdk\u002Fbaremetal","cs\u002F10.device-sdk\u002F5.baremetal","Integrace bez RTOS",{"title":269,"path":270,"stem":271,"navTitle":269},"Kontrakt enginu","\u002Fcs\u002Fdevice-sdk\u002Fengine-contract","cs\u002F10.device-sdk\u002F6.engine-contract",{"title":273,"path":274,"stem":275,"navTitle":276},"Adresy proměnných pro QInsight","\u002Fcs\u002Fdevice-sdk\u002Fvariable-addresses","cs\u002F10.device-sdk\u002F7.variable-addresses","Adresy proměnných",{"title":278,"path":279,"stem":280,"navTitle":281},"Řešení potíží při integraci SDK","\u002Fcs\u002Fdevice-sdk\u002Ftroubleshooting","cs\u002F10.device-sdk\u002F8.troubleshooting","Řešení potíží",{"title":283,"navTitle":15,"path":284,"stem":285,"children":286,"page":40},"Reference","\u002Fcs\u002Freference","cs\u002F11.reference",[287,291,295,299],{"title":288,"path":289,"stem":290,"navTitle":288},"Drivery","\u002Fcs\u002Freference\u002Fdrivers","cs\u002F11.reference\u002F1.drivers",{"title":292,"path":293,"stem":294,"navTitle":292},"Protokoly","\u002Fcs\u002Freference\u002Fprotocols","cs\u002F11.reference\u002F2.protocols",{"title":296,"path":297,"stem":298,"navTitle":296},"Controls","\u002Fcs\u002Freference\u002Fcontrols","cs\u002F11.reference\u002F3.controls",{"title":281,"path":300,"stem":301,"navTitle":281},"\u002Fcs\u002Freference\u002Ftroubleshooting","cs\u002F11.reference\u002F4.troubleshooting",{"title":303,"navTitle":15,"path":304,"stem":305,"children":306,"page":40},"Příklady","\u002Fcs\u002Fexamples","cs\u002F12.examples",[307,311,316,321,326,330,334,338,342,346,351,356,361],{"title":308,"path":309,"stem":310,"navTitle":308},"Simulace: všechny signály","\u002Fcs\u002Fexamples\u002Fsimulation-all-signals","cs\u002F12.examples\u002F01.simulation-all-signals",{"title":312,"path":313,"stem":314,"navTitle":315},"Modbus RTU master po sériové lince","\u002Fcs\u002Fexamples\u002Fserial-modbus-master","cs\u002F12.examples\u002F02.serial-modbus-master","Modbus RTU master",{"title":317,"path":318,"stem":319,"navTitle":320},"Modbus RTU slave se simulovanými senzory","\u002Fcs\u002Fexamples\u002Fserial-modbus-slave","cs\u002F12.examples\u002F03.serial-modbus-slave","Modbus RTU slave",{"title":322,"path":323,"stem":324,"navTitle":325},"Modbus TCP master přes TCP klienta","\u002Fcs\u002Fexamples\u002Ftcp-client-modbus-master","cs\u002F12.examples\u002F04.tcp-client-modbus-master","Modbus TCP master",{"title":327,"path":328,"stem":329,"navTitle":327},"Modbus TCP slave na TCP serveru","\u002Fcs\u002Fexamples\u002Ftcp-server-modbus-slave","cs\u002F12.examples\u002F05.tcp-server-modbus-slave",{"title":331,"path":332,"stem":333,"navTitle":331},"Bitové pole a skript","\u002Fcs\u002Fexamples\u002Fbit-field-script","cs\u002F12.examples\u002F08.bit-field-script",{"title":335,"path":336,"stem":337,"navTitle":335},"Dvě ECU najednou","\u002Fcs\u002Fexamples\u002Ftwo-ecus","cs\u002F12.examples\u002F09.two-ecus",{"title":339,"path":340,"stem":341,"navTitle":339},"Poloha ISS naživo","\u002Fcs\u002Fexamples\u002Fiss-live-tracking","cs\u002F12.examples\u002F10.iss-live-tracking",{"title":343,"path":344,"stem":345,"navTitle":343},"Simulovaný teploměr","\u002Fcs\u002Fexamples\u002Fsimul-temp-measure","cs\u002F12.examples\u002F11.simul-temp-measure",{"title":347,"path":348,"stem":349,"navTitle":350},"JSON signály z Python generátoru","\u002Fcs\u002Fexamples\u002Fjson-signal-python","cs\u002F12.examples\u002F12.json-signal-python","JSON signály z Pythonu",{"title":352,"path":353,"stem":354,"navTitle":355},"Raw CAN rámce z Raspberry","\u002Fcs\u002Fexamples\u002Fraw-can-python","cs\u002F12.examples\u002F13.raw-can-python","Raw CAN z Raspberry",{"title":357,"path":358,"stem":359,"navTitle":360},"XCP on TCP na NUCLEO-H723ZG: měření, stimulace a kalibrační mapy","\u002Fcs\u002Fexamples\u002Ftcp-client-xcp-nucleo-maps","cs\u002F12.examples\u002F14.tcp-client-xcp-nucleo-maps","XCP on TCP na NUCLEO-H723ZG",{"title":362,"path":363,"stem":364,"navTitle":365},"XCP on CAN na NUCLEO-H723ZG: měření, stimulace a kalibrační mapy","\u002Fcs\u002Fexamples\u002Fcan-xcp-nucleo-maps","cs\u002F12.examples\u002F15.can-xcp-nucleo-maps","XCP on CAN na NUCLEO-H723ZG",{"id":367,"title":264,"body":368,"description":1814,"extension":1815,"meta":1816,"navTitle":267,"navigation":844,"path":265,"seo":1817,"stem":266,"__hash__":1818},"docs_cs\u002Fcs\u002F10.device-sdk\u002F5.baremetal.md",{"type":369,"value":370,"toc":1804},"minimark",[371,375,413,418,566,570,587,804,808,823,940,957,963,982,1277,1329,1462,1466,1496,1530,1533,1612,1616,1619,1768,1778,1788,1792,1800],[372,373,264],"h1",{"id":374},"integrace-bez-rtos-xcp-on-tcp-z-hlavní-smyčky",[376,377,378,379,383,384,387,388,392,393,396,397,400,401,404,405,408,409,412],"p",{},"Příklad ",[380,381,382],"code",{},"examples\u002Fnucleo_h723zg_baremetal"," je tatáž deska a tentýž\nobsah ukázky jako ",[380,385,386],{},"examples\u002Fnucleo_h723zg",", přeložený ",[389,390,391],"strong",{},"bez FreeRTOS a\nbez socketů",": lwIP běží v režimu ",[380,394,395],{},"NO_SYS"," a XCP server tvoří šablona\nglue ",[380,398,399],{},"glue\u002Fbaremetal_lwip_raw\u002Fxcp_tcp_raw_glue.c",", řízená z hlavní\nsmyčky. Vše v této kapitole je to, co se mění oproti kapitole\n",[402,403,257],"a",{"href":255},"; engine,\n",[402,406,407],{"href":270},"kontrakt enginu",", pravidla pro\nproměnné a ",[402,410,411],{"href":274},"nástroje pro adresy","\njsou stejné.",[414,415,417],"h2",{"id":416},"stejné-a-odlišné","Stejné a odlišné",[419,420,421,434],"table",{},[422,423,424],"thead",{},[425,426,427,431],"tr",{},[428,429,430],"th",{},"Stejné jako s FreeRTOS",[428,432,433],{},"Odlišné bez RTOS",[435,436,437,463,483,503,537],"tbody",{},[425,438,439,453],{},[440,441,442,443,446,447,446,450],"td",{},"zdroje enginu, ",[380,444,445],{},"qfw_xcp.h",", ",[380,448,449],{},"cmake\u002Fqfw_xcp.cmake",[380,451,452],{},"QFW_XCP_TRANSPORT=eth",[440,454,455,456,458,459,462],{},"glue: ",[380,457,399],{}," místo ",[380,460,461],{},"glue\u002Ffreertos_lwip\u002Fxcp_sdk_glue.c"," — lwIP RAW (callback) API, žádná úloha, žádný socket",[425,464,465,468],{},[440,466,467],{},"port hodin a kontrakt hodin",[440,469,470,471,474,475,478,479,482],{},"API glue: ",[380,472,473],{},"QfwXcpTcpRawGlue_Init(&config)"," jednou ",[389,476,477],{},"a navíc"," ",[380,480,481],{},"QfwXcpTcpRawGlue_Poll()"," v každém průchodu hlavní smyčky (poll nahrazuje server task)",[425,484,485,496],{},[440,486,487,488,491,492,495],{},"identita, úroveň logu a port v konfigurační struktuře (",[380,489,490],{},"tQfwXcpTcpRawGlueConfig"," má stejných pět polí jako ",[380,493,494],{},"tQfwXcpGlueConfig",")",[440,497,498,499,502],{},"model kontextů: transport v hlavní smyčce, spouštění DAQ z přerušení — glue dává enginu kritickou sekci ",[380,500,501],{},"PRIMASK"," (viz níže)",[425,504,505,518],{},[440,506,507,510,511,446,514,517],{},[380,508,509],{},"qfw_xcp_create_event"," \u002F ",[380,512,513],{},"qfw_xcp_trigger_event",[380,515,516],{},"daqId"," v QInsight",[440,519,520,521,524,525,528,529,532,533,536],{},"kde volání sídlí: ",[380,522,523],{},"main.c"," a ",[380,526,527],{},"stm32h7xx_it.c"," (sekce ",[380,530,531],{},"USER CODE",") místo ",[380,534,535],{},"freertos.c","; DAQ event se spouští z přerušení SysTick",[425,538,539,549],{},[440,540,541,542,545,546,495],{},"opravy lwIP projektu STM32H7 (linker skript, ",[380,543,544],{},"ethernetif.c",", viz ",[402,547,281],{"href":548},"\u002Fcs\u002Fdevice-sdk\u002Ftroubleshooting#regenerace-projektu-cubemx",[440,550,551,552,555,556,510,559,478,562,565],{},"volby lwIP: ",[380,553,554],{},"NO_SYS 1",", žádné volby socketů, ale ",[380,557,558],{},"TCP_MSS",[380,560,561],{},"TCP_SND_BUF",[389,563,564],{},"musí"," být zvětšeny (viz níže)",[414,567,569],{"id":568},"cubemx-lwip-bez-rtos","CubeMX: lwIP bez RTOS",[376,571,572,575,576,524,579,582,583,586],{},[389,573,574],{},"Kde:"," váš soubor ",[380,577,578],{},".ioc",[380,580,581],{},"LWIP\u002FTarget\u002Flwipopts.h",". ",[389,584,585],{},"Co"," se liší\nod projektu s FreeRTOS:",[588,589,590,609,619,647,786],"ol",{},[591,592,593,596,597,600,601,604,605,608],"li",{},[389,594,595],{},"Middleware → FREERTOS:"," nezapnuto. ",[389,598,599],{},"SYS → Timebase source:","\nSysTick (",[380,602,603],{},"HAL_GetTick"," pohání časovače lwIP přes ",[380,606,607],{},"sys_now"," i plánovač\nukázky).",[591,610,611,614,615,618],{},[389,612,613],{},"Connectivity → ETH:"," jako u projektu s FreeRTOS. Priorita přerušení\nETH je volná (bez omezení syscall priority FreeRTOS); v ovladači CubeMX\nbez RTOS ISR pouze maže příznaky DMA — rámce čte ",[380,616,617],{},"MX_LWIP_Process()","\nz hlavní smyčky. Zachovejte to (viz model kontextů níže).",[591,620,621,624,625,627,628,446,631,634,635,638,639,642,643,646],{},[389,622,623],{},"Middleware → LWIP:"," CubeMX bez zapnutého RTOS generuje ",[380,626,554],{},",\n",[380,629,630],{},"LWIP_NETCONN 0",[380,632,633],{},"LWIP_SOCKET 0"," automaticky. DHCP vypnuto, statická\nIP jako u FreeRTOS; ",[380,636,637],{},"MEM_SIZE"," 16384 a ",[380,640,641],{},"LWIP_RAM_HEAP_POINTER"," jako\nv příkladu (do heapu lwIP kopíruje ",[380,644,645],{},"tcp_write"," segmenty XCP).",[591,648,649,658,659,662,663,666,667,746,749,750,524,753,758,759,761,762,446,765,768,769,772,773,510,775,777,778,781,782,785],{},[389,650,651,654,655],{},[380,652,653],{},"USER CODE BEGIN 1"," v ",[380,656,657],{},"lwipopts.h"," — volby, na kterých glue\nzávisí (glue je kontroluje při překladu: ",[380,660,661],{},"#error"," \u002F\n",[380,664,665],{},"_Static_assert","):",[419,668,669,682],{},[422,670,671],{},[425,672,673,676,679],{},[428,674,675],{},"Volba",[428,677,678],{},"Hodnota",[428,680,681],{},"Proč",[435,683,684,697,713,725],{},[425,685,686,691,694],{},[440,687,688],{},[380,689,690],{},"LWIP_TCP_KEEPALIVE",[440,692,693],{},"1",[440,695,696],{},"keepalive per spojení (2 s klidu, 3 sondy po 1 s): master, který zmizel za vlastní linkou desky, je odhalen do ~5 s a port je opět volný (kabel vytažený u desky: link callback, viz Spojení níže)",[425,698,699,704,706],{},[440,700,701],{},[380,702,703],{},"LWIP_NETIF_TX_SINGLE_PBUF",[440,705,693],{},[440,707,708,709,712],{},"jeden ",[380,710,711],{},"pbuf"," na odesílaný segment — ovladač STM32H7 má jen 4 TX deskriptory",[425,714,715,719,722],{},[440,716,717],{},[380,718,558],{},[440,720,721],{},"1460",[440,723,724],{},"maximum Ethernetu (1500 − 40). S výchozí hodnotou lwIP 536 by se každý plný segment enginu dělil na tři TCP pakety",[425,726,727,731,737],{},[440,728,729],{},[380,730,561],{},[440,732,733,736],{},[380,734,735],{},"4 * TCP_MSS"," (5840)",[440,738,739,742,743,745],{},[389,740,741],{},"povinné."," Glue zařadí celý segment enginu (až 1480 B) jedním ",[380,744,645],{},", nebo vůbec; výchozí hodnota lwIP (2 × 536 = 1072) by plný segment nepřijala nikdy a engine by zůstal trvale v backpressure. Čtyři segmenty v letu jsou dobrý výchozí stav",[747,748],"br",{},"Všechny čtyři jsou chráněné ",[380,751,752],{},"#ifndef",[389,754,755,756],{},"nejsou v ",[380,757,578],{}," — GUI\nCubeMX dál ukazuje výchozí hodnoty; blok ",[380,760,531],{}," regeneraci\npřežije. Hodnoty, které CubeMX generuje pro výchozí MSS\n(",[380,763,764],{},"TCP_SND_QUEUELEN 9",[380,766,767],{},"TCP_SNDLOWAT 1071",", …), s tímto nastavením\nkontrolami lwIP stále procházejí (",[380,770,771],{},"TCP_SND_QUEUELEN"," ≥\n2 × ",[380,774,561],{},[380,776,558],{}," = 8).\nProč celé segmenty: engine zahazuje zařazené segmenty při\n",[380,779,780],{},"DISCONNECT",", při novém ",[380,783,784],{},"CONNECT"," a při resetu transportu; napůl\nzapsaný segment by rozsynchronizoval proud bajtů. Glue pro FreeRTOS\nsi částečný zápis může dovolit, protože ve své úloze může čekat;\nhlavní smyčka nemůže.",[591,787,788,791,792,795,796,799,800,803],{},[389,789,790],{},"Generate code",", poté proveďte opravy pro STM32H7 přesně jako\nu projektu s FreeRTOS (linker skript, ",[380,793,794],{},"ETH_RX_BUFFER_CNT",", ochrana\n",[380,797,798],{},"HAL_ETH_RxLinkCallback"," — ",[380,801,802],{},"REGEN-NOTES.md"," příkladu bez RTOS).",[414,805,807],{"id":806},"cmake","CMake",[376,809,810,812,813,582,816,819,820,822],{},[389,811,574],{}," váš kořenový ",[380,814,815],{},"CMakeLists.txt",[389,817,818],{},"Jak"," (",[380,821,815],{},"\npříkladu bez RTOS, liší se jen cesta k SDK):",[824,825,829],"pre",{"className":826,"code":827,"language":806,"meta":828,"style":828},"language-cmake shiki shiki-themes github-light github-dark-default","include(${SDK}\u002Fcmake\u002Fqfw_xcp.cmake)               # transport eth (default)\n\nadd_library(qfw_example STATIC\n    app\u002Fxcp_demo.c                                 # your application: event + cyclic work\n    app\u002Fdemo_map.c\n    app\u002Fdemo_signals.cpp\n    ${QFW_XCP_GLUE_BAREMETAL_LWIP_RAW_SOURCES}   # glue\u002Fbaremetal_lwip_raw\u002Fxcp_tcp_raw_glue.c\n    ${QFW_XCP_PORT_CLOCK_SOURCES}                # port\u002Fclock\u002Fclock64.c\n)\ntarget_include_directories(qfw_example PUBLIC\n    ${CMAKE_CURRENT_SOURCE_DIR}\u002Fapp\n    ${QFW_XCP_GLUE_BAREMETAL_LWIP_RAW_INCLUDE_DIRS}\n    ${QFW_XCP_PORT_CLOCK_INCLUDE_DIRS}\n)\ntarget_compile_definitions(qfw_example PUBLIC CLOCK_TICKS_PER_S=550000000UL)   # YOUR CPU clock\ntarget_link_libraries(qfw_example PUBLIC qfw::xcp PRIVATE stm32cubemx)\n\ntarget_link_libraries(${CMAKE_PROJECT_NAME} stm32cubemx qfw_example)\n","",[380,830,831,839,846,852,858,864,870,876,882,888,894,900,906,912,917,923,929,934],{"__ignoreMap":828},[832,833,836],"span",{"class":834,"line":835},"line",1,[832,837,838],{},"include(${SDK}\u002Fcmake\u002Fqfw_xcp.cmake)               # transport eth (default)\n",[832,840,842],{"class":834,"line":841},2,[832,843,845],{"emptyLinePlaceholder":844},true,"\n",[832,847,849],{"class":834,"line":848},3,[832,850,851],{},"add_library(qfw_example STATIC\n",[832,853,855],{"class":834,"line":854},4,[832,856,857],{},"    app\u002Fxcp_demo.c                                 # your application: event + cyclic work\n",[832,859,861],{"class":834,"line":860},5,[832,862,863],{},"    app\u002Fdemo_map.c\n",[832,865,867],{"class":834,"line":866},6,[832,868,869],{},"    app\u002Fdemo_signals.cpp\n",[832,871,873],{"class":834,"line":872},7,[832,874,875],{},"    ${QFW_XCP_GLUE_BAREMETAL_LWIP_RAW_SOURCES}   # glue\u002Fbaremetal_lwip_raw\u002Fxcp_tcp_raw_glue.c\n",[832,877,879],{"class":834,"line":878},8,[832,880,881],{},"    ${QFW_XCP_PORT_CLOCK_SOURCES}                # port\u002Fclock\u002Fclock64.c\n",[832,883,885],{"class":834,"line":884},9,[832,886,887],{},")\n",[832,889,891],{"class":834,"line":890},10,[832,892,893],{},"target_include_directories(qfw_example PUBLIC\n",[832,895,897],{"class":834,"line":896},11,[832,898,899],{},"    ${CMAKE_CURRENT_SOURCE_DIR}\u002Fapp\n",[832,901,903],{"class":834,"line":902},12,[832,904,905],{},"    ${QFW_XCP_GLUE_BAREMETAL_LWIP_RAW_INCLUDE_DIRS}\n",[832,907,909],{"class":834,"line":908},13,[832,910,911],{},"    ${QFW_XCP_PORT_CLOCK_INCLUDE_DIRS}\n",[832,913,915],{"class":834,"line":914},14,[832,916,887],{},[832,918,920],{"class":834,"line":919},15,[832,921,922],{},"target_compile_definitions(qfw_example PUBLIC CLOCK_TICKS_PER_S=550000000UL)   # YOUR CPU clock\n",[832,924,926],{"class":834,"line":925},16,[832,927,928],{},"target_link_libraries(qfw_example PUBLIC qfw::xcp PRIVATE stm32cubemx)\n",[832,930,932],{"class":834,"line":931},17,[832,933,845],{"emptyLinePlaceholder":844},[832,935,937],{"class":834,"line":936},18,[832,938,939],{},"target_link_libraries(${CMAKE_PROJECT_NAME} stm32cubemx qfw_example)\n",[376,941,942,943,627,946,949,950,952,953,956],{},"Glue potřebuje hlavičky lwIP vašeho projektu (",[380,944,945],{},"lwip\u002Ftcp.h",[380,947,948],{},"lwip\u002Fpbuf.h",", váš ",[380,951,657],{},"), proto sedí ve vašem cíli a linkuje\n",[380,954,955],{},"stm32cubemx"," privátně — přesně jako glue pro FreeRTOS.",[414,958,960,962],{"id":959},"mainc-jednou-init-pak-stále-poll",[380,961,523],{},": jednou Init, pak stále Poll",[376,964,965,478,967,970,971,582,973,976,977,819,979,981],{},[389,966,574],{},[380,968,969],{},"Core\u002FSrc\u002Fmain.c",", pouze sekce ",[380,972,531],{},[389,974,975],{},"Co:"," callback\nhodin, konfigurace glue, dvě inicializační volání a tělo smyčky.\n",[389,978,818],{},[380,980,523],{}," příkladu):",[824,983,987],{"className":984,"code":985,"language":986,"meta":828,"style":828},"language-c shiki shiki-themes github-light github-dark-default","\u002F* USER CODE BEGIN Includes *\u002F\n#include \"clock64.h\"\n#include \"qfw_xcp.h\"\n#include \"xcp_tcp_raw_glue.h\"\n#include \"xcp_demo.h\"\n\u002F* USER CODE END Includes *\u002F\n\n\u002F* USER CODE BEGIN 0 *\u002F\nstatic uint64_t XcpClockUs(void)      \u002F* engine clock contract: monotonic 64-bit microseconds *\u002F\n{\n  return Clock64_Get();\n}\n\u002F* USER CODE END 0 *\u002F\n\nint main(void)\n{\n  ...\n  MX_GPIO_Init();\n  MX_LWIP_Init();                     \u002F* generated: lwIP is up after this line (NO_SYS: no thread is started) *\u002F\n  \u002F* USER CODE BEGIN 2 *\u002F\n  Clock64_Init();\n  \u002F* USER CODE END 2 *\u002F\n  ... BSP LEDs, COM1 (printf) ...\n\n  \u002F* USER CODE BEGIN WHILE *\u002F\n  tQfwXcpTcpRawGlueConfig xcpConfig =\n  {\n    .project_name = \"baremetal\",      \u002F* shown to the master, \u003C= 31 chars *\u002F\n    .epk = \"V100\",                    \u002F* software version id *\u002F\n    .port = 5555U,\n    .log_level = 2U,                  \u002F* 1 error, 2 warning, 3 info (adds connection messages) *\u002F\n    .get_clock_us = XcpClockUs,\n  };\n  if (!QfwXcpTcpRawGlue_Init(&xcpConfig))   \u002F* engine init + listening pcb *\u002F\n  {\n    Error_Handler();\n  }\n  if (!QfwXcpDemo_Init())                   \u002F* qfw_xcp_create_event(\"demo10ms\", 10000) -> id 0, maps *\u002F\n  {\n    Error_Handler();\n  }\n\n  while (1)\n  {\n    MX_LWIP_Process();         \u002F* ETH RX + lwIP timers; the glue's TCP callbacks run in here -> qfw_xcp_rx *\u002F\n    Clock64_Update();          \u002F* single writer of the 64-bit clock, must run well below every 7.8 s *\u002F\n    QfwXcpTcpRawGlue_Poll();   \u002F* qfw_xcp_poll -> transmit callback -> tcp_write, then one tcp_output *\u002F\n    QfwXcpDemo_Poll();         \u002F* every 500 ms: map tick (the 10 ms signal step + DAQ event runs in SysTick, see below) *\u002F\n    \u002F* USER CODE END WHILE *\u002F\n    \u002F* USER CODE BEGIN 3 *\u002F\n  }\n  \u002F* USER CODE END 3 *\u002F\n}\n","c",[380,988,989,994,999,1004,1009,1014,1019,1023,1028,1033,1038,1043,1048,1053,1057,1062,1066,1071,1076,1082,1088,1094,1100,1106,1111,1117,1123,1129,1135,1141,1147,1153,1159,1165,1171,1176,1182,1188,1194,1199,1204,1209,1214,1220,1225,1231,1237,1243,1249,1255,1261,1266,1272],{"__ignoreMap":828},[832,990,991],{"class":834,"line":835},[832,992,993],{},"\u002F* USER CODE BEGIN Includes *\u002F\n",[832,995,996],{"class":834,"line":841},[832,997,998],{},"#include \"clock64.h\"\n",[832,1000,1001],{"class":834,"line":848},[832,1002,1003],{},"#include \"qfw_xcp.h\"\n",[832,1005,1006],{"class":834,"line":854},[832,1007,1008],{},"#include \"xcp_tcp_raw_glue.h\"\n",[832,1010,1011],{"class":834,"line":860},[832,1012,1013],{},"#include \"xcp_demo.h\"\n",[832,1015,1016],{"class":834,"line":866},[832,1017,1018],{},"\u002F* USER CODE END Includes *\u002F\n",[832,1020,1021],{"class":834,"line":872},[832,1022,845],{"emptyLinePlaceholder":844},[832,1024,1025],{"class":834,"line":878},[832,1026,1027],{},"\u002F* USER CODE BEGIN 0 *\u002F\n",[832,1029,1030],{"class":834,"line":884},[832,1031,1032],{},"static uint64_t XcpClockUs(void)      \u002F* engine clock contract: monotonic 64-bit microseconds *\u002F\n",[832,1034,1035],{"class":834,"line":890},[832,1036,1037],{},"{\n",[832,1039,1040],{"class":834,"line":896},[832,1041,1042],{},"  return Clock64_Get();\n",[832,1044,1045],{"class":834,"line":902},[832,1046,1047],{},"}\n",[832,1049,1050],{"class":834,"line":908},[832,1051,1052],{},"\u002F* USER CODE END 0 *\u002F\n",[832,1054,1055],{"class":834,"line":914},[832,1056,845],{"emptyLinePlaceholder":844},[832,1058,1059],{"class":834,"line":919},[832,1060,1061],{},"int main(void)\n",[832,1063,1064],{"class":834,"line":925},[832,1065,1037],{},[832,1067,1068],{"class":834,"line":931},[832,1069,1070],{},"  ...\n",[832,1072,1073],{"class":834,"line":936},[832,1074,1075],{},"  MX_GPIO_Init();\n",[832,1077,1079],{"class":834,"line":1078},19,[832,1080,1081],{},"  MX_LWIP_Init();                     \u002F* generated: lwIP is up after this line (NO_SYS: no thread is started) *\u002F\n",[832,1083,1085],{"class":834,"line":1084},20,[832,1086,1087],{},"  \u002F* USER CODE BEGIN 2 *\u002F\n",[832,1089,1091],{"class":834,"line":1090},21,[832,1092,1093],{},"  Clock64_Init();\n",[832,1095,1097],{"class":834,"line":1096},22,[832,1098,1099],{},"  \u002F* USER CODE END 2 *\u002F\n",[832,1101,1103],{"class":834,"line":1102},23,[832,1104,1105],{},"  ... BSP LEDs, COM1 (printf) ...\n",[832,1107,1109],{"class":834,"line":1108},24,[832,1110,845],{"emptyLinePlaceholder":844},[832,1112,1114],{"class":834,"line":1113},25,[832,1115,1116],{},"  \u002F* USER CODE BEGIN WHILE *\u002F\n",[832,1118,1120],{"class":834,"line":1119},26,[832,1121,1122],{},"  tQfwXcpTcpRawGlueConfig xcpConfig =\n",[832,1124,1126],{"class":834,"line":1125},27,[832,1127,1128],{},"  {\n",[832,1130,1132],{"class":834,"line":1131},28,[832,1133,1134],{},"    .project_name = \"baremetal\",      \u002F* shown to the master, \u003C= 31 chars *\u002F\n",[832,1136,1138],{"class":834,"line":1137},29,[832,1139,1140],{},"    .epk = \"V100\",                    \u002F* software version id *\u002F\n",[832,1142,1144],{"class":834,"line":1143},30,[832,1145,1146],{},"    .port = 5555U,\n",[832,1148,1150],{"class":834,"line":1149},31,[832,1151,1152],{},"    .log_level = 2U,                  \u002F* 1 error, 2 warning, 3 info (adds connection messages) *\u002F\n",[832,1154,1156],{"class":834,"line":1155},32,[832,1157,1158],{},"    .get_clock_us = XcpClockUs,\n",[832,1160,1162],{"class":834,"line":1161},33,[832,1163,1164],{},"  };\n",[832,1166,1168],{"class":834,"line":1167},34,[832,1169,1170],{},"  if (!QfwXcpTcpRawGlue_Init(&xcpConfig))   \u002F* engine init + listening pcb *\u002F\n",[832,1172,1174],{"class":834,"line":1173},35,[832,1175,1128],{},[832,1177,1179],{"class":834,"line":1178},36,[832,1180,1181],{},"    Error_Handler();\n",[832,1183,1185],{"class":834,"line":1184},37,[832,1186,1187],{},"  }\n",[832,1189,1191],{"class":834,"line":1190},38,[832,1192,1193],{},"  if (!QfwXcpDemo_Init())                   \u002F* qfw_xcp_create_event(\"demo10ms\", 10000) -> id 0, maps *\u002F\n",[832,1195,1197],{"class":834,"line":1196},39,[832,1198,1128],{},[832,1200,1202],{"class":834,"line":1201},40,[832,1203,1181],{},[832,1205,1207],{"class":834,"line":1206},41,[832,1208,1187],{},[832,1210,1212],{"class":834,"line":1211},42,[832,1213,845],{"emptyLinePlaceholder":844},[832,1215,1217],{"class":834,"line":1216},43,[832,1218,1219],{},"  while (1)\n",[832,1221,1223],{"class":834,"line":1222},44,[832,1224,1128],{},[832,1226,1228],{"class":834,"line":1227},45,[832,1229,1230],{},"    MX_LWIP_Process();         \u002F* ETH RX + lwIP timers; the glue's TCP callbacks run in here -> qfw_xcp_rx *\u002F\n",[832,1232,1234],{"class":834,"line":1233},46,[832,1235,1236],{},"    Clock64_Update();          \u002F* single writer of the 64-bit clock, must run well below every 7.8 s *\u002F\n",[832,1238,1240],{"class":834,"line":1239},47,[832,1241,1242],{},"    QfwXcpTcpRawGlue_Poll();   \u002F* qfw_xcp_poll -> transmit callback -> tcp_write, then one tcp_output *\u002F\n",[832,1244,1246],{"class":834,"line":1245},48,[832,1247,1248],{},"    QfwXcpDemo_Poll();         \u002F* every 500 ms: map tick (the 10 ms signal step + DAQ event runs in SysTick, see below) *\u002F\n",[832,1250,1252],{"class":834,"line":1251},49,[832,1253,1254],{},"    \u002F* USER CODE END WHILE *\u002F\n",[832,1256,1258],{"class":834,"line":1257},50,[832,1259,1260],{},"    \u002F* USER CODE BEGIN 3 *\u002F\n",[832,1262,1264],{"class":834,"line":1263},51,[832,1265,1187],{},[832,1267,1269],{"class":834,"line":1268},52,[832,1270,1271],{},"  \u002F* USER CODE END 3 *\u002F\n",[832,1273,1275],{"class":834,"line":1274},53,[832,1276,1047],{},[376,1278,1279,478,1282,1285,1286,1289,1290,1293,1294,1297,1298,1301,1302,819,1305,1308,1309,1311,1312,1315,1316,1319,1320,654,1323,1325,1326,1328],{},[389,1280,1281],{},"Proč toto pořadí:",[380,1283,1284],{},"QfwXcpTcpRawGlue_Init"," musí běžet až po\n",[380,1287,1288],{},"MX_LWIP_Init()"," (vytváří naslouchající pcb) a — chcete-li vidět jeho\núvodní hlášku — až po inicializaci COM portu; proto je v sekci\n",[380,1291,1292],{},"USER CODE WHILE"," těsně před smyčkou, ne v ",[380,1295,1296],{},"USER CODE 2",". Uvnitř\nsmyčky je ",[380,1299,1300],{},"MX_LWIP_Process"," první (přijaté příkazy se vykonají a jejich\nodpovědi zařadí do fronty), poll je v témže průchodu odešle.\n",[380,1303,1304],{},"QfwXcpDemo_Poll",[380,1306,1307],{},"app\u002Fxcp_demo.c",") je cyklická práce aplikace:\nplánuje podle ",[380,1310,603],{}," s termíny odolnými proti přetečení, takže\nopožděný průchod nedohání dávkou volání — vzor ",[380,1313,1314],{},"DemoDue"," převezměte pro\nvlastní cykly ve smyčce. Rychlý cyklus (krok signálů + DAQ event každých\n10 ms) běží v ",[380,1317,1318],{},"QfwXcpDemo_Tick1ms"," z přerušení SysTick (",[380,1321,1322],{},"USER CODE SysTick_IRQn 1",[380,1324,527],{},"), viz model kontextů níže. K integraci\npatří ještě dvě sekce ",[380,1327,531],{},":",[824,1330,1332],{"className":984,"code":1331,"language":986,"meta":828,"style":828},"\u002F* Core\u002FSrc\u002Fstm32h7xx_it.c *\u002F\n\u002F* USER CODE BEGIN Includes *\u002F\n#include \"xcp_demo.h\"\n\u002F* USER CODE END Includes *\u002F\nvoid SysTick_Handler(void)\n{\n  HAL_IncTick();\n  \u002F* USER CODE BEGIN SysTick_IRQn 1 *\u002F\n  QfwXcpDemo_Tick1ms();      \u002F* every 10 ms: generators + qfw_xcp_trigger_event, in interrupt context *\u002F\n  \u002F* USER CODE END SysTick_IRQn 1 *\u002F\n}\n\n\u002F* LWIP\u002FApp\u002Flwip.c - stav linky do glue *\u002F\n\u002F* USER CODE BEGIN 0 *\u002F\n#include \"xcp_tcp_raw_glue.h\"\n\u002F* USER CODE END 0 *\u002F\nstatic void ethernet_link_status_updated(struct netif *netif)\n{\n  if (netif_is_up(netif)) {\n\u002F* USER CODE BEGIN 5 *\u002F\n    QfwXcpTcpRawGlue_OnLinkChange(true);\n\u002F* USER CODE END 5 *\u002F\n  } else {\n\u002F* USER CODE BEGIN 6 *\u002F\n    QfwXcpTcpRawGlue_OnLinkChange(false);   \u002F* master je nedosažitelný: spojení zahodit hned *\u002F\n\u002F* USER CODE END 6 *\u002F\n  }\n}\n",[380,1333,1334,1339,1343,1347,1351,1356,1360,1365,1370,1375,1380,1384,1388,1393,1397,1401,1405,1410,1414,1419,1424,1429,1434,1439,1444,1449,1454,1458],{"__ignoreMap":828},[832,1335,1336],{"class":834,"line":835},[832,1337,1338],{},"\u002F* Core\u002FSrc\u002Fstm32h7xx_it.c *\u002F\n",[832,1340,1341],{"class":834,"line":841},[832,1342,993],{},[832,1344,1345],{"class":834,"line":848},[832,1346,1013],{},[832,1348,1349],{"class":834,"line":854},[832,1350,1018],{},[832,1352,1353],{"class":834,"line":860},[832,1354,1355],{},"void SysTick_Handler(void)\n",[832,1357,1358],{"class":834,"line":866},[832,1359,1037],{},[832,1361,1362],{"class":834,"line":872},[832,1363,1364],{},"  HAL_IncTick();\n",[832,1366,1367],{"class":834,"line":878},[832,1368,1369],{},"  \u002F* USER CODE BEGIN SysTick_IRQn 1 *\u002F\n",[832,1371,1372],{"class":834,"line":884},[832,1373,1374],{},"  QfwXcpDemo_Tick1ms();      \u002F* every 10 ms: generators + qfw_xcp_trigger_event, in interrupt context *\u002F\n",[832,1376,1377],{"class":834,"line":890},[832,1378,1379],{},"  \u002F* USER CODE END SysTick_IRQn 1 *\u002F\n",[832,1381,1382],{"class":834,"line":896},[832,1383,1047],{},[832,1385,1386],{"class":834,"line":902},[832,1387,845],{"emptyLinePlaceholder":844},[832,1389,1390],{"class":834,"line":908},[832,1391,1392],{},"\u002F* LWIP\u002FApp\u002Flwip.c - stav linky do glue *\u002F\n",[832,1394,1395],{"class":834,"line":914},[832,1396,1027],{},[832,1398,1399],{"class":834,"line":919},[832,1400,1008],{},[832,1402,1403],{"class":834,"line":925},[832,1404,1052],{},[832,1406,1407],{"class":834,"line":931},[832,1408,1409],{},"static void ethernet_link_status_updated(struct netif *netif)\n",[832,1411,1412],{"class":834,"line":936},[832,1413,1037],{},[832,1415,1416],{"class":834,"line":1078},[832,1417,1418],{},"  if (netif_is_up(netif)) {\n",[832,1420,1421],{"class":834,"line":1084},[832,1422,1423],{},"\u002F* USER CODE BEGIN 5 *\u002F\n",[832,1425,1426],{"class":834,"line":1090},[832,1427,1428],{},"    QfwXcpTcpRawGlue_OnLinkChange(true);\n",[832,1430,1431],{"class":834,"line":1096},[832,1432,1433],{},"\u002F* USER CODE END 5 *\u002F\n",[832,1435,1436],{"class":834,"line":1102},[832,1437,1438],{},"  } else {\n",[832,1440,1441],{"class":834,"line":1108},[832,1442,1443],{},"\u002F* USER CODE BEGIN 6 *\u002F\n",[832,1445,1446],{"class":834,"line":1113},[832,1447,1448],{},"    QfwXcpTcpRawGlue_OnLinkChange(false);   \u002F* master je nedosažitelný: spojení zahodit hned *\u002F\n",[832,1450,1451],{"class":834,"line":1119},[832,1452,1453],{},"\u002F* USER CODE END 6 *\u002F\n",[832,1455,1456],{"class":834,"line":1125},[832,1457,1187],{},[832,1459,1460],{"class":834,"line":1131},[832,1461,1047],{},[414,1463,1465],{"id":1464},"model-kontextů-kritická-sekce-a-přerušení","Model kontextů, kritická sekce a přerušení",[376,1467,1468,1469,1471,1472,1474,1475,1478,1479,1482,1483,1486,1487,1490,1491,1495],{},"Transport běží v jednom kontextu: v hlavní smyčce. lwIP v režimu\n",[380,1470,395],{}," běží jen uvnitř ",[380,1473,617],{},", takže callback ",[380,1476,1477],{},"recv"," glue\n(→ ",[380,1480,1481],{},"qfw_xcp_rx",") a ",[380,1484,1485],{},"QfwXcpTcpRawGlue_Poll"," (→ ",[380,1488,1489],{},"qfw_xcp_poll",") jej sdílejí\na pravidlo\n",[402,1492,1494],{"href":1493},"\u002Fcs\u002Fdevice-sdk\u002Fengine-contract#kontexty-rx-a-poll-pat%C5%99%C3%AD-k-sob%C4%9B","kontraktu enginu","\nje splněno samotnou konstrukcí.",[376,1497,1498,1499,1504,1505,1509,1510,1516,1517,1520,1521,819,1524,1526,1527,1529],{},"Měření přichází z druhého kontextu. Glue registruje ",[389,1500,1501,1502],{},"kritickou sekci\n",[380,1503,501],{}," (uložit PRIMASK, zakázat přerušení, obnovit při vnějším\nopuštění, s čítačem zanoření, protože engine sekci vnořuje — viz\n",[402,1506,1508],{"href":1507},"\u002Fcs\u002Fdevice-sdk\u002Fengine-contract#kritick%C3%A1-sekce-mus%C3%AD-b%C3%BDt-reentrantn%C3%AD","Kritická sekce",").\nDíky ní ",[389,1511,1512,1513,1515],{},"smí být ",[380,1514,513],{}," volán z přerušení"," — příklad\nspouští svůj event ",[380,1518,1519],{},"demo10ms"," ze ",[380,1522,1523],{},"SysTick_Handler",[380,1525,1318],{},",\nkaždých 10 ms), tak jako by to dělala regulační smyčka v časovači: vzorky\nDAQ a zápisy STIM tohoto eventu proběhnou uvnitř ISR, synchronně\ns cyklem, a perioda vzorkování nezávisí na tom, jak dlouho trvá průchod\nhlavní smyčky. ISR jen kopíruje do fronty enginu; bajty odejdou z desky\nv příštím ",[380,1528,1485],{},".",[376,1531,1532],{},"Důsledky, které musíte zachovat:",[1534,1535,1536,1548,1561,1567,1585,1598],"ul",{},[591,1537,1538,478,1543,627,1545,1547],{},[389,1539,1540,1541,1529],{},"Z přerušení jen ",[380,1542,513],{},[380,1544,1481],{},[380,1546,1489],{}," a každé další volání enginu zůstávají v hlavní smyčce.",[591,1549,1550,1553,1554,1557,1558,1529],{},[389,1551,1552],{},"Z přerušení nic z lwIP."," Ovladač CubeMX bez RTOS se tak chová už\nsám (ISR ETH pouze maže příznaky); nepřidávejte ",[380,1555,1556],{},"ethernetif_input"," ani\nvolání lwIP do ",[380,1559,1560],{},"HAL_ETH_RxCpltCallback",[591,1562,1563,1566],{},[389,1564,1565],{},"Práci v ISR držte krátkou."," Sekce zakáže všechna přerušení na dobu\nrežie fronty a kopie DAQ jednoho eventu (mikrosekundy); trigger\nvelkého seznamu eventu v rychlém ISR o tolik zvýší latenci přerušení\nvšem ostatním.",[591,1568,1569,1572,1573,1576,1577,1580,1581,1584],{},[389,1570,1571],{},"Log z ISR je potlačen."," Hláška enginu vzniklá uvnitř triggeru se\npočítá, netiskne (",[380,1574,1575],{},"printf"," blokuje a běžel by se zakázanými\npřerušeními); počet ohlásí příští ",[380,1578,1579],{},"Poll"," jako ",[380,1582,1583],{},"[XCP W] n engine log line(s) raised in interrupt context not printed",". Při měření se tento\nřádek nesmí objevit.",[591,1586,1587,1588,510,1591,662,1594,1597],{},"Glue je napsaná pro Cortex-M (",[380,1589,1590],{},"__get_PRIMASK",[380,1592,1593],{},"__disable_irq",[380,1595,1596],{},"__set_PRIMASK"," z CMSIS). Na jiném jádru obě funkce nahraďte\nekvivalentní globální maskou přerušení se stejným chováním zanoření.",[591,1599,1600,1601,1603,1604,1607,1608,1611],{},"Průchod smyčky je kadence pollu. Dlouhá práce v jednom průchodu\nzdržuje odpovědi i vysílání DAQ: ",[380,1602,1575],{}," při ",[380,1605,1606],{},"log_level"," 3 stojí\n≈ 4 ms na řádek na virtuálním COM portu ST-LINK a ",[380,1609,1610],{},"HAL_ETH_Transmit","\novladače CubeMX bez RTOS blokuje, dokud DMA rámec neodešle (≈ 0,12 ms\nna plný rámec při 100 Mbit\u002Fs).",[414,1613,1615],{"id":1614},"spojení-co-glue-dělá-a-co-uvidíte","Spojení: co glue dělá a co uvidíte",[376,1617,1618],{},"Politika je stejná jako u glue pro FreeRTOS, provedená nad RAW API:",[419,1620,1621,1631],{},[422,1622,1623],{},[425,1624,1625,1628],{},[428,1626,1627],{},"Situace",[428,1629,1630],{},"Co se stane",[435,1632,1633,1652,1685,1693,1701,1715,1739],{},[425,1634,1635,1638],{},[440,1636,1637],{},"master se připojí",[440,1639,1640,1641,1644,1645,1648,1649],{},"callback ",[380,1642,1643],{},"accept",": nastaví se keepalive (2 s \u002F 1 s \u002F 3), ",[380,1646,1647],{},"qfw_xcp_on_transport_reset()",", pcb se stane jediným spojením; na úrovni 3 ",[380,1650,1651],{},"[XCP I] master connected from ip:port",[425,1653,1654,1660],{},[440,1655,1656,1659],{},[389,1657,1658],{},"druhý"," klient se připojí, zatímco je master připojen",[440,1661,1662,1663,1666,1667,654,1670,1672,1673,1676,1677,1680,1681,1684],{},"odmítnut ",[389,1664,1665],{},"okamžitě"," pomocí RST (",[380,1668,1669],{},"tcp_abort",[380,1671,1643],{},"); běžící relace není narušena. ",[380,1674,1675],{},"[XCP W] refused a second connection from ip:port (master already connected)",". Druhý QInsight ukazuje jednou za sekundu ",[380,1678,1679],{},"connected"," → ",[380,1682,1683],{},"forcibly closed"," a připojí se, jakmile první relace skončí",[425,1686,1687,1690],{},[440,1688,1689],{},"master zavře (FIN) nebo spadne (RST)",[440,1691,1692],{},"glue spojení zruší (RST) — každé zavření je abort, takže pcb i všechny zařazené segmenty se uvolní okamžitě; reset enginu; zpět do čekání na mastera",[425,1694,1695,1698],{},[440,1696,1697],{},"master tiše zmizí za linkou desky (kabel vytažený u switche, vypnuté nebo zamrzlé PC)",[440,1699,1700],{},"keepalive spojení zruší ~5 s po posledním přijatém segmentu; do té doby je znovu se připojující master odmítán jako druhý klient — driver QInsight zkouší každou sekundu a po vypršení se připojí",[425,1702,1703,1709],{},[440,1704,1705,1706,1708],{},"proud bajtů se rozsynchronizuje (",[380,1707,1481],{}," vrátí false)",[440,1710,1711,1712],{},"spojení je zrušeno (RST), ",[380,1713,1714],{},"[XCP E] XCP stream desynchronized",[425,1716,1717,1725],{},[440,1718,1719,1720,1680,1722,495],{},"vysílací fronta nebo heap lwIP jsou plné (",[380,1721,645],{},[380,1723,1724],{},"ERR_MEM",[440,1726,1727,1730,1731,1734,1735,1738],{},[389,1728,1729],{},"backpressure",": callback ",[380,1732,1733],{},"transmit"," vrátí false, engine si segment ponechá a při příštím pollu nabídne tytéž bajty; ",[380,1736,1737],{},"qfw_xcp_is_backpressured()"," je mezitím pravdivé. Master, který žije, ale přestal číst, drží glue v backpressure, dokud se nepřipojí znovu",[425,1740,1741,1744],{},[440,1742,1743],{},"výpadek linky u desky (kabel vytažený z desky)",[440,1745,1746,1747,654,1750,1680,1753,1756,1757,1759,1760,1763,1764,1767],{},"link callback (",[380,1748,1749],{},"ethernet_link_status_updated",[380,1751,1752],{},"lwip.c",[380,1754,1755],{},"QfwXcpTcpRawGlue_OnLinkChange(false)",") přiměje glue spojení s masterem zahodit v příštím ",[380,1758,1579],{}," (na úrovni 3 ",[380,1761,1762],{},"[XCP I] connection closed (link down), waiting for a master","). Po návratu linky je nové připojení mastera přijato okamžitě; s ",[380,1765,1766],{},"connectionTimeoutMs"," 1500 v QInsight je měření zpět zhruba 3,5 s po zasunutí kabelu (vyjednání linky plus jeden pokus, který vypršel, protože začal příliš brzy)",[376,1769,1770,1771,1774,1775,1529],{},"Nagleův algoritmus je zapnutý (výchozí chování TCP, stejně jako v glue\npro FreeRTOS): malý paket může čekat na zpožděný ACK mastera (≈ 200 ms\nve Windows) — časové značky DAQ to neovlivní, jen příchod pomalých\nproudů je dávkovaný. Přepínač ",[380,1772,1773],{},"GLUE_TCP_NODELAY"," na začátku glue\npřepne na ",[380,1776,1777],{},"TCP_NODELAY",[376,1779,1780,1781,1784,1785,1529],{},"Ukázkový projekt QInsight pro tento obraz\n(",[380,1782,1783],{},"Qenex_TcpClient_XCP_NucleoH723_Maps_BareMetal.qproj",") popisuje\nkapitola ",[402,1786,1787],{"href":358},"Kalibrační mapy po XCP on TCP",[414,1789,1791],{"id":1790},"dále","Dále",[376,1793,1794,1796,1797,1799],{},[402,1795,269],{"href":270}," — pravidla, která za\nglue stojí; ",[402,1798,281],{"href":279}," — řádky pro\nintegraci bez RTOS v tabulce příznaků.",[1801,1802,1803],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":828,"searchDepth":848,"depth":848,"links":1805},[1806,1807,1808,1809,1811,1812,1813],{"id":416,"depth":841,"text":417},{"id":568,"depth":841,"text":569},{"id":806,"depth":841,"text":807},{"id":959,"depth":841,"text":1810},"main.c: jednou Init, pak stále Poll",{"id":1464,"depth":841,"text":1465},{"id":1614,"depth":841,"text":1615},{"id":1790,"depth":841,"text":1791},"Co se mění, když firmware nemá FreeRTOS — glue nad lwIP RAW API volaná z hlavní smyčky, nastavení lwIP v režimu NO_SYS (TCP_MSS, TCP_SND_BUF), napojení v CMake, Init a Poll v main.c, model jediného kontextu bez kritické sekce a chování spojení včetně odmítnutí druhého klienta.","md",{},{"title":264,"description":1814},"I9vkRi6OxvJFdSYfAMMk_6CSgzwFQe5O5uUERgRF2-Y",[1820,1821],{"title":259,"path":260,"stem":261,"navTitle":262,"children":-1},{"title":269,"path":270,"stem":271,"navTitle":269,"children":-1},1791554569894]