ARM MBED OS。 PlatformIOの䞋で任意のSTM32 MKを䜿甚する

画像 今幎の1月にLittleFSファむルシステムarm mbed osに統合に関する資料を曞いたずき、任意のSTM32マむクロコントロヌラヌ甚のarm mbed osを䜿甚したプロゞェクトの䜜成をできるだけ早く説明するこずを玄束したした。 ご存知のように、 ARMのオンラむンIDE たたは専甚のArm mbed郚門は、たず厳密に定矩されたデバッグボヌドの数をサポヌトしたすが、その数は少ないです。 第二に、最も有名なIDEであるARM 、 uVision KEIL 、およびIARのみを察象に、プロゞェクトの䞀郚を構築できるオンラむンの䟋を゚クスポヌトしたす。 さらに、䞀郚の䟋はたったく゚クスポヌトされたせん。 ぀たり、 IARのオプションのみが゚クスポヌトに䜿甚可胜、たたはKEILのみに䜿甚可胜などです。 そのため、圓時考えられおいたように、アヌムmbed osをMKに「固定」するこずを孊ぶこずは、たったく堎違いではありたせん。



しかし、人生はどんな蚈画に察しおも独自の調敎を行い、長い間この方向に取り組むこずは䞍可胜でした。 しかし、質問は未解決のたたであり、今、かなりの時間の埌、私は䞻題に戻りたす。



いずれにせよ、1぀の重芁な質問が未解決のたたでした。 私たちは皆、異なるIDEずさたざたなツヌルチェヌンを䜿甚しおいたす。 移怍プロセスは非垞に耇雑で、タンバリンずの特定のダンスが必芁です。 たずえば、 GCCのアセンブラヌはx86構文 ATTがありたす をサポヌトしおいないため、プログラマヌがここで最初に盎面する最も基本的な問題は、Arm mbedオペレヌティングシステムの゜ヌスコヌドでのアセンブラヌ挿入に察する同じGCCコンパむラヌの乱甚です。



誰かがIARを䜿甚し、誰かがuVisionを䜿甚し、誰かがSublime Textで曞き蟌み、そしお誰か私のようながCode :: Blocksを䜿甚したす 。 誰かがWindowsを䜿甚し、誰かがLinuxを䜿甚したす。 広倧さを把握し、理解できないものを受け入れるこずはできたせん。同時に、オプションを考慮せずに残すこずは、芳客の䞀郚を残すこずです。



解決策は突然珟れ、非垞にシンプルで普遍的なものになりたした。



PlatformIO IDE。



PlatformIOは、Pythonで蚘述されたクロスプラットフォヌムツヌルチェヌンであり、ナヌザヌのマシンに存圚するこずがおそらく唯䞀の前提条件ですバヌゞョン2.7以䞊。



そのパフォヌマンスず䜿甚したツヌルによるず、 PlatformIOは 、数幎前にリリヌスされたIDE MicroEJ Studioを思い出したした。このリリヌスでは、Javaでマむクロコントロヌラヌのコヌドを曞くこずができたした。 その埌、MicroJVMCで蚘述がMKに泚がれ、その䞭でコヌドが実行されたした。 しかし、媒䜓は広く配垃されず、倧衆に行きたせんでした。



PlatformIOは、倚くの広範なIDEおよびコヌド゚ディタヌの䞀郚ずしお䜿甚できたす。





PlatformIOの䞻な機胜は、構成ファむル「platformio.ini」の䜿甚です。これは、プロゞェクトのタヌゲットプラットフォヌムを決定し、この構成ファむルにある蚘述に埓っおラむブラリをロヌドし、䟝存関係を構築するために䜿甚されたす。



䞻な芁玠はPlatformIO IDEずPlatformIO Coreです。

2016幎、 PlatformIOは2016 IoT Awardsで「Best IoT SoftwareTools」にノミネヌトされたした。

これは䞀般的な抂芁です。 詳现なドキュメントは、platformio.orgプロゞェクトのWebサむトずドキュメントのセクションにありたす。

私たちのタスクは、必芁な開発ツヌルを確立し、プロゞェクトを䜜成し、その䞭で䜕かをするこずです。



アトムvs. VSコヌド



ホヌムペヌゞには、 AtomずVS Codeの 2぀の゚ディタヌがダりンロヌド甚に提䟛されおいたす。 䞡方詊しおみたしたが、すぐに蚀いたす。VSCodeの方が䟿利です。 コヌドに基本的な遷移があるためだけの堎合。 今埌の展望を述べたす。ラむブラリず゜ヌスコヌドのプロゞェクトでは、衚瀺されないarm mbed osはすべおロヌカルリポゞトリにあるため、 main.cppず、プロゞェクトツリヌで䜜成する他のすべおのもののみです。 したがっお、いく぀かの宣蚀、クラスずそのオブゞェクト、クラスむンタヌフェむスを100監芖する必芁がありたす。 しかし、 Atomはそのような機䌚を提䟛したせん たた、 Atomを䜿甚する堎合は、mbed osドキュメントに満足するだけで枈みたす。 同意したす、これは䞍䟿です。



そのため、 VS Codeに適甚されるプロセスをさらに調べたす 。 次の手順を実行する必芁がありたす。



  1. VS Codeをむンストヌルしたす。
  2. PlatformIO IDEをむンストヌルしたす。
  3. udevルヌルを蚭定したすLinuxナヌザヌの堎合-必芁ではないかもしれたせんが、埌で怅子にバりンスしないように、予防的なストラむキを行いたす。
  4. プロゞェクトを䜜成し、その䞭に最小限の機胜を含めたす。 ボヌド䞊でアセンブル、ロヌド、デバッグされおいるこずを確認しおくださいOCD / GDBがサヌバヌずしお䜿甚されたす。


リンクをクリックし、目的のシステムのむンストヌラヌをダりンロヌドした埌、 VS Codeをむンストヌルしたす。



むンストヌル埌、゚ディタヌを起動し、拡匵機胜パネルを開き、怜玢に「platformio」ず入力したす。 最初のオプションは「 PlatformIO IDE 」をポップアップしたす。 「むンストヌル」をクリックし、むンストヌルが完了するのを埅っお、゚ディタヌを再起動したす。



画像






Linuxナヌザヌは、デバッガヌが正垞に動䜜するためのudevルヌルをすぐにむンストヌルできたす。 原則ずしお、デバッガヌの開始時に、タヌミナルが「 リモヌト通信゚ラヌ。 タヌゲットが切断されたした。ピアによっお接続がリセットされたした。 」



タヌミナルを開いお曞き蟌みたす



sudo curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/scripts/99-platformio-udev.rules > /etc/udev/rules.d/99-platformio-udev.rules
      
      





端末に「Permission denied」ず衚瀺されたら、 リンクからファむル「99-platformio-udev.rules」をダりンロヌドし、ファむルをetc / udevに匷制的にコピヌしたす。



 sudo cp 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules
      
      





cpコマンドの埌にファむルぞのフルパスを指定する必芁があるこずに泚意しおください。 .rulesファむルがフォルダヌにある堎合「ダりンロヌド」など、タヌミナルコマンドは次のようになりたす。



 sudo cp ~/Downloads/99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules
      
      





次に行うこず



 sudo usermod -a -G dialout $USER sudo usermod -a -G plugdev $USER
      
      





ここで、 $ USERはナヌザヌ名です。 たずえば、このサブディアがありたす。

その埌、発生する可胜性がある堎合、デバッガヌのすべおの問題を解決する必芁がありたす。



環境およびロヌカルリポゞトリarm mbed os



環境をむンストヌルした埌、ロヌカルarm mbed osリポゞトリの堎所既に述べたように、プロゞェクトツリヌには衚瀺されたせん、すべおのmbed os゜ヌスの堎所、およびコンパむルされたプロゞェクトの保存堎所を理解するこずは䞍芁です。



むンストヌルプロセス䞭に、 platformIOは、パス$ HOME / .platformio / packagesに沿っおロヌカルarm mbedリポゞトリヌおよびそれだけではなくをデプロむしたす。 ここでは、たずえば、arm mbed。



画像






ファヌムりェアファむルずプリコンパむルされた゜ヌスは、プロゞェクトフォルダヌに盎接配眮されたす。



画像






それが保存されおいる堎所に぀いお知る必芁があるのはそれだけです。 プロゞェクトの䜜成に盎接進みたす。



プロゞェクトを䜜成したす。



䜜成䞭のプロゞェクトに぀いお簡単に説明したす。 明らかな理由から、サポヌトされおいるARMオンラむンIDEに含たれおいないボヌド、぀たりSTM32F4DISCOVERYのプロゞェクトを䜜成するこずにしたした。



組み蟌みシステムの䞖界では、点滅するLEDを䜿甚したデモンストレヌションプロゞェクトを䜜成するのが䞀般的です。 私たちはこれをしたせん-それはすでに単玔で面癜くないです。 PlatformIOは 、 cmsis 、 hal 、 rtosなどのいく぀かのタむプのプロゞェクトを意味したす。 珟圚arm mbed os、぀たりオペレヌティングシステムに぀いお話しおいるので、 rtos専甚のプロゞェクトを䜜成したす。



プロゞェクトでは、3぀のタスクタスクを䜜成しお実行したす最初はfloat型の配列を乗算しCortex-M4Fプロセッサがあるため、FPUを䜿甚したす、2番目のタスクは... LEDを点滅=し、3番目は決定したすCPU䜿甚率



行きたしょう。



VS Codeを開きたす 。 最初のステップは、 PIOホヌムりィンドりを開くこずです。 「 新芏プロゞェクト 」を遞択したす。



画像






「 プロゞェクトりィザヌド 」りィンドりで、プロゞェクトの名前を指定し「armmbed_F407_CPU_usage」にしおください、「 ボヌド 」ドロップダりンリストでボヌドを遞択したす。 著䜜暩ボヌド甚の゜フトりェアを䜜成するずきに玠材を䜿甚するこずを蚈画しおいる読者の堎合はい、特定のボヌドにバむンドしたすが、すべおの脚ず呚蟺機噚を再構成できたす。 次に、私はこれに぀いおいく぀かの蚀葉を蚀いたすが、急いで怒っおはいけたせん。 だから、 ボヌド 。



画像






STM32F4DISCOVERYを遞択し、「 フレヌムワヌク 」りィンドりに移動したす。 ここにはいく぀かのオプションがありたす。



画像






arm mbed osの䜿甚に同意したため、ここでは「 mbed 」オプションを遞択するこずは明らかです。 「 終了 」をクリックしたす-完了。 りィザヌドは少し考えお、新しく䜜成したプロゞェクトの空癜を開きたす。 それを芋おください。



画像






前述したように、プロゞェクトにはデフォルトのフォルダヌが2぀しかありたせん。lib 空ずsrcで、単䞀のmain.cppファむルが含たれおいたす。 ここでは゜ヌスコヌド党䜓が衚瀺されないこずを思い出しおください。 それでも、arm mbed osのすべおの機胜を䜿甚できたす。 rtosを䜿甚するには、「 platformio.ini 」ファむルにビルドフラグを远加する必芁がありたす。



 build_flags =-DPIO_FRAMEWORK_MBED_RTOS_PRESENT
      
      





䞀般に、構成ファむルは個別に考慮する必芁がありたす。 このアプロヌチは、 .cfg構成ファむルでTexas Instrumentsの TIRTOS / SYSBIOSを思い出したしたが、アヌムmbedではすべおがはるかに簡単です。 構成ファむルでは、ハヌドりェアリ゜ヌスからフラグの䜜成ずデバッグたで、倚くを宣蚀できたす。 たずえば、最も単玔な構成ファむルの構成は次のずおりです。



 [env:disco_f407vg] platform = ststm32 framework = mbed board = disco_f407vg
      
      





そしお、これは最終圢匏の䟋の蚭定ファむルです



 [env:disco_f407vg] platform = ststm32 board = disco_f407vg framework = mbed build_flags = -DPIO_FRAMEWORK_MBED_RTOS_PRESENT -O1 -Wl,-u_printf_float -D std=gnu99 -fno-builtin-printf -fexceptions -fpermissive debug_flags = -D DEBUG=1 -DDEBUG_LEVEL=DEBUG_NONE monitor_baud = 115200
      
      





ですから、あなたの䜙暇に孊ぶべきこずがありたす。



そのため、必芁な圢匏でプロゞェクトを導入し始めたす。



コヌドをブロック単䜍で提䟛し、コヌドで䜕が起こっおいるのかを説明したす。 開始するには、゜ヌスにヘッダヌファむル「 mbed.h 」ず「 rtos.h 」を含める必芁がありたす。 理由は明らかだず思いたす。



メむン関数は次の圢匏を取りたす。



 /**************************************************************************/ int main (void) { Thread thread0; Thread thread1; Thread thread2; Thread::attach_idle_hook (&sleeping_sun); thread0.start (&ledblink); thread1.start (&cpu_usage); thread2.start (&math_thread); while (true) { } } /**************************************************************************/
      
      





最初に、「 Thread 」クラスのオブゞェクト、぀たり本質的に、特定の機胜を提䟛するタスクTask、Threadを䜜成したす。

誰かが気付いた堎合、次の行が衚瀺されたす



 Thread::attach_idle_hook (&sleeping_sun);
      
      





これは「 アむドル 」タスクです。぀たり、優先床の䜎いタスクです。通垞の優先床の高いタスクを完了した埌、プロセッサが残っおいる時間だけ割り圓おられたす。 さお、私たちの堎合、このタスクはプロセッサに時間がないため空腹のたたです。 ほんの䞀䟋ずしおここに持っおきたした。



次に、「 start 」メ゜ッドを䜿甚しおタスクを順番に開始し、タスクの機胜、぀たりプロセスで実行されるものぞの参照を枡したす。 これは「 ledblink 」-shmorgalka、「 cpu_usage 」 -CPU負荷の蚈算、および最も難しい-「 math_thread 」、配列の乗算を実行したす。



各タスクを芋おみたしょう。 「 ledblink 」では、すべおが簡単です。



 /**************************************************************************/ void ledblink (void) { while (true) { myled1 = !myled1; Thread::wait (500); } } /**************************************************************************/
      
      





LEDの出力状態を反察に亀互に倉曎し、500ミリ秒の遅延を発生させたす。 ずころで、宣蚀「 myled1 」は次のようになりたす。



 DigitalOut myled1(LED1);
      
      





ここでcpu_usageタスクに泚目したしょう。



 /**************************************************************************/ void cpu_usage (void) { Timer tim; CPU_Usage cpu(tim, 1); cpu.working(); uint8_t value = 0; while (true) { cpu.delay(0.25); value = cpu.update(); pc.printf("CPU %i", value); } } /**************************************************************************/
      
      





ここのすべおは、もう少し耇雑です。 䞀般に、自転車を発明しないために、私は2014幎にアヌムmbedのためにCPU_Usageず呌ばれる面癜い男が曞いた既補のラむブラリを䜿甚したした。 あなたはそれを参照するこずができたす、それの簡単な説明がありたす。 ラむブラリはタむマヌを䜿甚したす Timer timクラスのオブゞェクトが衚瀺されたす。 最初に「 cpu 」クラスのコンストラクタヌが呌び出され、次に「 working 」 䜜業の開始メ゜ッド、および「 update 」メ゜ッドがプロセッサヌ負荷の割合を蚈算したす。



おそらく今こそ、デモンストレヌションするのに最適な時期です。 デバッグモヌドから画面を衚瀺したす。



画像






巊䞊の倀「 value 」= 95が衚瀺されたす。これは、その時点でプロセッサの95がロヌドされたこずを意味したす。 䞀般に、実隓の結果によるず、同じタスクを実行するずきのこの倀は、87〜98で倉動したした。



ずころで、端末からではなくデバッガからのスクリヌンショットを衚瀺しおいるのはなぜですか 簡単です。手元にUART-USBアダプタヌがないため、UARTタヌミナルを䜿甚できたせんこの関数「 pc.printf 」は単なるUART出力であり、pcはSerialクラスのオブゞェクトです。



そしお、プロセッサにずっお最埌で最も食いしん坊なのはmath_threadタスクです。 それを芋おみたしょう-最初に「むき出しの」圢で、次にアヌムmbedパンでもう少し。



 /**************************************************************************/ void math_thread(void) { volatile uint16_t rand_num_dmassi1 = 0; volatile uint16_t rand_num_dmassi2 = 0; float result; while (true) { rand_num_dmassi1 = RandomMassIndex(); rand_num_dmassi2 = RandomMassIndex(); result = (DigMas1[rand_num_dmassi1]*DigMas2[rand_num_dmassi2]); } } /**************************************************************************/
      
      





プロセッサのロヌド方法を思い぀いたずき、配列の乗算がすぐに思い浮かびたした。 そしお、私がリモヌトで䜕かをしおいるそしお䞖界䞭の半分でリモヌトでデバッグしおいる顧客がSkypeで私に叫んだずきの状況を思い出したした「 あなたはプログラマです。プロセッサをロヌドしおください 圌はずおも寒いです、暖かくしおください 」 MCUを加熱したす。 =



そしお、配列を順番に乗算するのではなく、乱数ゞェネレヌタを䜿甚しおむンデックスを生成するこずにしたした。 そしお、ここでも、玠晎らしい数孊ラむブラリヌalglibが圹立ちたした 。 それは数孊的機胜の巚倧な局をカバヌしおおり、あなたはここでそれを取るこずができたす 。 もちろん、機胜の巚倧な局党䜓を䜿甚するわけではありたせんが、小さな郚分を䜿甚したす。



補品のタスク蚈算機を芋るず、そこに「 RandomMassIndex 」ずいう2぀の呌び出しがありたす。 これは、範囲内の倀を返す単なる関数です範囲は配列芁玠の数によっお制限されたす。



 /**************************************************************************/ uint16_t RandomMassIndex (void){ uint16_t randval; alglib_impl::ae_state mystate; randval = alglib_impl::ae_randominteger(18, &mystate); return randval; } /******************************END_OF_FILE*********************************/
      
      





ここで私たちは䜕をしおいたすか。 たず、「 ae_state 」構造を初期化し内郚のニヌズに䜿甚されたす、次に「 ae_randominteger 」メ゜ッドを呌び出したす。このメ゜ッドに構造ぞのリンクを枡し、生成された乱数を取埗する範囲を取埗したす0..18がありたす  この数は、生成される最倧倀よりも小さくする必芁がありたす。 配列芁玠の数は200..19で、最倧数は19です。したがっお、境界匕数ずしおの18は、私たちにぎったりです。



ずころで、この関数を呌び出した結果を芋るこずができたす。



画像






巊䞊は、ランダムに生成された配列のむンデックスrand_num_dmassi1ずrand_num_dmassi2です。 13および12。



別のサむクルを進めお、倉化するかどうかを確認したしょう。



画像






11および17。倉曎。 だからすべおが動䜜したす。



リ゜ヌス分析特に、プロセッサ時間の䜿甚に぀いお話し始めたので、少しメモリ時間ずタスクの優先順䜍をずりたす。 Arm mbed osは、これらのニヌズに合わせおrtos :: Threadクラス党䜓を実装したす。



次の行をmath_threadタスクに盎接远加したす。



 osThreadId_t this_thread_id; volatile uint32_t this_thread_stacksize; volatile osPriority_t this_thread_priority; this_thread_id = osThreadGetId(); this_thread_stacksize = osThreadGetStackSize(this_thread_id); this_thread_priority = osThreadGetPriority(this_thread_id);
      
      





ここおよび䞊蚘では、倉数を远跡できるようにvolatileキヌワヌドを䜿甚したした。



そのため、最初に将来の䜿甚のためにタスクIDを取埗したす。 次に、メ゜ッドを呌び出しおタスクスタックずその優先床を決定したす。 優先床は倖出先で倉曎できたす-䞀郚のアプリケヌションではこれが必芁です。

芋たす。

画像






タスクスタックのサむズは4096バむトであり、優先床はosPriorityNormalであるこずがわかりたす。 通垞の優先床。



さらに、ナヌザビリティの皋床、未䜿甚および䜿甚枈みスタックのサむズを評䟡できたす。 メむンに盎接远加



 volatile uint32_t threads_stack; volatile uint32_t threads_max_stack; volatile uint32_t free_stack; volatile uint32_t used_stack;
      
      





そしお、タスクを開始した埌



 threads_stack = thread0.stack_size(); threads_stack = thread1.stack_size(); threads_stack = thread2.stack_size(); threads_max_stack = thread0.max_stack(); threads_max_stack = thread1.max_stack(); threads_max_stack = thread2.max_stack(); free_stack = thread0.free_stack(); free_stack = thread1.free_stack(); free_stack = thread2.free_stack(); used_stack = thread0.used_stack(); used_stack = thread1.used_stack(); used_stack = thread2.used_stack();
      
      





ここでは4぀のメ゜ッドが呌び出されたす。 「 Stack_size 」はタスクスタックのサむズを返したす少し前に掚定したものず同様、「 max_stack 」は実行プロセスで䜿甚される最倧サむズを返し、「 free_stack 」は空き領域のサむズを返し、「 used_stack 」-䜿甚サむズ。 戻り倀はバむト単䜍です。 3぀のタスクすべおで、これらの倀は同じになりたす。



デバッガヌでテレビに衚瀺されおいるものを芋おみたしょう。



画像






ご芧のずおり、4096バむトからかなり離れおいたす-64バむトのみで、ただ4032バむトの圚庫がありたす。



おそらく私たちは実隓ず分析で終わるでしょう-私はすでにやりすぎおいたす。



はい、著䜜暩掲瀺板に぀いお他に蚀いたいこずはありたすか。 今、誰かが蚀うこずができる、圌らは蚀う、圌はF4Discoveryを取り、それを楜しんで遊んだが、私は䞀般に自家補のボヌドを持っおいたす、そしおLEDは䞀般に他の足に掛かりたす、そしお䞀般に、私はそれにSPIを䞊げたいです。 そのため、 アヌム付きリポゞトリの「 targets 」フォルダヌ非垞に特定のMCUをさらに遞択したす-それらは暗い、各マむクロコントロヌラヌのディレクトリには、「 PinNames.h 」、「 PeripheralPins.h 」、「 PeripheralNames 」ずいう名前の玠晎らしいリヌダヌがいたす.h 」。 これらのファむルを線集するこずにより、呚蟺機噚を远加/線集/削陀できたす。



これ、おそらく、私は停止したす。 arm mbedのさたざたなアプリケヌション非rtosを含むがベアメタルのみを含むのその他の䟋は、 こちらのアヌカむブで耇補たたはダりンロヌドできたす 。



䜜成したサンプルを含む資料Googleドラむブ ぞのリンクを添付し、ネタバレの䞋に完党な゜ヌスコヌドを配眮しお、党䜓像を完成させたす。 どちらかずいえば、subdia.subdia @ gmail.comぞようこそ。



main.cpp
 #include "mbed.h" #include "rtos.h" #include "CPU_Usage.h" #include "alglibmisc.h" #include "ap.h" DigitalOut myled1(LED1); DigitalOut myled2(LED2); Timer tim; CPU_Usage cpu(tim, 1); Serial pc(USBTX,USBRX,9600); #define PRETTY_ENOUGH 20 float DigMas1[PRETTY_ENOUGH] = {0.1234, 1.1234, 2.1234, 3.1234, 4.1234, 5.1234, 6.1234, 7.1234, 8.1234, 9.1234, 10.1234, 11.1234, 12.1234, 13.1234, 14.1234, 15.1234, 16.1234, 17.1234, 18.1234, 19.1234}; float DigMas2[PRETTY_ENOUGH] = {0.5678, 1.5678, 2.5678, 3.5678, 4.5678, 5.5678, 6.5678, 7.5678, 8.5678, 9.5678, 10.5678, 11.5678, 12.5678, 13.5678, 14.5678, 15.5678, 16.5678, 17.5678, 18.5678, 19.5678}; uint16_t RandomMassIndex (void); /**************************************************************************/ void math_thread(void) { volatile uint16_t rand_num_dmassi1 = 0; volatile uint16_t rand_num_dmassi2 = 0; float result; osThreadId_t this_thread_id; volatile uint32_t this_thread_stacksize; volatile osPriority_t this_thread_priority; while (true) { rand_num_dmassi1 = RandomMassIndex(); rand_num_dmassi2 = RandomMassIndex(); result = (DigMas1[rand_num_dmassi1]*DigMas2[rand_num_dmassi2]); this_thread_id = osThreadGetId(); this_thread_stacksize = osThreadGetStackSize(this_thread_id); this_thread_priority = osThreadGetPriority(this_thread_id); } } /**************************************************************************/ void cpu_usage (void) { uint8_t value = 0; while (true) { cpu.delay(0.25); value = cpu.update(); pc.printf("CPU %i", value); } } /**************************************************************************/ void ledblink (void) { while (true) { myled1 = !myled1; Thread::wait (500); } } /**************************************************************************/ void sleeping_sun(void) { return; } /**************************************************************************/ int main (void) { Thread thread0; Thread thread1; Thread thread2; volatile uint32_t threads_stack; volatile uint32_t threads_max_stack; volatile uint32_t free_stack; volatile uint32_t used_stack; Thread::attach_idle_hook (&sleeping_sun); thread0.start (&ledblink); thread1.start (&cpu_usage); thread2.start (&math_thread); threads_stack = thread0.stack_size(); threads_stack = thread1.stack_size(); threads_stack = thread2.stack_size(); threads_max_stack = thread0.max_stack(); threads_max_stack = thread1.max_stack(); threads_max_stack = thread2.max_stack(); free_stack = thread0.free_stack(); free_stack = thread1.free_stack(); free_stack = thread2.free_stack(); used_stack = thread0.used_stack(); used_stack = thread1.used_stack(); used_stack = thread2.used_stack(); cpu.working(); while (true) { } } /**************************************************************************/ uint16_t RandomMassIndex (void){ uint16_t randval; alglib_impl::ae_state mystate; randval = alglib_impl::ae_randominteger(18, &mystate); return randval; } /******************************END_OF_FILE*********************************/
      
      







ご枅聎ありがずうございたした。すべおの良い䞀日ず良い気分。



画像







All Articles