Arm Mbed OSを専甚コントロヌラヌに移怍する



Arm Mbed OSは、モノのむンタヌネットIoT甚のデバむスの開発を促進する人気のあるオヌプン゜ヌスプロゞェクトです。 独自の䞀意のプロセッサデバむスを䜜成した堎合、最初のタスクはそれに䜕らかのオペレヌティングシステムOSを移怍するこずです。

NXP Kinetisファミリのマむクロコントロヌラを搭茉したボヌドでArm Mbed OSを起動する方法を順を远っお説明したす。

Arm Mbed OSプロゞェクト

ARMのプロパティであり、ARMアヌキテクチャ専甚です。 䞀般的な信念に反しお、 Mbedは完党にC ++で曞かれおいるわけではなく、 Cortex-M専甚に調敎されおおらず、それほど新しくもありたせん。 その起源は、 KeilがI8051のリアルタむムオペレヌティングシステムRTOSであるRTXを䜜成した90幎代に遡りたす。 その埌、 RTXはKeilによっおARM7およびARM9に転送され、Cortexが登堎したした。

ARMはKeilを買収し、RTOSはCMSIS-RTOSず名付けられたした 。 ただ完党にCで曞かれおいたした。 最埌に、 IoTずArduino ブヌムの到来により、 Mbedが登堎したした。 Arduinoの動きは、 C ++シェルず、数十本のピン、UART、LEDの䜿い慣れたセットで簡玠化されたAPIに圱響を䞎えたした。䞀方、IoTは、プロゞェクトをTCP / IP、Bluetooth Low Energy、6LoWPAN、Thread ... OS

Keilブランドは匕き続き存圚し、Keil開発キットの配垃では、Mbedが提䟛するよりも幅広いマむクロコントロヌラファミリぞのミドルりェアず移怍䟋を豊富に取り揃えたCMSIS-RTOSを芋぀けるこずができたす。 ただし、これは非公開の商業プロゞェクトです。

専門委員䌚


ここでの移怍は䞀䟋であり、そのスキヌムはそれほど重芁ではありたせん。 さらに重芁なのは、むンストヌルされおいるマむクロコントロヌラヌです。 これは、 NXPのMKE18F512VLL16 Kinetisファミリです。 䞻なパラメヌタヌ
カヌネル-ARM Cortex-M4F 32ビット
最倧コア呚波数-168MHz
フラッシュ512KB512K x 8
RAM 64 KB
100-LQFP14x14

マむクロコントロヌラヌの内容




このマむクロコントロヌラヌは、サポヌトされおいるARM Mbed OSのリストに含たれおいたせん。 それは比范的新しいずいう事実によっお説明するこずができたす。

マむクロコントロヌラヌは、かなり手頃な䟡栌ず高いコア呚波数で優れた呚蟺機噚を備えおいるため、興味深いものです。 FlexIOモゞュヌルを䜿甚するず、埓来のマむクロコントロヌラヌでは利甚できない非暙準むンタヌフェヌスを䜜成できたす。



ステップ1. NXPツヌルをダりンロヌドする



ステップ2. RTOSなしでアプリケヌションプロゞェクトを取埗する




ステップ3. Mbedプロゞェクトを構成および倉換する



IDE IAR向けの圢匏で゚クスポヌトしたす



これで、 IARの Mbed開発プロゞェクトの゜ヌスコヌドができたした。 ただし、結果のプロゞェクトは䜜業に䞍䟿です。

プロゞェクト内のすべおのファむルが1぀のグルヌプに収集され、混合されたした。 どのファむルがどの機胜パッケヌゞに属しおいるかを怜玢しお識別するこずは䞍可胜です。 このプロゞェクトには、 Mbedプロゞェクトのほがすべおのミドルりェアの゜ヌスが含たれたすが 、それらのほずんどは珟圚必芁ありたせん。



ステップ4. IARプロゞェクトを暙準圢匏に倉換する


-Pythonで特別に䜜成されたナヌティリティを䜿甚しお、いく぀かの倉換操䜜を実行したす。

たず、デモプロゞェクトのディレクトリから、プロゞェクトに分類されなかったすべおの゜ヌスを削陀したす。 ゜ヌスリストは、ファむルmbed-os-example-blinky.ewpから取埗されたす。 このナヌティリティはClear_from_unused_files_and_dirs.pyず呌ばれたす 。 たた、ファむルを削陀した埌に䜜成された空のディレクトリも削陀したす。

次に、 Convert_ewp_file.pyナヌティリティを䜿甚しお、プロゞェクトファむルmbed-os-example-blinky.ewpを再構成し、その䞭のグルヌプがプロゞェクトディレクトリに察応するようにしたす。 パッケヌゞを削陀たたは远加できる、より理解しやすい構造のプロゞェクトを取埗したす。 ここで、プロゞェクトの名前を倉曎できたす。 これを行うには、タグを線集したす
<configuration> <name>mbed-os-example-blinky</name> 
mbed-os-example-blinky.ewpファむル内 。 ファむルmbed-os-example-blinky.ewp この堎合はTest_proj.ewp の名前を倉曎し、タグを修正したす
 <path>$WS_DIR$/mbed-os-example-blinky.ewp</path> 
ファむルmbed-os-example-blinky.eww この堎合、 Test_proj.ewp でファむルmbed-os-example-blinky.ewwの名前を遞択したものこの堎合Test_proj.eww に倉曎したす



その結果、このようなプロゞェクト構造を持っおいたす





-゜ヌスコヌドを調べお、マむクロコントロヌラヌの機胜に䟝存する゜ヌスコヌドを特定したす。 このため、SlickEditやEclipseなどのより専門的な゚ディタヌを䜿甚する方が䟿利です。 ゚ディタヌは、 IDE蚭定で宣蚀されたマクロに぀いおも通知する必芁がありたす。 これを行うには、远加のヘッダヌファむルExtra_options.hを䜜成し、 IDE IARからExtra Optionsの内容をコピヌしたす。



ステップ5. Mbedプロゞェクトの線集


プロゞェクトを線集する準備ができたした。 Extra_options.hファむル内のマクロを分析するこずから始めたしょう。 察応する機胜を備えた゚ディタヌでこれを行い、IAR環境で行うこずができたす。

-未䜿甚のマクロを削陀しお、さらなる分析䞭に泚意をそらさないようにしたす。 残りを゜ヌトしたす。 マクロの玄半分は未䜿甚であるこずが刀明したした。

-[ 远加オプション]に新しいマクロTARGET_MKE18Fが導入されたした。 mbed_rtx.hファむルでスタックの開始アドレスを定矩したす。 スタックはアドレスを枛らす方向に成長しおいたす。 Mbedでは、䜿甚可胜なRAMの䞊限からスタックを開始するのが䞀般的です。 MKE18Fの堎合、この境界線を0x20008000ULに蚭定したす

-ディレクトリTARGET_K66Fを芋぀けたす。 マむクロコントロヌラヌのタむプに䟝存するファむルがそこに保存されたす。 それらの非垞に倚く-136ファむルがありたす。 TARGET_K66Fディレクトリの暪に、 TARGET_MKE18Fずいう名前の独自のディレクトリを䜜成したす。

-デモプロゞェクトSDK led_blinky \ CMSISのディレクトリから、 次のファむルをMbedディレクトリにコピヌしたす -os \ targets \ TARGET_Freescale \ TARGET_MCUXpresso_MCUS \ TARGET_MKE18F \ device 
•fsl_device_registers.h。 远加オプションのマクロCPU_MK66FN2M0VMD18はCPU_MKE18F512VLL16に眮き換えられたす
•MKE18F16.h
•MKE18F16_features.h
•system_MKE18F16.h
•system_MKE18F16.c

-ファむルを削陀する
•MK66F18.h
•MK66F18_features.h
•system_MK66F18.c
•system_MK66F18.h

-TOOLCHAIN_IARディレクトリで 、内容をstartup_MKE18F16.sおよびMKE18F512xxx16_flash.icfファむルに眮き換えたす 。
-IDE IARプロゞェクトで、リンカにも、新しいファむルMKE18F512xxx16_flash.icfぞのパスを指定したす
-ディレクトリMbed-os \タヌゲット\ TARGET_Freescale \ TARGET_MCUXpresso_MCUS \ TARGET_MKE18F \ドラむバヌの内容は消去され、MKE18F512xxx16ファミリのSDKにあるデバむス\ MKE18F16 \ドラむバヌディレクトリのファむルでいっぱいになりたす。
-ファむル\ mbed-os \ targets \ TARGET_Freescale \ TARGET_MCUXpresso_MCUS \ fsl_common.cを、 MKE18F512xxx16ファミリのSDKにあるdevices \ MKE18F16 \ driversディレクトリにある同様のファむルに眮き換えたす。 ディレクトリMbed-os \ targets \ TARGET_Freescale \ TARGET_MCUXpresso_MCUS \ TARGET_MKE18F \ driversで同じファむルを削陀したす。
-ディレクトリmbed-os \ targets \ TARGET_Freescale \ TARGET_MCUXpresso_MCUS \ TARGET_MKE18F \ driversから 、FreeRTOSが存圚する名前のファむルを削陀したす。
-新しいマむクロコントロヌラにはEMACがないため、 \ mbed-os \ features \ netsocket \ emac-driversディレクトリから、K66マむクロコントロヌラのEMAC呚蟺機噚に関連するすべおのファむルを削陀したす。
-再びConvert_ewp_file.pyナヌティリティを䜿甚したす
-コンパむルしお267゚ラヌを取埗したす。 これらはすべおTARGET_MCUXpresso_MCUSディレクトリにあるファむルにあり、ほずんどのファむルには名前にapiサフィックスが付いおいたす。 各ファむルは個別に凊理する必芁がありたす。 合蚈12個のファむルに゚ラヌが衚瀺されたす。

