Zur Frage der Vermehrung, der Quadratwurzel, der Importsubstitution und des Milander

    „Entropie, ergodische Quelle, mehrdimensionaler Nachrichtenraum, Bits, Polysemie, Markov-Prozess - all diese Wörter klingen ziemlich beeindruckend in der Reihenfolge, in der sie angeordnet sind. Wenn wir sie in der richtigen Reihenfolge anordnen, erhalten sie einen bestimmten theoretischen Inhalt. Und ein echter Experte kann manchmal sie nutzen Lösungen für alltägliche praktische Probleme zu finden. „

    John Pierce“ See No Evil "


    Dieser Beitrag ist voll von subtiler Argumentation Optimierung auf der MC mit begrenzten Ressourcen mathematische Operationen durchführen, sowie subjektive Einschätzungen von verschiedenen Aspekten der Entwicklung von Embedded - Software.

    Diejenigen, die diese Warnung nicht erschrecken, bitte unter der Katze.

    Bevor wir auf die Beschreibung des Wurzelextraktionsverfahren Quadrat einer ganzen Zahl, die Operation invers zur Quadrierung und entsprechend vorgehen, Multiplikation, lassen Sie uns über letzteren sprechen.

    Angenommen, wir haben die Möglichkeit, eine 8-Bit-Zahl mit einer 8-Bit-Zahl zu multiplizieren, um ein 16-Bit-Ergebnis (8 * 8 = 16) zu erhalten, wie Sie auf der Grundlage dieser Operation eine Implementierung der Operation 16 * 16 = 32 erhalten. Der naheliegende Weg ist, 16 als Summe von zwei 8 darzustellen, dann erhalten wir

    А(16)*Б(16)=(а1(8)*256+а2(8))*б1(8)*256+б2(8)) =а1*б1*256*256+а1*б2*256+а2*б1*256+а2*б2

    Wenn wir den Ausdruck zu ersetzen, die Multiplikation mit 256 Verschiebung nach links um 8 Bits zu erhalten, stellt sich heraus, es ist ein Arbeits Algorithmus ist. Wir schätzen die Zeit für die Durchführung der Kosten - wir 4 multiplizieren müssen 8 * 8 = 16 und 4, Hinzufügen von einer 4-Byte-Zahlen 32 + 32 = 32. Für AVR MK Typen erhalten Sie die 4 * 4 * 2 + 4 = 24 Zyklen, aber es ist das zu lösen "Kopf". Versuchen Sie, das Ergebnis zu verbessern. Was wir brauchen, ist nicht 4 und 3 und die Zugabe von einer Zuordnung vereinfacht die Situation etwas, da es keine anfängliches Null-Ergebnis erfordert, aber wir nehmen noch nicht berücksichtigt, obwohl es notwendig war, und die Gesamtzeit sollte 24 + 4 = 28 Zyklen sein. Aber wenn wir berücksichtigen, die Anwesenheit der Verschiebung bei der ersten von drei Begriffe (oder haben die Junior (zwei am wenigsten Bytes) Null ist, und fügen Sie es zu dem Ergebnis, macht keinen Sinn), ist es notwendig, nicht 4 Byte hinzuzufügen, und drei, und zwei, Dadurch verkürzt sich die Ausführungszeit um 1 * 2 + 2 = 4 Uhren, und wir erhalten 20 Uhren. Als Nächstes können wir auf die Tatsache aufmerksam machen, dass sich der erste und der letzte Summand überhaupt nicht schneiden, wodurch das Nullen der oberen Hälfte des Ergebnisses durch die Zuweisung des ersten Addends ersetzt und die Ausführungszeit um zwei weitere Zyklen auf 18 verringert wird. Als nächstes werden die architektonischen Merkmale verwendet, nämlich das Vorhandensein des Registertransferbefehls Paare, speichern Sie zwei weitere Bars und das Endergebnis - 16 Zyklen statt der ursprünglichen 28 - eine Kleinigkeit, aber schön.

    Ähnliche Optimierungsmethoden funktionieren für den Betrieb 32 * 32 = 32, für den Sie die Ausführungszeit von erwarteten 4 * 4 * (2 + 4) + 4 = 100 Zyklen auf (3 + 5 + 4 + 3) + (5 + 3) reduzieren können 3) + (4 + 3) + 3 = 36 Zyklen, was ziemlich gut ist. Nun, am Ende der Betrachtung verschiedener Multiplikationsoptionen stellen wir fest, dass 16 * 16 = 16 in 3 + 3 + 3 = 9 Zyklen erhalten werden kann. Beachten Sie, dass alle diese Argumente gelten nur unter der Annahme , dass der Betrieb 8 * 8 = 16 für 2 Zyklen, und wenn es nicht auf dem Zielgerät vorhanden ist , die Ausführungszeit aller anderen Versionen des Betriebes wird sicherlich nicht schneller.

    Um die Zeit zu fassen erforderlich ist, um die Multiplikation durchzuführen (8 * 8 = 8 2, 8 * 8 = 16 9 16 * 16 = 16 16, 16 * 16 = 32 36) , und wir betrachten nun das ursprüngliche Problem.

    Wir brauchen die ganze Zahl Quadratwurzel aus einer 32-Bit - Zahl N, das heißt zu entfernen, die größte 16 - Bit - Zahl n , so daß n * n <= N zu finden Wir sind alle von einem High - School - Kurs kennen die Methode der sukzessiven Approximation der Quadratwurzel (n = (N / n + n) / 2), aber wenn Sie es verwenden , müssen wir ganze Zahlen teilen, und es ist sehr teuer für die Betriebszeit.

    Daher wurden andere Berechnungssysteme entwickelt worden, von denen einer - bitweise Approximationsverfahren, die eine Pseudo-Code ist wie folgt:

    • Anfangswerte -> n = 0; b = 0x8000;
    • 16 mal durchführen -> wenn ((n + b) * (n + b)> = H) n = n + b; b = b >> 1;

    Wir können die Zeitschätzung erforderlich , wenn diese Variante 16 (die Anzahl der Bits des Ergebnisses) durchzuführen * (2 (Zyklus Organization) 2 (Zugabe) + X (Multiplikation) 5 (Vergleich und die Entscheidung) 2 (Modifikation Ergebnisse) / 2 (Durchschnitt Eineinhalbfache) 2 (Bitverschiebung)) = 16 * (12 + X). Sie fragen sich vielleicht, warum in der Formel X, statt 16, und es stellt sich heraus , dass wir einen Hinterhalt erwarten, wenn wir in C anstatt in Assemblersprache schreiben. Die Tatsache , dass die Standard - Bibliothek ist nicht die Multiplikationsoperation mit dem Wechsel des Bits und wir können die 16 * 16 = 32 nicht zur Anwendung, und ist zu 32 verwendet gezwungen * 32 = 32, das anstelle von X = 16 bis x = 36 führt , und die endgültige Zahl von 16 * 48 = 768 Zyklen für den ganzzahligen Wert der Quadratwurzel aus der Anzahl 32-Bit zu extrahieren.

    Natürlich ist es viel besser als die Newton-Verfahren, aber ein bisschen zu viel, werden wir sehen , was wir tun können.
    So ist es offensichtlich, dass die Zeit, um das Ergebnis der nächsten Multiplikation berechnen genommen. Natürlich können Sie den Assembler neu zu schreiben und eine weniger kostspielige Version der Multiplikation 16 * empfing verwenden (12 + 16) = 448 Zyklen, aber auf diese Weise wir im Notfall verlassen. Betrachten wir den Prozess eng und sehen, dass wir nicht die Multiplikation der Zufallszahl selbst berechnen, und die Multiplikation des vorherigen Wertes mit der Zugabe von einer Art, und den vorherigen Wert des Platzes bekannt. Wir können also auf die Differenz Schema zurückgreifen, auf der Grundlage der Formel (n + b) * (n + b) = n * n + 2 * n * b + b * b. Auf den ersten Blick sieht es nach einem Spott aus: Statt einer Multiplikation müssen wir vier Stücke ausführen und sogar zwei Hinzufügungen langer (32-Bit) Zahlen. Aber lassen Sie uns beginnen zu verstehen: n * n wir bereits haben, b * b, da b = b / 2 ist leicht zu bekommen, wie verwendet '* b' / 4, und in ähnlicher Weise 2 * n * B = 2 * n * b '/ 2.

    Das folgende Berechnungsschema erscheint:

    1. Anfangswerte -> nn = 0; n = 0; b = 0x8000; bb = b * b;
    2. 16 mal wiederholen -> wenn (nn + n + bb> = n) {n = n + b; nn nn = + bb + n}; bb >> 2; b> 1;

    Wir schätzen die Implementierungskosten 16 * (2 (Zyklusorganisation) +12 (Zuordnung und zwei Ergänzungen) +5 (Vergleich und Lösung) + (2 (Zusatz) +8 (zwei Ergänzungen)) / 2 (durchschnittlich die Hälfte der Halbzeiten) +8 (Verschiebung um 2 nach rechts) +2 (Verschiebung nach rechts) = 16 * 34 = 544 Zyklen. Besser als mit der falschen Multiplikation 32 * 32, und wir haben noch Reserven.

    Was ist das - achten Sie auf die kostspieligste Operation - Addition und Vergleich insgesamt 17 Zyklen und
    erneute Erstellung der Hauptschleife des Algorithmus: 2. Wiederholung 16 mal → T = Nbbn; wenn (T> = 0) {H = T; n = n + b);}; bb >> 2; b> 1;
    Dann wird die Schleifenzeit ist 16 * (2 (looping) 12 (Berechnung der neuen Differenz) 1 (Vergleich und die Entscheidung) + ((4 (Zuordnung) 2 (Zugabe)) / 2 ( die Hälfte der Zeit im Durchschnitt) 8 +2) = 16 * 28 = 448 Zyklen, wenn Sie die Besonderheiten der Architektur berücksichtigen, können Sie weitere 2 + 2 = 4 * 16 = 64 Zyklen speichern und weniger als 400 Zyklen

    anpassen Die korrekte Multiplikation ist 16 * 16 = 32, aber ohne Assembler "auf reinem C". Allerdings gibt es ein deutliches Minus - wenn in der Variante mit Multiplikation alles intuitiv ist, dann die Variante mit Differenzschema ohne Kommentare s Eindruck einer Sitzung der schwarzen Magie, die Sie wählen. Wir bemerken auch , dass wir die Zahl der Maßnahmen auf den zusätzlichen Speicher für die Zwischenvariablen ausgetauscht haben, und in der Regel geschieht.

    Notwendige Informationen - wir haben keine signifikante (zeitweise) zu gewinnen, die die Multiplikation erhalten verglichen, weil wir eine schnelle Umsetzung von 8 * 8 = 16 haben. Wenn es in MK nicht vorhanden ist (und dies geschieht) oder nicht so schnell (und auch dies geschieht), wird das Differenzschema um ein Vielfaches schneller, da es nur Standardadditions- und -verschiebungsoperationen verwendet, die garantiert in jedem MK vorhanden sind.

    Es schien , am besten nicht herausgekommen ist, aber es stellt sich heraus, gibt es noch Reserven der Steigerung der Produktivität des Algorithmus ist. Versuchen wir, eine andere klassische Beschleunigungsmethode zu verwenden - dividieren und überwinden. Was passiert , wenn die erste , die Quadratwurzel aus der oberen Hälfte des Arguments extrahiert und sie dann verfeinern? Zunächst zeigen wir, dass dies grundsätzlich möglich ist. Tatsächlich repräsentieren wir das Argument in der Form H = H '<< 16 + H' 'und das Ergebnis in der Form n = n' << 8 + n ''. Da n "<256 ist, ist das Quadrat davon sicherlich kleiner als das Quadrat der Zahl n = n" << 8 + 256 = (n '+ 1) << 8. Daraus folgt , dass der ältere Teil des Ergebnisses nicht die Quadratwurzel aus dem älteren Teil des Arguments nicht übersteigt.

    Die Umsetzung dieses Ansatzes soll dem neugierigen Leser überlassen.
    Was für ein ähnlicher Ansatz wird uns geben, da die Gesamtzahl der Iterationen unverändert bleibt - wir können die erste Hälfte der Iterationen mit kürzeren Zahlen verwenden, was zu einer Verringerung der Zeitkosten führt. Dieser Ansatz kann auch auf eine Ausführungsform der Multiplikation angewandt werden und zu einer Differential Ausführungsform ist die Gesamtverstärkung ist ein Viertel der gesamten Ausführungszeit.

    Notwendige Informationen - die Anwendbarkeit dieses Ansatzes ist nicht ganz klar, die Umsetzung des Typs AVR MC ist wirklich eine Beschleunigung der Umsetzung, aber für einige Architekturen wie x86, langsam ganz plötzlich nach unten erschienen. Offensichtlich ist das Arbeiten mit nicht nativen Daten (16 Bit) in dieser Architektur zeitlich wesentlich teurer als mit nativen (32 Bit) Daten. Ich habe nicht tief recherchiert, aber die Tatsache fand statt und sollte darüber berichten, um Missverständnisse zu vermeiden.

    Aber das ist nicht alles. Da wir uns bereits auf den Weg der Teilung und der Herrschaft begeben haben, warum gehen wir nicht weiter - extrahieren Sie die Wurzel Schritt für Schritt, beginnend mit den älteren (beginnend mit den jüngeren ist dies in unserem Fall kontraproduktiv). Diagramm ist die gleiche - wir auf das aktuelle Ergebnis des nächsten Teils des Bit hinzufügen, und versuchen Sie einen anderen Bit auf das Ergebnis hinzuzufügen, überprüft, ob wir für den Wert der Wurzel sind. Merkmal ist, dass wir nur die führenden Bits des Arguments überprüfen, solange wir die jüngere erreichen.

    Bei der Verwendung von anderen Trick implementiert - statt sich zu bewegen unsere subtrahieren Zahlen rechts, werden wir unsere schrumpfende Argument links bewegen, was bedeutet, es nicht zu ändern, und die Geschwindigkeit erhöht. Erhöht durch zwei Faktoren - 1) müssen wir nur 16 Bit-Zahlen subtrahieren (es gibt eine Funktion, die berücksichtigt werden muss, aber wir betrachten das Trainingsbeispiel, howl) und 2) wir müssen das Quadrat des nächsten Bits nicht verschieben, da es immer so bleibt Einheit. Aber für alles, was in dieser Welt müssen Sie zahlen, und wir verschieben Differenz (6 Byte) erweitert wird auf der linken Seite, mit 2 Bit pro Taktzyklus. Genießen Sie einen Pseudo

    1. Anfangswerte -> n = 0; H1 = 0;
    2. 16 mal wiederholen -> (H1, H) << 2; T = H1-n-1; wenn (T> 0) {H1 = T; n = n + 2}; n << 1;

    und schätzen die Ausführungszeit, wobei 16 * (12 (erweiterte Schicht)) +4 (Berechnung des Rennens) +1 (Entscheidung) +2 (Zuweisung) +1 (Erhöhung) +2 (Schicht)) = 16 * 22 = 352 Zyklen erhalten wird das Ergebnis ist auf die ideale Nähe. Bei der Implementierung dieser Option gibt es kleine Fallstricke, die ich dem neugierigen Leser wieder überlasse (er bekommt die Arbeit).

    Nun, am Ende des Abschnitts wurde ich inspiriert, diesen Beitrag zu schreiben. Es gibt durchaus bemerkenswerte Bibliothek McuCpp, verfaßt von Anton Tschischow, in dem ein ungewöhnlich elegant (na ja, so weit man von Eleganz angewandt Vorlagen in C ++ sprechen kann) auf der Grundlage der Klasse loki Urheberschaft Andriesku implementiert die Stifte <a « github.com/KonstantinChizhov/ Mcucpp„Ich habe großen Respekt vor dem genannten Autor (für beide) und in letzter Zeit habe ich mir aus späteren Umständen später den Quellcode dieser Bibliothek angesehen und erneut bewundert.

    Unter anderen Dateien habe ich jedoch template_utils.h gesehen, in dem einige Hilfssubroutinen implementiert wurden, darunter eine Ganzzahl-Wurzel aus einer 32-Bit-Zahl. Die Tatsache, dass es eine einfache sukzessive Approximation Algorithmus mit Multiplikation verwendet, nicht beängstigend, weil dieser Algorithmus nicht so sehr in der Leistung zu verlieren, und Klarheit gibt viele Punkte Vorsprung und noch gewinnt. Aber jetzt, wo er ein paar schlampig realisiert (in Bezug auf die Leistung), ich stark unbeliebt, weil „es die Kinder sehen können.“ Sorglosigkeit ist die aufgenommene Nummer 32 Bits zu präsentieren, weil wir wissen, dass die Wurzel der 32-Bit-Nummer wird nicht mehr als 16 Bits gehen, also warum sollten wir tun, Verschiebungen von Null-Bytes. Und dies ist der Fall,

    Die offensichtliche Transformationsfunktion

    static inline uint32_t sqrt(uint32_t value) {
      uint16_t result = 0;
      uint16_t add = 0x8000;
      for (uint8_t i = 16; i !=0; ++i) {
    	uint32_t rootGuess = result | add;
    	uint32_t guess = rootGuess * rootGuess;
    	if (value >= guess) {
    		result = rootGuess;
    	}
    	add >>= 1;
      }
      return result;
    }

    erlaubt es uns, 2 Uhren bei einer Bitverschiebung und 2 Uhren beim Erstellen des nächsten Multiplikators in jedem Zyklus zu speichern, und den Zyklus in der angegebenen Form zu organisieren, sind 4 weitere Uhren (Ich weiß, dass der Compiler diese Optimierung für uns durchführen kann, aber warum nicht ausdrücklich helfen ), was ziemlich gut für rein kosmetische Codeänderungen ist, die die Klarheit überhaupt nicht beeinträchtigen.

    Spätnotiz - ein Kommentar brachte mich auf den Gedanken, dass es korrekter wäre

     for (uint_fast8_t i= ...)

    Danke, Oleg, für den Hinweis.

    Die Kirsche auf der Torte befindet sich knapp unter der Funktion, die gesamte Quadratwurzel der Vorzeichen-Nummer zu extrahieren, die besagt, dass √-1 = 65635 = -1 ist. Warum aber nicht, als dieses Ergebnis ist schlechter als jedes andere, ist es keine Ausnahme rufen Sie MK auf, und die gesamte Quadratwurzel einer negativen Zahl existiert nicht.

    Und die Schlussfolgerung, warum ich mich an die Bibliothek von Anton Chizhov gewandt habe. Er hat mich zu diesem kürzlich veröffentlichten Beitrag zum nationalen RTOS für MK namens MAKS (MultiAgent Coherent System) aufgeschoben - siehe die Inschrift zu dem von seinen Erstellern angekündigten Beitrag, der auf Milandr von MK portiert wird. Bemerkung - Dieser Beitrag ist keinesfalls Werbematerial und wird den Lesern bald klar werden. Von dem bereits erwähnten mcucpp verwendeten die OS-Autoren die Implementierung des Ringpuffers (ohne die Vorteile der Bibliothek von Anton zu beeinträchtigen, muss ich erklären, dass dieser Teil keine Referenz ist, und dies ist immer noch eine milde Formulierung, über die ich in einem anderen Post geschrieben habe, den ich in keiner Weise posten kann). Da ich eng mit MK Production zusammenarbeitete, interessierte ich mich für das Material und folgte dem Link zur Entwicklerseite.

    Hier beginnt eine andere weinen Yaroslavna.

    Bereits im vergangenen Jahr, als es zunächst die Erstellung der nationalen RTOS angekündigt, heruntergeladen ich von dieser Seite Beschreibung der Software, aber die Hände kommen nicht , um zu studieren. Lauf ihrer Arbeit muß ich mit inländischen Komponenten befassen (ich verstehe genug ...), so dass die entsprechende Software haben , wäre gar nicht so schlecht sein. Denken Sie daran , wie im vergangenen Jahr der Freilassung des Regisseurs von raskazyval Millionen Rubel auf der Entwicklung und ein großes Team verbringen, arbeitende Menschen auf der Schaffung dieser Software, habe ich beschlossen , kostenlos eine Testversion zum Download zur Verfügung zu sehen, hier und die Ergebnisse gemeinsam nutzen.

    Um damit zu beginnen, Beschreibungen für Volumen verringerten Hälfte fast verdoppelt (115-55 Seiten), und, wenn das Verschwinden von Anwendungen mit Screenshots beschriebener Verfahren drittes Produkt aus der „Beschreibung des Programms“ Start willkommen ist, gibt es kein Auftreten dieser Materialien (die Schaffung von denen es ist zwar nicht sehr bedeutend ausgegeben worden, aber immer noch Zeit und Geld) in dem Dokument wie „Handbuch“ ich habe persönlich rätselhaft. Ferner wurde in dem ersten Satz des Dokuments, wir eklatante Abweichung von der Wahrheit zu sehen, da die RTOS selbst nicht „schaffen Programme“ zu ist so konzipiert, warum in einer früheren Version des Dokuments der Autoren solcher Aussagen fühlte sich nicht erlauben, die Auswirkungen von Marketing-Dienstleistungen. es gibt auch, dass, wenn die frühere Beschreibung wurde im Ordner / docs Root-Verzeichnis liegt, und es war logisch,

    Beginnen Sie Beschreibung beobachten Blick in den Quellcode (er gnädig in der Testversion enthalten) und mit einem verwirrten das Fehlen jeglicher Art erfasst war Peripherietreiber-Module, angepasst mit diesem Betriebssystem zu arbeiten. Zuerst schlug ich vor, dass diese Funktion testen, danach auf einem Forum in Informationen von den Entwicklern finden, dass die Fahrer nicht, aber sie arbeiten daran. Mehr als sechs Monate (sechs Monate, Carl, eigentlich fast ein Jahr) ab dem Tag der Veröffentlichung des OS zum MC, und sie arbeiten für die Fahrer. Natürlich oder wie sie sagen, natürlich, dass jedes dritte Produkt (Dateisystem, Netzwerk-Stack, USB-Stack) können nicht berücksichtigt werden. Lustige Darstellung der Autoren der Anforderungen an die Softwareentwicklung für MK, okay, fuhr wieder.

    Das deklarierte Betriebssystem, dessen unterstrichenes Merkmal die Organisation der Interaktion innerhalb des Multicontrollersystems ist, verfügt über keine systemeigenen Mittel, um diese Interaktion zu organisieren. Was wir in der unteren Zeile haben - und wir haben eine Aufgabenverwaltung, Scheduler selbst bedeutet die Mindestdienstzeit und Aufgabensynchronisierung alle - Spaß, wenn nicht mehr. Okay, lassen Sie uns weiter suchen, auch in dieser Reihe von Komponenten kann eine interessante Lösung sein, vor allem, wenn Sie, dass am gleichen Ort betrachten (die nicht vom Hersteller) auf den Link „Experte“ Quellcode des Betriebssystems zu sehen. In diesem Dokument wurde gesagt, dass die Software nicht von Drittanbietern (importiert) Komponente nicht verwendet und ist originell, ist es notwendig, sicher zu machen.

    Die erste Bemerkung ist, dass, wenn die im Quellpaket enthaltenen Original-ARM-Dateien für die Portierung auf eine bestimmte Cortex-M0 (1986 BE1T) -Architektur verwendet werden, dies sehr ähnlich der Verwendung von (importierten) Textfragmenten von Drittanbietern ist - mir persönlich scheint dies genau die Verwendung zu sein ich glaube, ich weiß nicht alles. Zweitens: Der Quellcode des Shedulers und seine zugehörigen Aufgabenverwaltungskomponenten sind wirklich originell und haben keine Analoga (zumindest sind sie mir nicht bekannt), aber dies ist die Art von Originalität, die an den Satz des alten Schamanen aus dem Film "Evil Spirit of Yambuya" erinnert. ein großer Jäger: "Ohren geschnitten, gekocht und gegessen - hätten Sie gedacht?"

    Versuchen Sie zu erklären - bei der Gestaltung von Betriebssystemen im Allgemeinen und insbesondere RTOS in einer der am schwierigsten ist die Frage des Zugangs für alle Prozesse im System auf die gemeinsam genutzte Ressource bereitstellt - CPU-Laufzeit. Die Tatsache, dass das System richtig ausgelegt (und schlecht Aufgabe geschrieben) kann die Ausführung aller Aufgaben blockiert mit einer niedrigeren Priorität, die sicherlich Programmierer verwirren. Es geht nicht um verbotenen Interrupt-Steuertyp Operationen (das ist ein anderes Thema im Rahmen einer einfachen IC-Lösungen einfach nicht habe, obwohl die Autoren als Lauf argumentieren, dass dieses Problem gelöst durch die Verwendung der MPU machen), und die kontinuierliche Ausführung ohne die Warte eingeben.

    Dieses Problem ist bekannt, kann es auf verschiedene Weise gelöst werden, in dieser Hinsicht gibt es eine umfangreiche Literatur in der Regel eine Reihe von Aufgabenwarteschlangen mit unterschiedlicher Priorität verwendet und einem modifizierten Scheduler. Dies erfordert ein gewiss Kosten für Zugriffszeit O Queuing (1) und zum Beispiel in dem FREE-RTOS bei dem Versuch, mehr als 20 mögliche Stufen eingestellt werden, ob es wird Priorität Programmierer Frage Compiler verwirrt, aber wirklich braucht, dass viel (und auch wenn die Frage gibt es eine positive Antwort, ohne den Quellcode zu modifizieren nicht so viel Priorität erhalten).

    So war ich ein wenig überrascht, dass das oben genannte Betriebssystem eine Reihe von Prioritäten bis 60 (oder sogar mehr) haben kann. Überraschung abgeführt, wenn ich durch den Quellcode gekippt. Anstelle von separaten Warteschlangen mit Tasks mit gleichen Prioritäten verwenden die Autoren eine Warteschlange (es gibt auch die zweite Warteschlange mit blockierten Tasks) von Tasks, die zur Ausführung bereitstehen. Dadurch wird Speicherplatz gespart (wahrscheinlich war dies der Zweck einer solchen Lösung)

    1. Die Aufgabe, die Aufgabe in die Warteschlange zu stellen, wird zu O (n) und
    2. es nutzt eine modifizierte Scheduler unmöglich - in meinem, teuer für 20 * (3 * 4) = 240 Byte RAM. Die Entscheidung ist ungewöhnlich originell, aber aus meiner Sicht ist dies ihre einzige Tugend.

    Im Allgemeinen habe ich nicht verstanden, für die die Autoren des Geld nehmen werden (aber sie haben noch nicht entschieden, ob es zu tun, aus dem Forum zu urteilen), und welche Art von Lösungen und Funktionen machen es möglich, Software-Produkt so klangvolle Namen zu geben. Besonders wenn man bedenkt, wie viel Software kostenlos zahlreicher Anbieter MK zur Verfügung gestellt (natürlich importiert). Wenn ein Forum von Unternehmen in einem Versuch, die Anzeige die Antwort, die ich Referenzen erwähnt Softwareprodukt mcucpp auf die zuvor sah zu finden (MAX Autoren von den Ideen Tschischow angeblich inspiriert - dreimal ha), in der sowohl kleinere Mangel oben beschrieben gefunden.

    Die Schlussfolgerung aus diesem Abschnitt: Wenn andere Lösungen für die Importsubstitution im Softwarebereich auf ähnliche Weise mit ähnlichem Qualitätsergebnis durchgeführt werden, erscheinen mir die Aussichten für den Bau von eingebetteten Haussystemen sehr schlecht.

    Abschließend möchte Ich mag auf das Handbuch beziehen (nein, nicht das Betriebssystem - Entwickler, ich will es nicht einmal neben einem guten Entwickler ganz zu schweigen) Unternehmen, Entwickler und Hersteller des MK - Milandr. Sie machen ziemlich gute Mikrocontroller (ich werde nicht lügen, in Bezug auf Parameter den ausländischen Analoga unterlegen, aber nicht tödlich). Zum Beispiel (2013) befand sich der BE1T fast unter den Klassenkameraden, aber im Jahr 2019 war er auf dem Yard und in dieser Zeit wurde er von vielen Leuten eingeholt und destilliert.

    Aber, wenn die durch einen guten MC nicht vorhanden ist :

    1. normale (besser gut zu sein, aber ich bin realistisch) Dokumentation (Ich weiß, dass du denkst, ich versichere dir, du irrst dich)
    2. kostengünstige Versionen in handlichen Paketen (die Sie haben)
    3. kostengünstige und benutzerfreundliche (kleine) Debugging-Platinen gemäß Abschnitt 2,
    4. eine Reihe von Bibliotheken für die Arbeit mit Peripheriegeräten wie HAL, CMSIS (da ist etwas),
    5. reichlich der Verwendung der IC-Komponente Satz von Beispielen dokumentiert ist,
    6. ein Satz von angepassten und bewährten Stack für Standardschnittstellen,
    7. angepasste und getestete externe Komponenten (3. Teil), einschließlich RTOS,
    8. eine große Anzahl vorgefertigter Beispiele für die Implementierung von Standardgeräten
    9. überprüfte Anpassungspakete für gängige Programmierumgebungen,
    10. meine eigene Entwicklungsumgebung, integriert mit den aufgelisteten Komponenten (ich verstehe, dass ich ertrunken war, aber vielleicht immerhin gleich ..) komplett einsatzbereit "out of the box",
    11. Auf dieser Grundlage basierendes Unterrichtsmaterial, einschließlich gedruckter Materialien und Organisation von Seminaren auf verschiedenen Ebenen (Sie haben natürlich MIET an Ihrer Seite, MIT wäre besser, aber "Ich habe keine anderen Autoren für Sie"), der Anwendungsbereich dieser MK-Daten ist etwas eingeschränkt. ist es nicht (Wout?).

    Natürlich erscheint das alles nicht von selbst und kostet Geld, aber es scheint mir, dass sich das Unternehmen Ihres Niveaus leisten könnte, fünf Mitarbeiter für sechs Monate zu arbeiten, um all das oben genannte zu schaffen (mit Ausnahme des Artikels vielleicht Klausel 10, obwohl jetzt alles von Bedeutung ist) und viele kleine Hersteller MC hat seinen eigenen IDE). Wenn dies umgesetzt wird, wird es den Boden für die Entstehung von Handwerk-artigen Betriebssystemen in diesem Beitrag beschrieben verschwinden.

    Während es kann gut sein , dass ich etwas nicht weiß, und in der Tat ist nicht so einfach, sorry , wenn dies wahr ist.

    wenn meine Kommentare unbillig hart im Voraus Ich entschuldige mich scheinen, ist es Ihnen (Milandr) Ich will nicht beleidigen.

    Jetzt auch beliebt: