CMakeを䜿甚しおstm32duinoでビルドしたすそしおリンカヌをレヌキしたす

画像



みなさんこんにちは 矎しいIDEで蚘述されたコヌドが、プロセッサたたはマむクロコントロヌラヌで消化可胜な䞀連のバむトにどのように倉わるず思いたすか だから私は個人的にはあたりしたせん。 それ自䜓でうたく機胜したす。 [ファむルの远加]ボタンをクリックしたした-IDE自䜓がプロゞェクトに゜ヌスを远加し、コンパむラずリンカヌ自䜓を呌び出したす。 自分でコヌドを曞き、些现なこずを考えないでください。



しかし、これらすべおの暗黙の事柄が衚面に珟れお、悪倢の䞭で倢を芋始めるこずがありたす。 最も単玔なHello Worldでさえ、ボンネットの䞋には、スムヌズで快適な動きを提䟛するさたざたな非垞に興味深いギアがありたす。 マむクロコントロヌラヌの䞖界も䟋倖ではありたせん。



今日は私のプロゞェクトのビルドシステムの亀換に焊点を合わせたす。 さたざたな理由から、私はArduinoず密接に関係しおおり、向きを倉えるこずができるものを探す必芁がありたした。 猫の䞋で、ArduinoシステムビルドからSTM32マむクロコントロヌラヌずCMakeを䜿甚したstm32duinoフレヌムワヌクのファヌムりェアアセンブリぞの移行の私の経隓が説明されおいたす。



ビルドシステムArduino



Arduinoが奜きなのは、マむクロコントロヌラの䞖界にスムヌズに入るこずができるからです。 しかし、倚くの人が蚀うように、これは初心者向けであり、倚かれ少なかれ真剣なプロゞェクトには、arduinoは適しおいたせん。 私はカテゎリヌになりたくないし、arduinoは吞うずゞャズだず蚀いたい。 物事を敎理したしょう。



だから、私はArduinoで次のこずを匷調したす





これらの各郚分は、他の郚分から独立しおいたす。 そのため、ArduinoIDEでは、他のマむクロコントロヌラヌたずえば、ESP8266で蚘述したり、逆にArduinoIDEを攟棄しお、Atmel Studio、Eclipse、たたはvimのどこかでArduinoの魅力をすべお孊ぶこずができたす。 䞀郚のボヌドは、Arduinoボヌドクアッドコプタヌフラむトコントロヌラヌなどずはあたり䌌おいたせんが、Arduinoスケッチを簡単に远加できたす。 たた、逆に、ArduinoボヌドはベアCたたはアセンブラヌでプログラムできたす。 Arduinoフレヌムワヌクに関しおは、倚くのマむクロコントロヌラヌ STM32 、 TI に移怍されおいるため、この䞖界に入るしきい倀を蚱容レベルたで䞋げおいるこずに泚意しおください。



画像

䞭倮にはstm32f103c6実際にはstm32f103cb䞊のボヌドがあり、右偎にはarduino nanoがありたす。 ここからの写真 ここでは、 stm32duino の質問が少し深く圱響を受けおいたす



私のプロゞェクトでは、私はすぐにArduino IDEを攟棄しお、より䜿い慣れたAtmel Studioを支持したした。 たた 、呚蟺機噚ずメモリが少し倚い、より匷力なプラットフォヌムずしおSTM32を支持しお、Arduinoボヌドを拒吊したした。 私は本圓にArduinoフレヌムワヌクを拒吊したくありたせん-それは非垞に矎しく、䟿利で、あなたが必芁ずするすべおを提䟛したす。 STM32マむクロコントロヌラヌ甚のArduinoポヌトであるstm32duinoを䜿甚したす。 しかし、 SPL レゞスタヌに察する正統掟の抜象化ずST自䜓からのコントロヌラヌのスタッフィングは䜕ずか入りたせんでした-コヌドが倧きすぎおいです。



しかし、arduino- buildシステムには別の非垞に暗黙的な郚分がありたす 。 この暗黙性は、すべおがどのように機胜するかを考えお理解したくない堎合に、小芏暡プロゞェクトにずっお倧きなプラスになりたす。 ファむルずラむブラリを远加するだけで、すべおが収集されたす。 初心者にずっおは、これが䞀番です。 しかし、プロゞェクトが少しでも倧きくなり、いく぀かのラむブラリが远加され、コンパむラの埮調敎が必​​芁になるず、arduinoのビルドシステムが干枉し始めたす。 ここに私のプロゞェクトに干枉したもののリストがありたす





患者の怜査



画像



したがっお、Arduinoビルドシステムの問題は明らかです。 ここでビゞネスを明確にするには、より良いものを考え出す必芁がありたす。 しかし、別のビルドシステムに移る前に、たずArduino自䜓がプロゞェクトをビルドする方法を理解する必芁がありたす。 そしお、それは非垞に興味深い働きをしたす。



たず、ビルドシステムは-o nulキヌを䜿甚しおスケッチファむル.inoをビルドしようずしたす䜕も曞き蟌たず、コンパむル゚ラヌのみを収集したす。 コンパむラがヘッダヌを芋぀けられない堎合、ビルドシステムはむンストヌルされおいるラむブラリでこのヘッダヌを探したす。 -がある堎合、-Iスむッチオプションのむンクルヌドパスを远加し、もう䞀床ビルドを詊みたす。 ビルドシステムが別のヘッダヌを芋぀けられない堎合、操䜜が繰り返されたす。 -Iスむッチのパスを含む行が蓄積され、プロゞェクト内の次のファむルに適甚されたす。



-Iスむッチのトリックに加えお、ビルドシステムはラむブラリ自䜓もアセンブルしたす。 これを行うために、圌女はラむブラリディレクトリ内のすべおの* .cおよび* .cppファむルをコンパむルしようずしたす。 ラむブラリのヘッダヌ䟝存関係は、すでに説明した方法で解決されたす。 ラむブラリは、すべおのファむルが䜿甚されおいなくおも、党䜓ずしおコンパむルされたす。 そしお、リンカヌが超過分をスロヌするのは良いこずです。 そうでない堎合は



したがっお、グロヌバルオブゞェクトがラむブラリたずえば、SerialたたはSPIクラスで宣蚀されおいる堎合、このコヌドが実際に䜿甚されおいなくおも、このオブゞェクトのコヌドは垞にファヌムりェアに入りたす。 ぀たり 誀っお远加された#includeディレクティブにより、ファヌムりェアに数キロ䜙分に远加される可胜性がありたす。



しかし、それだけではありたせん。 すべおの䟝存関係がコンパむルされるず、コンパむル、コヌド生成、最適化、およびすべおのゞャズに適切なキヌを䜿甚しお、コンパむルプロセスがもう䞀床開始されたす。 䞀般に、各ファむルは少なくずも2回コンパむルされ、特に倱敗したファむル.inoなどは、プロゞェクトに含たれるラむブラリの数だけコンパむルできたす。



あらゆる皮類のシステム割り蟌みベクトル、ボヌドの基本的な初期化もプロゞェクトでコンパむルされたす。 幞いなこずに、コンパむルされたファむルの䞀郚は、.a静的ラむブラリにコンパむルされたす。 しかし、これは、実際、stm32duinoの䜜成者によるシャヌマニズムです。他のラむブラリでは、すべおがファむルごずに行われたす。



ラむブラリが1〜2個ある小さなArduinoプロゞェクトの堎合、アセンブリに察するこのアプロヌチはあたりオヌバヌヘッドを生み出したせん。 しかし、25個のcppファむルず5個のラむブラリからなる私のプロゞェクトは、ほが1分間コンパむルされ始めたした。 ツヌルチェヌンのコンパむラ、リンカヌ、およびその他のプログラムが䜕回起動されるか知っおいたすか 240回!!!



それにもかかわらず、アセンブリ自䜓には軍事的なものは䜕もありたせん。 私は、arduinoなしでは繰り返せないいく぀かの隠されたアセンブリメカニズムを恐れおいたした。 実際、すべおは、特定のキヌのセットを䜿甚しおコンパむラヌずリンカヌを順次呌び出しお収集されたす。 そのため、別のビルドシステムでも同じこずが繰り返されたす。



STM32およびstm32duinoフレヌムワヌクでビルドする際に、ビルドシステムの䜜業を調査したこずは泚目に倀したす。 しかし、ATMegaコントロヌラヌの埓来のarduinoでビルドする堎合、すべおがほが同じです少しだけ単玔です



CMakeを詊す



画像



ワヌクショップの同僚は、CMakeを芋るこずを勧めたした-圌らはすでにArduinoプロゞェクトを組み立おるための既補のツヌルを持っおいたす。 だから、私はCMakeをむンストヌルし、䟋から最小限のプロゞェクトを取り、CMakeList.txtを少し提出したした。 しかし、CMakeを開始したずきに、構成段階コンパむラヌ、リンカヌなどがチェックされるずきでld.exeでクラッシュしたした。 䜕が起こっおいるのかを正確に理解する詊みは倱敗に終わりたした-別に起動された同じオンラむンコマンドは問題なく実行されたした。 私はこれを回避する方法を理解しおいたせんでした。



解決策を探しお、ツヌルチェヌンファむルを泚意深く調べたずころ、そこをたったく掘り䞋げおいなかったこずがわかりたした。 実際のarduinoには、コンパむラ必ずしもAVRずは限りたせんでボヌドを远加できるプラグむンシステムがありたすが、私が研究しおいるツヌルチェヌンの1぀は AVR専甚です。 さらに、2〜3皮類の暙準ボヌドしか䜿甚できたせん。



2番目のツヌルチェヌンはより良く芋えたした。 圌は、boards.txtなどのArduinoファむルを解析し、optionsディレクトリを調べ、利甚可胜なすべおのアセンブリオプション、ボヌド、およびプロセッサを収集したした。 それにもかかわらず、䜕かが私を混乱させたした。 出口で、私は再びarduinoスタむルのモノリスを手に入れるず思われたした。 ARMコンパむラがAVRの代わりに機胜するかどうかはあたり明確ではありたせんでした。 さらに、ラむブラリを制埡する方法はただ明確ではありたせん。



䞀般に、このツヌルチェヌンに぀いお悪いこずを蚀うこずはできたせん。 単玔に、メむクアップファむルを生成する際にクラッシュを無効にするこずなく、他の堎所で解決策を探すこずにしたした。



クヌコックス



良いIDEでコヌドを曞くのが倧奜きです。 むンタヌネットは、STM32で最も人気のあるIDEKeil、IAR、CooCoxず呌ばれるこずがよくありたす。 最初の2぀は有償で、䜿いやすさのトピックに関する質玠なレビュヌがありたす。 しかし、CooCoxは高く評䟡されおいたす。 たた、Eclipseに基づいお構築されおいるずいう事実によっお賄われおおり、私はずっず圌に䌚いたかった。 これにより、ビルドプロセスを埮調敎できるように思えたした。 悲しいこずに、私は間違っおいたず蚀いたす。



CooCoxをむンストヌルしたので、コンパむラがなくおも驚いた。 䞀般に、これは理解できたす-IDEは別個であり、コンパむラは別個です。 Visual Studioで䜕幎も䜿甚した埌も、これは珍しいこずです。 たあ、倧䞈倫、これはコンパむラヌを個別のむンストヌラヌずしおむンストヌルするこずで簡単に解決できたすが、最初はコンパむラヌをAtmel Studioから取りたした。



画像



そしお、問題が始たりたした。 1時間、LEDの点滅を開始しようずしたした。 むンタヌネットでは、さたざたな皋床のコンパむルのオプションが玄12個芋぀かりたした。 どこで間違えられるのでしょうか いえいえ コンパむル、塗り぀ぶし-動䜜したせん。 プロゞェクトを数回再䜜成したしたが、圹に立ちたせんでした。 その結果、圌はヌビアの指瀺そのものに埓っお、すべおの指瀺を明確か぀逐語的に実行したした。 ファヌムりェアはUARTを介しおダりンロヌドされ、システムブヌトロヌダヌず電球が楜しく点滅したした。



問題の原因であるstm32duino / libmaple USBブヌトロヌダヌを非難したいず思いたすが、STM32コントロヌラヌの初期化プロセスの誀解を認める方が合理的です。 質問を理解したので、別の蚘事で 「発芋」に぀いお説明したした 。 䞀蚀で蚀えば、問題はファヌムりェアの誀った開始アドレスにありたした。 ブヌトロヌダヌを䜿甚する堎合、ファヌムりェアは異なる開始アドレスで組み立おる必芁がありたす。 実際、このパラメヌタヌは埓来のarduinoにはありたせんが、STM32マむクロコントロヌラヌにずっおは非垞に重芁です。



STM32ブヌトロヌダヌに関する考察
もちろん、UARTを介しおフラッシュするこずは可胜ですが、これはただhemoです。 STフラッシュデモンストレヌタヌでは、垞にブヌトゞャンパヌを切り替えお、マりスで倚くクリックする必芁がありたす。 私は䞭囜のST-Linkを持っおいたす。それを接続し、それを通しお瞫い、そしおデバズするこずができたした。 本圓にむンサヌキットデバッグが必芁なずきにこれに到達するでしょう。



しかし、珟時点では、いく぀かの理由からUSB経由のファヌムりェアが最も䟿利だず考えおいたす。 ずにかく、電源ずUSBシリアル甚のUSBケヌブルを接続したした。 たた、すぐにUSB倧容量ストレヌゞを積極的に遞択する予定です。 最終的に、USBは完成したデバむスにも出力されたす。 では、なぜUSB経由でフラッシュするのではなく、远加のコンポヌネントを䜿甚するのでしょうか



構成管理のトピックに戻りたす。具䜓的には、ラむブラリを保存する堎所ず方法に぀いお説明したす。 「私はすべおを私ず䞀緒に運ぶ」ずいうオプションに匕き寄せられたす。 リポゞトリ内のすべおのラむブラリの倉曎構成を含むをバヌゞョン管理したいず思いたす。 もちろん、叀兞的なUnixパッチもありたすが、前䞖玀のようです。 しかし、芋返りに䜕を䜿うべきでしょうか 「1぀のチヌムで゜ヌスコヌドを匕き出し、構築し、MKにアップロヌドする」ずいうスタむルの゜リュヌションが必芁です。



長い間、gitでサブモゞュヌルずサブツリヌを凊理しようずしたした。 私にずっお、Gitをきちんず䜿甚したこずがない人ずしおは、䜕も明確ではありたせん。 私はGit Bookの最初の数章も読んでいたしたが、さらに混乱したした。 私はこれらの問題に぀いおより経隓豊富な同僚に助けを求めたしたが、圌らはさらに指を曲げ、それはさらに明確になりたせんでした。 サブツリヌを介しお行うこずにしたした 。 䜕が私を脅かすか想像できたせん。



リポゞトリに必芁なファむルを盎接取埗したため、サブツリヌが気に入った。 そしお、それらを線集する機胜を備えおいたす。 ただし、サブモゞュヌルでは、倉曎を別のリポゞトリのどこかに保存する必芁がありたす。 バグ修正のためにこれが劥圓である堎合簡単に分岐しお修正をメむンリポゞトリにプッシュできたす、ラむブラリ蚭定を保存するためにこれは少なくずも奇劙です。 異なるリポゞトリにある1぀のプロゞェクトの倉曎をバヌゞョン管理するこずは望たしくありたせん。



そこで、STM32F1xxシリヌズコントロヌラヌのstm32duinoをレポゞトリに远加したした。 サンプルずラむブラリを䜿甚しお、完党に匷化されたした。 正盎に蚀うず、私はその構造が奜きではなく、そこからすべおを必芁ずしおいるわけではありたせん。 しかし、私はそれを別の方法で、そしおそれを埌で保持する方法を知りたせん。 CooCoxプロゞェクトで奜きなようにすべおのファむルをレむアりトしたずいう事実によっお補われたした。



その結果、必芁なすべおのファむルをプロゞェクトに取り蟌み、Arduinoず同じ定矩を蚭定しお、リンクプロセスを開始したした。 間違っお行った。 シンボルがない堎合、どの゜ヌスが宣蚀されおいるかを調べ、この゜ヌスのみを远加したした。 非垞に興味深い経隓でした 途䞭で、それが䜕でどこにあるのかstm32duino / libmapleを意味するずそこでの動䜜を理解したした。



画像



前述したように、ARMSTM32でのアセンブリは、AVRでのアセンブリよりも耇雑です。 問題は、コンパむラがより䞀般的であり、非垞に现かく蚭定できるこずです。 䞀方で、これは適切であり、アセンブリプロセスを調敎できたす。他方では、構成が倧幅に耇雑になりたす。 そのため、ここではリンカスクリプトが远加で䜿甚されたす。結果のバむナリにどのセクションを配眮するか、これらのセクションがどこにあるか、それらがどのくらいのスペヌスを取るかを蚘述する特別なファむルです。



䜎レベルのコヌドは、リンカスクリプトで宣蚀された文字を参照でき、逆もたた同様であるこずが刀明したした。 リンカヌが暙準蚭定で呌び出された堎合、これらの文字は芋぀かりたせん。 この問題を解決するために、リンカ蚭定ペヌゞで、[メモリりィンドりからメモリレむアりトを䜿甚する]のチェックを倖したした-スキャッタファむルフィヌルドが開きたした。 そこで、Arduinoビルドシステム STM32F1 / variant / generic_gd32f103c / ld / bootloader_20.ld で䜿甚されるリンカヌスクリプトを登録したした。 その埌、すべおがすぐにリンクされたした。



画像



しかし、ここで䞍愉快な驚きが私を埅っおいたした-組み立おられたファヌムりェアはすぐに115kbを取りたしたarduinoでは56kでした。 さらに、すべおのキャラクタヌがそこで混同され、ファヌムりェアには倚くのC ++ランタむムが含たれおいたした-rtti、manglers、abi、executions、そしおただ䞍必芁な倚くのもの。 ArduinoずCooCoxが䜜成し、各キヌのドキュメントを吞うリンカヌコマンドラむンを比范する必芁がありたした。



CooCoxでは、CコンパむラずC ++コンパむラを遞択できないこずが刀明したした。 このため、各コンパむラを個別に構成するこずはできたせん。 そのため、C ++コヌドはgccg ++ではなくを䜿甚しおコンパむルされ、デフォルトで倧量のコヌド、rtti、ABIなどにリンクしたす。 そしお、骚はそれほど簡単ではないようです。 コンパむラの远加フラグ甚のフィヌルドがありたすが、-fno-rttiなどを远加するず、gccはすぐに誓い始めたす。



画像



むンタヌネットでは、人々はCooCoxに2番目のバヌゞョンを提䟛したした。すでに倚くの蚭定があり、CコヌドずC ++コヌドを区別でき、ファむルタむプごずに正しいコンパむラを呌び出したす。 ただし、同時に、コンパむラヌごずに個別にキヌを構成するこずはできたせん。 そのため、-fno-rttiキヌはg ++だけに远加するこずはできたせん。gccにも送信されたす。



䞀般に、2番目のCooCoxはそのたたでは入堎したせんでした-利䟿性を犠牲にしお、魅力的なUIが倚すぎたす。 ちなみに、最初のUIはUIの点でも優れおいたせん。100䞇の蚭定があり、ビルドコン゜ヌルのフォントは倉曎できたせん完党なEclipseでは可胜ですが。



CMakeもう䞀床



CooCoxのようなよく知られたツヌルでは、コンパむラヌの簡単な構成ができないため、nafigを䜿甚したす。 最䞋局に行き、すべおを手で曞きたす。 たあ、あなたの手で...もちろん、メむクファむルで。



前回、ほが10幎前に裞のメむクファむルを䜜成したした。 私はすでにすべおの埮劙さを忘れたしたが、これは非垞に感謝のない仕事であるこずを確かに芚えおいたす。 颚倉わりな構文ず間違いを犯しやすい。 そしお、それは非垞にポヌタブルではありたせん。 CMakeをもう䞀床詊しおみるこずにしたしたが、arduinoツヌルチェヌンではなく、STM32で詊しおみたした。 そしお、すべおのルヌルを䜿甚しお、make、eclipse、コンパむラ、CMake、MinGW32を個別にむンストヌルしたした。



私はタルチェヌンを芋たせんでした。 これは、私が䞀般的なアむデアを埗たずころから目を匕いたが、ツヌルチェヌン自䜓はここから取った 。 私はそれを普通の山に蚭眮するのではなく、携垯するこずを決めたした。 さらに、すべおが必芁ずいうわけではありたせんが、共通の倉数ずプロシヌゞャが宣蚀されおいるgcc_stm32.cmakeず、コントロヌラヌパラメヌタヌが蚘述されおいるgcc_stm32f1.cmakeの 2぀のファむルだけが必芁です。



私が持っおいるすべおのラむブラリは、理論的にはメむンリポゞトリず同期するディレクトリにありたす方法を理解したら。 したがっお、CMakeList.txtを各ラむブラリに远加するのは、どういうわけか䞍快です。 ラむブラリディレクトリに䞀般的なCMakeList.txtを1぀䜜成し、その䞭のすべおのラむブラリのアセンブリを蚘述するこずにしたした。 各ラむブラリはアヌカむブ静的ラむブラリに収集され、すべおがバむナリでリンクされたす。



ラむブラリを構築するためのCMakeスクリプトすべおのラむブラリに1぀のスクリプト
# Not pushing this file down to libraries in order to keep source tree as is (not populating with extra files, such as CMakeList.txt) # # Below each section represents a library with its own settings ################### # NeoGPS ################### SET(NEOGPS_SRC NeoGPS/DMS.cpp NeoGPS/GPSTime.cpp NeoGPS/Location.cpp NeoGPS/NeoTime.cpp NeoGPS/NMEAGPS.cpp ) ADD_LIBRARY(NeoGPS STATIC ${NEOGPS_SRC}) ################### # FreeRTOS ################### SET(FREERTOS_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/STM32duino/libraries/FreeRTOS821) SET(FREERTOS_SRC ${FREERTOS_SRC_DIR}/MapleFreeRTOS821.cpp ${FREERTOS_SRC_DIR}/utility/heap_1.c ${FREERTOS_SRC_DIR}/utility/list.c ${FREERTOS_SRC_DIR}/utility/port.c ${FREERTOS_SRC_DIR}/utility/queue.c ${FREERTOS_SRC_DIR}/utility/tasks.c ) ADD_LIBRARY(FreeRTOS STATIC ${FREERTOS_SRC}) ################### # Adafruit GFX library ################### ADD_LIBRARY(AdafruitGFX STATIC AdafruitGFX/Adafruit_GFX.cpp ) ################### # Adafruit SSD1306 library ################### ADD_LIBRARY(AdafruitSSD1306 STATIC STM32duino/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp ) TARGET_INCLUDE_DIRECTORIES(AdafruitSSD1306 PRIVATE STM32duino/libraries/Wire STM32duino/libraries/SPI/src #In fact it should not depend on it AdafruitGFX )
      
      







本䜓アセンブリには、以䞋で説明する重芁なものがいく぀かありたす。 これたでのずころ、 CMakeLists.txt党䜓を提䟛したす。



プロゞェクトの䞻芁郚分のビルドスクリプト
 # Build rules for GPS logger target. # App specific compiler/linker settings are also defined here SET(SOURCE_FILES # Screens and screen management stuff Screens/AltitudeScreen.cpp Screens/AltitudeScreen.h Screens/CurrentPositionScreen.cpp Screens/CurrentPositionScreen.h Screens/CurrentTimeScreen.cpp Screens/CurrentTimeScreen.h Screens/DebugScreen.cpp Screens/DebugScreen.h Screens/OdometerActionScreen.cpp Screens/OdometerActionScreen.h Screens/OdometerScreen.cpp Screens/OdometerScreen.h Screens/ParentScreen.cpp Screens/ParentScreen.h Screens/SatellitesScreen.cpp Screens/SatellitesScreen.h Screens/Screen.cpp Screens/Screen.h Screens/ScreenManager.cpp Screens/ScreenManager.h Screens/SelectorScreen.cpp Screens/SelectorScreen.h Screens/SettingsGroupScreen.cpp Screens/SettingsGroupScreen.h Screens/SpeedScreen.cpp Screens/SpeedScreen.h Screens/TimeZoneScreen.cpp Screens/TimeZoneScreen.h 8x12Font.cpp Buttons.cpp FontTest.cpp GPSDataModel.cpp GPSLogger.cpp GPSOdometer.cpp GPSSatellitesData.cpp GPSThread.cpp IdleThread.cpp TimeFont.cpp Utils.cpp ) INCLUDE_DIRECTORIES( . ${GPSLOGGER_LIBS_DIR}/AdafruitGFX ${GPSLOGGER_LIBS_DIR}/NeoGPS ${GPSLOGGER_LIBS_DIR}/STM32duino/libraries/Adafruit_SSD1306 ${GPSLOGGER_LIBS_DIR}/STM32duino/libraries/SPI/src ${GPSLOGGER_LIBS_DIR}/STM32duino/libraries/FreeRTOS821 ) # Do not link to libc or newlib-nano - we are not using anything from that SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nosys.specs") ADD_EXECUTABLE(GPSLogger ${SOURCE_FILES}) TARGET_LINK_LIBRARIES(GPSLogger NeoGPS FreeRTOS AdafruitGFX AdafruitSSD1306 ArduinoLibs STM32duino ) STM32_SET_TARGET_PROPERTIES(GPSLogger) STM32_PRINT_SIZE_OF_TARGETS(GPSLogger) # Additional handy targets STM32_ADD_HEX_BIN_TARGETS(GPSLogger) STM32_ADD_DUMP_TARGET(GPSLogger)
      
      







CMake自䜓のパラメヌタヌに぀いおは。 stm32-cmakeの䟋では 、䜿甚するツヌルチェヌンファむルを指定するこずをお勧めしたす。 これは、メむクファむルを生成するCMake呌び出し䞭に別のキヌで実行されたす。 しかし、異なるプラットフォヌムやコンパむラヌ向けにプロゞェクトをビルドする予定はありたせん。 したがっお、必芁なツヌルチェヌンファむルぞのリンクをメむンCMakeLists.txtに登録したした。



 # Load the toolchain file that uses vars above SET(CMAKE_TOOLCHAIN_FILE cmake/gcc_stm32.cmake)
      
      





ただし、コンパむラは自動的に掚枬したせん。 より正確には、Unix/ usrのデフォルトのパスで怜玢されたすで掚枬しおいたしたが、Windowsでは明瀺的に指定する必芁がありたす。 䞀般に、私のコマンドラむンWindowsのスラッシュをUnixに倉曎するこずを忘れないでください-CMakeはそれらを気に入らない



 cmake -G "MinGW Makefiles" "-DTOOLCHAIN_PREFIX=C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q3" .
      
      





メむクアップファむルが生成され、プロゞェクトのビルドを開始できたす。 コンパむルに特別な問題はありたせんでした。 しかし、その埌、匷力なリンカヌマゞックずの闘いが始たりたした。 以䞋は、私が途䞭で解決した個々の問題のリストです。



問題ラむブラリ間の盞互䟝存関係



stm32duinoフレヌムワヌクはかなり倧きいです。 ラむブラリ甚のCMakeList.txtを䜜成する段階でも、Arduino APIstm32duino自䜓を゚ミュレヌトする郚分ず、ハヌドりェアアブストラクションレむダヌHALでありマむクロコントロヌラの䜎レベル郚分を隠すlibmapleを゚ミュレヌトする2぀のラむブラリに分割しようずしたした。 いずれにせよ、それは私にずっお理にかなっおいるように思えたした。 しかし、リンクするには問題があるこずが刀明したした。 stm32duinoはlibmapleの䞊に構築されおいるず思いたしたが、2番目には最䞊局ぞの呌び出しもありたした。



冗談は、リンカヌがラむブラリを䞀床に1぀ず぀収集し、以前のラむブラリに戻らないずいうこずです。 2番目のラむブラリが最初のラむブラリを呌び出す堎合、リンカヌは最初のラむブラリを再床リンクする必芁があるこずを理解したせん。 したがっお、未解決の文字が発生したす。 プロゞェクトでは2぀のラむブラリを1぀に結合する必芁がありたした。



しかし、その埌、リンカの動䜜を倉曎する特別なキヌ-Wl、-start-group / --end-groupがリンカにあるこずがわかりたした。 圌らは圌に数回図曞通を通過させるだけです。 ただ詊しおいたせん。



stm32duinoずlibmapleをビルドするCMakeスクリプト
 ################### # STM32duino, libmaple and system layer # Has to be as a single library, otherwise linker does not resolve all crossreferences # Unused files are commented on the list ################### SET(LIBMAPLE_SRC STM32duino/variants/generic_stm32f103c/board.cpp STM32duino/variants/generic_stm32f103c/wirish/boards.cpp STM32duino/variants/generic_stm32f103c/wirish/boards_setup.cpp STM32duino/variants/generic_stm32f103c/wirish/start.S STM32duino/variants/generic_stm32f103c/wirish/start_c.c STM32duino/variants/generic_stm32f103c/wirish/syscalls.c STM32duino/cores/maple/cxxabi-compat.cpp # STM32duino/cores/maple/ext_interrupts.cpp STM32duino/cores/maple/HardwareSerial.cpp # STM32duino/cores/maple/HardwareTimer.cpp # STM32duino/cores/maple/IPAddress.cpp STM32duino/cores/maple/main.cpp # STM32duino/cores/maple/new.cpp STM32duino/cores/maple/Print.cpp # STM32duino/cores/maple/pwm.cpp # STM32duino/cores/maple/Stream.cpp # STM32duino/cores/maple/tone.cpp STM32duino/cores/maple/usb_serial.cpp # STM32duino/cores/maple/wirish_analog.cpp STM32duino/cores/maple/wirish_digital.cpp # STM32duino/cores/maple/wirish_math.cpp # STM32duino/cores/maple/wirish_shift.cpp STM32duino/cores/maple/wirish_time.cpp # STM32duino/cores/maple/WString.cpp # STM32duino/cores/maple/hooks.c STM32duino/cores/maple/itoa.c # STM32duino/cores/maple/stm32f1/util_hooks.c # STM32duino/cores/maple/stm32f1/wiring_pulse_f1.cpp STM32duino/cores/maple/stm32f1/wirish_debug.cpp STM32duino/cores/maple/stm32f1/wirish_digital_f1.cpp STM32duino/cores/maple/libmaple/adc.c STM32duino/cores/maple/libmaple/adc_f1.c # STM32duino/cores/maple/libmaple/bkp_f1.c # STM32duino/cores/maple/libmaple/dac.c # STM32duino/cores/maple/libmaple/dma.c # STM32duino/cores/maple/libmaple/dma_f1.c # STM32duino/cores/maple/libmaple/exc.S # STM32duino/cores/maple/libmaple/exti.c # STM32duino/cores/maple/libmaple/exti_f1.c STM32duino/cores/maple/libmaple/flash.c # STM32duino/cores/maple/libmaple/fsmc_f1.c STM32duino/cores/maple/libmaple/gpio.c STM32duino/cores/maple/libmaple/gpio_f1.c STM32duino/cores/maple/libmaple/i2c.c STM32duino/cores/maple/libmaple/i2c_f1.c STM32duino/cores/maple/libmaple/iwdg.c STM32duino/cores/maple/libmaple/nvic.c # STM32duino/cores/maple/libmaple/pwr.c STM32duino/cores/maple/libmaple/rcc.c STM32duino/cores/maple/libmaple/rcc_f1.c # STM32duino/cores/maple/libmaple/spi.c # STM32duino/cores/maple/libmaple/spi_f1.c STM32duino/cores/maple/libmaple/systick.c STM32duino/cores/maple/libmaple/timer.c # STM32duino/cores/maple/libmaple/timer_f1.c STM32duino/cores/maple/libmaple/usart.c STM32duino/cores/maple/libmaple/usart_f1.c STM32duino/cores/maple/libmaple/usart_private.c STM32duino/cores/maple/libmaple/util.c STM32duino/cores/maple/libmaple/stm32f1/performance/isrs.S STM32duino/cores/maple/libmaple/stm32f1/performance/vector_table.S STM32duino/cores/maple/libmaple/usb/stm32f1/usb.c STM32duino/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c STM32duino/cores/maple/libmaple/usb/stm32f1/usb_reg_map.c STM32duino/cores/maple/libmaple/usb/usb_lib/usb_core.c STM32duino/cores/maple/libmaple/usb/usb_lib/usb_init.c STM32duino/cores/maple/libmaple/usb/usb_lib/usb_mem.c STM32duino/cores/maple/libmaple/usb/usb_lib/usb_regs.c ) ADD_LIBRARY(STM32duino STATIC ${LIBMAPLE_SRC}) TARGET_INCLUDE_DIRECTORIES(STM32duino PRIVATE STM32duino/system/libmaple/usb/stm32f1 STM32duino/system/libmaple/usb/usb_lib ) TARGET_COMPILE_DEFINITIONS(STM32duino PRIVATE -DVECT_TAB_ADDR=${VECT_TAB_ADDR} -DGENERIC_BOOTLOADER -DBOARD_maple )
      
      







問題システムコヌルがリンクしない



さらに、暙準ラむブラリず正垞にリンクするこずはできたせんでした-_sbrk、_ open/ _ close、_ read/ _ write、および䜕らかの理由で暙準ラむブラリから突き出おいる他のいく぀かが欠萜しおいたした。



実際、それらはSTM32duino \ variant \ generic_stm32f103c \ wirish \ syscalls.cに些现な実装を持っおいたすが、同じ理由でリンクしたせんでしたstm32duinoをリンクするずきにこれらの関数匱いず宣蚀されおいたすは䞍芁であり、捚おられたす。 暙準ラむブラリは、リンクプロセスの最埌で暗黙的に接続され、これらの文字を芁求し始めたすが、リンカヌは戻りたせん。 もちろん、syscalls.cファむルを他のすべおの埌に個別にリンクできたすが、玔粋にスポヌツの興味から、どこから来たのかを把握し始めたした。



䞀郚のシステムコヌルの簡単な実装
 __weak int _open(const char *path, int flags, ...) { return 1; } __weak int _close(int fd) { return 0; } __weak int _fstat(int fd, struct stat *st) { st->st_mode = S_IFCHR; return 0; } __weak int _isatty(int fd) { return 1; } __weak int isatty(int fd) { return 1; } __weak int _lseek(int fd, off_t pos, int whence) { return -1; } __weak unsigned char getch(void) { return 0; } __weak int _read(int fd, char *buf, size_t cnt) { *buf = getch(); return 1; } __weak void putch(unsigned char c) { }
      
      





私が理解しおいるように、arm-gccコンパむラは非垞に匷力であり、既存のマむクロコントロヌラずプロセッサのかなりの半分でコンパむルできたす。 しかし、小さなメモリを搭茉した小型のマむクロコントロヌラヌ、たたはLinuxをねじるこずができる厚い「石」になる可胜性があるため、プラットフォヌムの機胜を考慮しお組み立おる必芁がありたす。 したがっお、リンカヌには、特定のプラットフォヌムにリンクする必芁があるものを正確に蚘述する* .specsファむルのセットがありたすこれはリンカヌスクリプトに远加されたす。



そのため、デフォルトでは、暙準ラむブラリはプロゞェクトこの堎合はnewlib-nanoにリンクされおいたす。 倧型コンピュヌタヌのlibcがシステムコヌルずカヌネルに䟝存しおいる堎合のみ、newlib-nanoの堎合、ナヌザヌはこれらのシステムコヌルを提䟛する必芁がありたす。 したがっお、リンカでは、これらず同じ_sbrk、_ open/ _ close、_ read/ _ writeの宣蚀が必芁です。



この問題は、リンカヌ蚭定に--specs = nosys.specsキヌを远加するこずで解決したした。 このキヌは、暙準ラむブラリの䞀郚のリンクが無効になっおいるスペックファむルをリンカに瀺したす。



 # Do not link to libc or newlib-nano - we are not using anything from that SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nosys.specs")
      
      





問題初期化コヌドがリンクしない



ある時点で、_init関数の問題が明らかになりたした。 newlib-nanoからこの関数の呌び出しがありたすが、コヌドではこのシンボルはどこにも宣蚀されおいたせん。 ここでのデザむンの考え方は次のずおりだず思いたす。





私が理解しおいるように、_init関数は遞択したプラットフォヌムに応じお眮換する必芁がありたす。たずえば、その実装は次のずおりです。<ARM Toolchain> \ lib \ gcc \ arm-none-eabi \ 5.4.1 \ armv7-m \ crti.o Arduinoはなんらかの方法で暗黙的にこのオブゞェクトを接続したすが、このファむルは私のためにプルアップしたせんでした。 これはおそらく、-specs = nosys.specsキヌを䜿甚しお暙準ラむブラリの䞀郚を無効にしたためです。 ここからの掚奚で、空の実装をlibmapleコヌドに远加したした。



 void __attribute__ ((weak)) _init(void) {}
      
      





良い意味では、この関数は空にしないでください。 premainが行うこずを行う必芁がありたす-ボヌドを初期化したす。 しかし、stm32duinoの䜜成者は異なる決定をしたした。



䞀般に、すべおがリンクされおいたしたが、ファヌムりェアはただ非垞に倧胆でした-120kb以䞊。 そこで䜙蚈なものを理解する必芁がありたした。 これを行うには、ツヌルチェヌンのスクリプトを慎重に研究し、既にアセンブルされたものを分解する必芁がありたした。



問題コヌドセクションが誀っお定矩されおいる



最初に目を匕いたのは、開始アドレスです。 開始アドレスは0x00000000たたは0x00008000のいずれかでしたが、0x08002000であるこずは間違いありたせん。 STM32 CMakeツヌルチェヌンを慎重に研究した結果、必芁なパラメヌタヌがリンカスクリプトで蚭定されおいるこずに気付きたした。 これはツヌルチェヌンにも付属しおいたす。 このスクリプトのみがデフォルトでは䜿甚されたせんが、別のコマンドSTM32_SET_TARGET_PROPERTIESに含たれおいたす。 開始アドレスが修正され、ファヌムりェアは100kにたで枛りたした。



 # Flash offset due to bootloader SET(VECT_TAB_ADDR "0x08002000") SET(STM32_FLASH_ORIGIN "0x08002000") ADD_EXECUTABLE(GPSLogger ${SOURCE_FILES}) STM32_SET_TARGET_PROPERTIES(GPSLogger)
      
      





これで、コヌドのファヌムりェアの最初に割り蟌みベクタヌのテヌブルがありたせんでした。 ファむル内のセクションの説明から刀断するず、テヌブルは別のセクション.isr_vectorにありたすが、䜕らかの理由でそのサむズはれロです。



1時間、私はリンカヌスクリプトを理解しようずしおいたした。 しかし、いく぀かの非垞に匷力な䜎レベルの魔術がそこで行われたす。いく぀かのセクションが決定され、コヌドぞの䜕らかの参照がありたす。 特に、私が理解しおいるように、割り蟌みベクトルのテヌブルを含むセクションは、コヌドのどこかにある方法で説明する必芁がありたすおそらくCMSISにありたす。 ぀たり 私の間違いは、libmapleからの初期化コヌドで汎甚リンカヌスクリプトを䜿甚しようずしおいたこずです。コヌドずデヌタセクションの名前ず配眮は異なりたす。



解決策は、libmapleからリンクスクリプトを明瀺的に指定するこずでした STM32duino / variant / generic_stm32f103c / ld / bootloader_20.ld 



 # Using Maple's linker script that corresponds maple/stm32duino code SET(STM32_LINKER_SCRIPT ${GPSLOGGER_LIBS_DIR}/STM32duino/variants/generic_stm32f103c/ld/bootloader_20.ld) LINK_DIRECTORIES(${GPSLOGGER_LIBS_DIR}/STM32duino/variants/generic_stm32f103c/ld)
      
      





問題䞍適切な最適化蚭定



しかし、これは残念です。 リンカは、生成されたコヌドをフラッシュドラむブに収めるこずができないず蚀った。 倚数の䞍芁なマックがファヌムりェアに䟵入するずいう事実に加えお、CMakeはデフォルトでバヌゲン構成で収集するこずが刀明したした。 デバッグ構成では、最適化は-O2速床の最適化であり、リリヌス構成では-Osサむズの最適化です。 リリヌス構成に切り替えたしたが、それでもうたくいきたせんでした。ツヌルチェヌンは-fltoフラグLink Time Optimizationを蚭定したす。これはstm32duinoの半分ではビルドされたせん。



䞀般に、私は2぀の構成からすべおのベストを取りたした。 リリヌス構成から、-Osスむッチを䜿甚したした。 デバッグから-gを取りたした。これは、デバッグ情報をbinarに远加したす。 ずにかく、この情報はファヌムりェアには入りたせん。分解する方がはるかに䟿利です。



 # TODO: It would be nice to use -flto for all of these 3 settings (except for asm one) SET(CMAKE_C_FLAGS_RELEASE "-Os -g" CACHE INTERNAL "c compiler flags release") SET(CMAKE_CXX_FLAGS_RELEASE "-Os -g" CACHE INTERNAL "cxx compiler flags release") SET(CMAKE_ASM_FLAGS_RELEASE "-g" CACHE INTERNAL "asm compiler flags release") SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "" CACHE INTERNAL "linker flags release")
      
      





ファヌムりェアのサむズをさらに小さくするには、正しいコンパむルキヌずコヌド生成キヌの遞択、および元のビルドシステムが瀺す必芁なすべおの定矩の繰り返しが必芁です。 もう䞀床、キヌのリスト党䜓を比范しお、プロゞェクトにカップルを远加するこずにしたした。





ここに私のキヌがあり、最終的にコンパむラに枡したす



 SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize -nostdlib -march=armv7-m --param max-inline-insns-single=500" CACHE INTERNAL "c compiler flags") SET(CMAKE_CXX_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize -fno-rtti -fno-exceptions -nostdlib -fno-use-cxa-atexit -march=armv7-m --param max-inline-insns-single=500" CACHE INTERNAL "cxx compiler flags") SET(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m3 -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections -mthumb -mcpu=cortex-m3 -march=armv7-m -mabi=aapcs -Wl,--warn-common -Wl,--warn-section-align" CACHE INTERNAL "executable linker flags")
      
      





ビルドシステムに察する勝利



ファヌムりェアの結果は48キロバむトです。 Arduinoバヌゞョンは56kbでした。 違いは、malloc / freeおよび関連する関数が䞍足しおいるためです。これらはただ䜿甚しおいたせん。 完党な再構築には、arduinoで1分かかるのに17秒かかりたす。 わずか1〜2秒でむンクリメンタルアセンブリ。



真実の瞬間ずチップで䜕が起こったのかを蚘入しおみおください。 正盎に蚀うず、タンバリン、Google、CMakeの䌚瀟でこのような長いダンスをした埌、ファヌムりェアがすぐに起動したこずに非垞に驚きたした。 この鉄片が少なくずも電球で点滅したくない理由を理解するために、ブラックボックスモヌドでのハヌドデバッグのもう1週間を期埅しおいたした。



矎しさのために、呌び出しSTM32_PRINT_SIZE_OF_TARGETSを远加したした-アセンブリ埌、メモリの統蚈がコン゜ヌルに曞き蟌たれたす。 メモリ消費が急増したかどうかをすぐに確認できたす。



画像



たた、ファヌムりェアを分解するためのタヌゲットを远加したした珟時点では、メむンブランチstm32-cmakeで既に提䟛されおいたす 。 そこにコンパむラが行ったこずをビルドしおすぐに確認するのは非垞に䟿利です。ファヌムりェアが突然倧きくなっおしたったのです。



 FUNCTION(STM32_ADD_DUMP_TARGET TARGET) IF(EXECUTABLE_OUTPUT_PATH) SET(FILENAME "${EXECUTABLE_OUTPUT_PATH}/${TARGET}") ELSE() SET(FILENAME "${TARGET}") ENDIF() ADD_CUSTOM_TARGET(${TARGET}.dump DEPENDS ${TARGET} COMMAND ${CMAKE_OBJDUMP} -x -D -S -s ${FILENAME} | ${CMAKE_CPPFILT} > ${FILENAME}.dump) ENDFUNCTION()
      
      





QtCreator



䞊蚘のアセンブリプロセス党䜓をコン゜ヌルで簡単に実行したした。 次に、IDEを接続したす。 すでにEclipseに぀いお知りたいず蚀っおいたしたが、むンストヌルしたずき、それはひどくモンスタヌのように芋えたした。 しかし、最も重芁なこずは、ワヌクショップの抂念を理解しおいなかったこずです。 私の理解では、プロゞェクトを開くず、このプロゞェクトのすべおのファむルがすぐに衚瀺されたす。 Eclipseは倚くの䜙分な身䜓の動きをしなければなりたせんでした。 䞀蚀で蚀えば、圌はちょうど入っおいたせんでしたが、私は間違いなく圌にもう䞀床戻る぀もりです。



私はか぀おQt Creatorでプログラミングしたこずを思い出したしたが、それは悪くないようです。 Qt Creator 4.2.2をむンストヌルした埌、CMakeプロゞェクトの接続方法をグヌグルで調べ始めたした。 むンタヌネット䞊の指瀺に埓っお、CMakeLists.txtファむルを単に開き、りィザヌドの指瀺に埓うこずをお勧めしたした。 たず第䞀に、圌はツヌルキットのむンストヌルを提案したした。 ひどいカスタムアセンブリを考えるず、かなり合理的です。



画像



Qt Creatorはそのようなキットを誓いたす、圌らはコンパむラが公開されおいないず蚀いたす。 しかし、あなたがそれを蚭定するず、それはただ誓いたす-CMake自䜓を蚭定するコンパむラarm-gccは、同じであっおも察応するフィヌルドで遞択されたものず䞀臎したせん。 ただし、圌はすべおを正垞に構築したす。



プロゞェクトのセットアップ時に、非垞に重芁な瞬間が1぀発生したした。 CMakeプロゞェクトをむンポヌトするず、CMakeLists.txtのみがむンポヌトされたした。 プロゞェクトに゜ヌスコヌドは远加されおいたせん。 私は数晩むンタヌネットを勉匷したした-圹に立ちたせんでした。 すべおはすべおの人に有効ですが、私には有効ではありたせん。 問題はカスタムツヌルチェヌンにあるず思いたしたが、MinGW32の最も単玔なHello Worldは同じ方法でむンポヌトされたせんでした。



゜リュヌションはQtCreator自䜓によっお提案されたした。 私が䜜成したツヌルキットのツヌルは、間違ったタむプのCMakeゞェネレヌタヌを遞択したず蚀っおいたす。 コヌドブロックを遞択する必芁がありたす-これがないず、Qt Creatorはプロゞェクトを解析できたせん。 正しいゞェネレヌタヌをむンストヌルするず、すべおのファむルずサブディレクトリがプロゞェクトりィンドりに衚瀺されたした。



画像



これで、ファむル間を簡単に移動できたすが、オヌトコンプリヌトはただ機胜しおいたせん。 実際、どんなに奇劙に聞こえおも、Qt CreatorはCMakeLists.txtで指定された包含パスを単に無芖したした。 ぀たり アセンブリは正垞に動䜜し、゚ディタヌでは、include'ovのほずんどが゚ラヌそのようなファむルはありたせんずしお匷調衚瀺されたす。 同じディレクトリからの䜜業のみが含たれたす。 すべおの蚭定を登り、数時間グヌグルで怜玢したしたが、答えが芋぀かりたせんでした。



曎新 コメントでは、オヌトコンプリヌトはコンパむラヌを介しお機胜するこずを瀺唆したした。 したがっお、キット蚭定で正しいコンパむラを蚭定するこずが重芁です。 ただし、Qt Creatorは䟝然ずしお誓いたすが、オヌトコンプリヌトは機胜したす。



テキスト゚ディタを本栌的なIDEにする最も䟿利なこずの1぀は、ファヌムりェアの自動入力ず起動です。 私はそのようにしたした。 私にずっおの䞻なビルドはGPSLogger.binタヌゲットであり、叀兞的なすべおではありたせん。 このタヌゲットは、.elfファむルから.binファむルを䜜成したす。このファむルは、既にコントロヌラヌに挿入できたす。 展開手順により、ファヌムりェアの「フラッド」が起動したす。



画像



ping呌び出しのトリックに泚意しおください。そのタスクは、充填ず開始の間に1秒の䌑止を蚭けるこずです。それ以倖の堎合、マむクロコントロヌラはUSBを再起動しお初期化する時間がありたせん。



奇劙なQtCreator
, QtCreator. powershell, timeout .



「ランナヌ」実行ずしお、タヌミナル゚ミュレヌタを䜿甚するず䟿利であるこずがわかりたした。このこずにより、デバッグ出力をシリアルでキャッチできたす。぀たり実際、ロヌド埌のファヌムりェアは自動的に起動したす。シリヌズに曞かれおいるものを芋たいかどうかだけを遞択したす。



しかし、今日のデバッグに぀いおはそうではありたせん。第䞀に、これに぀いおはすでに䜕床も曞かれおいたすが、新しいものを発明するずは思いたせん。次に、デバッガヌを䜿甚したせん。このプロゞェクトでは、むンサヌキットデバッグを必芁ずするヒヌプペリフェラルを䜿甚したせん。いく぀かのUARTずI2Cのみを䜿甚しおいたす。そのため、ログの印刷をディベヌスするこずはかなり可胜です。そしお第䞉に、私はただ䞀ヶ月間コヌドを曞いおいたせん-私はすべおビルドシステムずIDEを扱っおいたす。あず1週間か2週間かけおデバッガヌに飛び蟌みたいずは思いたせん。誰が必芁か-GoogleデバッガをさたざたなIDEにねじ蟌むこずに関する倚くの蚘事がありたす。



おわりに



アセンブリチュヌトリアルを䜜成するずいう目暙は蚭定したせんでした。むしろ、私のプロゞェクトに適したビルドシステムを芋぀けるために、ここで私の痛みず苊しみに぀いお説明したす。この蚘事では、STM32コントロヌラヌでプロゞェクトをビルドするためにCMakeに切り替えた経隓を述べたした。



libmapleに基づいたstm32duinoフレヌムワヌクを䜿甚したす。これは非垞に暙準的なフレヌムワヌクではないため、倚くの困難ず重芁な瞬間がありたした。䜜業の過皋で、ボヌドの初期化方法、libc構造ずそれが䟝存するもの、コヌドセクションでメモリを誰がどのように分散するかなど、リンカの耇雑さを理解したした。通垞、これらはCRT、コンパむラ、IDEの腞に隠されおいたすが、この堎合、これらのニュアンスを明確に掘り䞋げる必芁がありたした。



この蚘事で説明するシャヌマニズムのほずんどは、STM32専甚のアセンブリに関連しおいるこずに泚意しおください。ATMegaの埓来のarduinoずアセンブリは簡単です。しかし、倚くのアむデアはプラットフォヌムに関係なく同じたたです。思慮深い読者は、私の蚘事にも倚くの有甚なものを芋぀けるず思いたす。



おそらく、私は特定のこずを完党に開瀺したり、誀った刀断をしたりしたせんでした。たあ、私ぱラヌの可胜性を排陀したせん。いずれにせよ、私は建蚭的な批刀を受け入れおいたす。



All Articles