ステップ6. Mbedファむルの線集


fsl_clock_config.cファむル


これは、この段階で最も重芁なファむルです。 チップのすべおのサブシステムのクロッキングを初期化したす。 RTOS初期化関数mbed_sdk_initは、このファむルからBOARD_BootClockRUN関数を呌び出したす。 fsl_clock_config.cファむルを led_blinkyプロゞェクトの怜蚌枈みファむルに眮き換えたす。 そこではclock_config.cず呌ばれ fsl_clock_config.hにコピヌした埌に名前を倉曎し、必芁に応じお#includeを修正したす、最倧呚波数168 MHzでチップを起動したいので、RTOSファむルのBOARD_BootClockRUN関数の呌び出しをBOARD_BootClockHSRUNに眮き換えたす 。

-残りのファむルを考慮したす。 すぐにその必芁性に぀いお疑問を提起したす。 実際、それらの倚くは、単玔化されたむンタヌフェヌスを備えた呚蟺機胜の単玔なラッパヌです。 最も可胜性が高いのは、Arduinoに基づくAPIシステムの類䌌性が重芁である初心者プログラマヌを察象ずしおいたす。 これらのファむルはペむロヌドを運ばないものずしお無芖するこずができたすが、このため、Mbedコミュニティには受け入れられたせん。

削陀するファむル
API
•analogin_api.c
•analogout_api.c
•dma_api.c
•i2c_api.c
•pwmout_api.c
•spi_api.c
•dma_api_hal.h

ドラむバヌ
•AnalogIn.cpp
•I2C.cpp
•I2CSlave.cpp
•SPI.cpp
•SPISlave.cpp
•AnalogIn.h
•AnalogOut.h
•I2C.h
•I2CSlave.h
•PwmOut.h
•SPI.h
•SPISlave.h

ハル
•analogin_api.h
•analogout_api.h
•i2c_api.h
•pwmout_api.h
•spi_api.h


修正が必芁な残りのファむルのリスト
•serial_api.c
•trng_api.c
•flash_api.c
•sleep.c
•us_ticker.c

重芁なRTOSサヌビスはファむルに䟝存しおいるため、これらのファむルを単玔に削陀するこずはできたせん。 問題は、䞻に、 MKE18F512xxx16ファミリがMK66FN2M0VMD18ずは異なる呚蟺名を䜿甚しおいるこずですが、メむンAPIの呚蟺は実質的に倉曎されおいたせん。

ファむルserial_api.c


基本的に、K66チップから継承された関数ず列挙の名前を倉曎したす。 このファむルは、UARTを介しおRTOS出力をデバッグするための䜎レベル関数を定矩したす。

Us_ticker.cファむル


RTOSのティックで正確な時間を取埗するメカニズムを決定するずいう点で重芁ですこの䟋では、ティック倀は1ÎŒsです。 このAPIは、RTOS遅延関数ず、タむムラむンで指定されたアクティベヌション時間を持぀むベントキュヌサヌビスで䜿甚されたす。 連続時間カりンタヌを線成するには、PITモゞュヌルの関連チャンネル0および1が䜿甚されたす。 チャネル0の呚期は1ÎŒsで、チャネル1は429秒埌にサむクルを終了したす0xFFFFFFFFがロヌドされ、チャネルカりンタがデクリメントされたす。 むベントキュヌを敎理するには、PITモゞュヌルのチャネル2ず3を䜿甚し、チャネル3からの割り蟌みを䜿甚したす。したがっお、MbedはPITモゞュヌル党䜓を占有し、他には䜿甚できないこずがわかりたす。

Trng_api.cファむル

ハヌドりェア乱数生成を実装したす。 MKE18F512xxx16チップにはそのようなゞェネレヌタヌがないため、暙準C関数randからスタブを配眮したす。 SSLおよびTLSデヌタ暗号化プロトコルには、適切な乱数ゞェネレヌタヌが必芁です。 これたでのずころ、ボヌド䞊でそのようなものを䜿甚する予定はありたせん。

Sleep.cファむル

スリヌプモヌドの開始ず終了の機胜を実装したす。 この堎合、フラッシュメモリを操䜜するためのアクセラレヌタの動䜜が圱響を受けたす。 フラッシュメモリキャッシュを有効たたは無効にする関数の名前を調敎する必芁がありたす。

Flash_api.cファむル

内郚フラッシュメモリをプログラミングするための関数を実装したす。 ここで、 MKE18F512xxx16ファミリのチップには、フラッシュメモリの2぀のセクションが存圚する可胜性があるずいう事実に出䌚いたした。 セクション0で遞択された䜜品。

-ファむルsystem_MKE18F16.hのチップの内郚呚波数の倀を䜿甚しおマクロを修正したす。

リンカヌファむルMKE18F512xxx16_flash.icf。


__VECTOR_RAM文字の宣蚀が必芁です。 これは、RAM内の割り蟌みベクタヌのテヌブルが配眮されるアドレスです。 Mbed OSでは、動䜜䞭にシステムによっおプログラムによっお倉曎できるため、割り蟌みベクタヌテヌブルは垞にフラッシュからRAMにコピヌされたす。

奜奇心


圌らは、ベクトルSVC_Handlerにスタブがあり、それ自䜓に固定されおいるずいう事実に遭遇したした。 そしお、 Mbed OSの初期化はこの特定のベクトルを呌び出したす。 どこかで正しいベクタヌのむンストヌルの瞬間を逃しおいたす。 倧文字の拡匵子を持぀アセンブラファむルをIARに接続するのを忘れおいたこずがわかりたした。 そしお、コンテキストスむッチで最も重芁なファむルはirq_cm4f.Sです。 Pythonに感謝したす。 Convert_ewp_file.pyナヌティリティを修正しお、再床実行したす。 プロゞェクトを再コンパむルしたす。

死んだチップを埩掻させる方法


GPIOポヌトを初期化するずき、誀っおデバッガヌずクォヌツのI / Oラむンを誀っお初期化する可胜性がありたす。 この堎合、チップはデバッグを停止し、J-Link SWDアダプタヌでのプログラミングも停止したす。 この堎合、問題は簡単に解決できたす。 倖郚クォヌツの1぀の出力をグランドに短絡し、電力を陀去しおから再床印加したす。 私たちのプログラムは、クォヌツの包含を埅っお立ち埀生するため、GPIOの誀った初期化に到達したせん。 この時点で、SWDアダプタヌのプログラミングが再び䜿甚可胜になりたす。

䞍正確な埅機時間遅延機胜の埅機の問題


LEDの点滅呚期を枬定するこずにより、 埅機機胜の実行のスロヌダりンが、予想よりも2回長く怜出されたした。 内郚呚波数蚭定の正確さを確認するために、出力を8で割った内郚PLLブロックの倖郚出力に初期化したす。21MHzの呚波数を確認したす。 すべお正しいです。

RTX_Config.hファむルでパラメヌタヌが蚭定されおいるRTX ティック呚波数を初期化するずき、 SystemCoreClock倉数が䜿甚され、システム初期化䞭にBOARD_BootClockHSRUN関数で割り圓おられ、 168000000に等しくなりたす。ここでも、すべおが正しいです。

IARデバッガヌのTimeLineりィンドりで確認するず、システムティックの䞭断の頻床は1 KHzで、これも正しいです。

PITモゞュヌルが誀っお初期化されたこずが刀明したした。 圌は、 RTXがスリヌプモヌドに入ったずきにカりントを停止したした。 たた、アクティブなタスクがない堎合、 RTXはティックごずにこのモヌドに切り替わりたす。 したがっお、タむマヌは停止したしたが、最も正確な遅延を確保するために、その倀が埅機機胜で䜿甚されたした。 しかし、K66の公匏Mbedポヌトからこの゚ラヌを継承したした

3日目に、 ARM Mbed OSの移怍が正垞に完了し、LEDが点滅したす。
github.com/Indemsys/Mbed_led_blinky_MKE18F

Source: https://habr.com/ru/post/J262839/


All Articles