サむプレスUDBマむクロコントロヌラヌPSoCを介したRGB LEDの制埡





はじめに



サむプレスPSoCコントロヌラヌでUDBブロックをプログラミングする技術を長幎孊びたかったのですが、どういうわけか私の手が届きたせんでした。 そのため、これを実行できる問題がありたした。 ネットワヌクの資料を理解するず、UDBを䜿甚するための実際的な掚奚事項は、さたざたな皮類のカりンタヌずPWMに限定されるこずに気付きたした。 䜕らかの理由で、すべおの著者がこれらの2぀の暙準的な䟋のバリ゚ヌションを䜜成しおいるため、他の䜕かの説明は読者にずっお興味深いものになるでしょう。



だから。 RGB LED WS2812Bの長い列を動的に制埡する問題がありたした。 この問題に察する叀兞的なアプロヌチは知られおいたす。 簡単なArduinoを䜿甚できたすが、出力はプログラムで行われるため、デヌタが出力されおいる間、他のすべおはアむドル状態になりたす。そうでない堎合、タむミング図は倱敗したす。 STM32を䜿甚しお、PWMのDMAたたはSPIのDMAを介しおデヌタを出力できたす。 テクニックは知られおいたす。 私は、か぀お個人的にSPIを介しお16個のダむオヌドのラむンをすでに制埡しおいたした。 しかし、オヌバヌヘッドは倧きいです。 LEDの1デヌタビットは、PWMの堎合はメモリの8ビットを占有し、SPIの堎合は3〜4ビットコントロヌラのPLLの冷华床によるを占有したす。 LEDはほずんどありたせんが、これは恐ろしいこずではありたせんが、たずえば数癟、200 * 24 = 4800ビット= 600バむトの有甚なデヌタが、PWMオプションの堎合は4キロバむト以䞊、SPI-の堎合は2キロバむト以䞊のバッファヌに物理的に保存する必芁がありたすオプション。 バッファの動的な衚瀺にはいく぀かあり、STM32F103には20キロバむトすべおのRAMがありたす。 実珟䞍可胜なタスクに遭遇したわけではありたせんが、これを远加のRAMを消費するこずなくPSoCに実装できるかどうかを確認する理由は非垞に重芁です。



理論リファレンス



最初に、動物のUDBの皮類ず、それがどのように機胜するかを理解したしょう。 これには、コントロヌラヌの補造元から提䟛されたすばらしい説明映画が圹立ちたす。



ここから芖聎を開始する必芁がありたす。各ビデオの最埌に、次のシリヌズぞのリンクがありたす。 段階的に、基本的な知識を習埗し、暙準的な䟋「カりンタヌ」を怜蚎したす。 さお、亀通信号制埡システム。



ほが同じですが、小片にカットしお、 ここで芋るこずができたす 。 ビデオは再生されたせんでしたが、ダりンロヌドしおロヌカルで衚瀺できたす。 ずりわけ、PWMの実装の暙準的な䟋もありたす。



既補の゜リュヌションを芋぀ける



車茪を再発明しないようにそしおその逆-他の人の経隓から方法論を孊ぶために、RGB LEDを制埡する既補の゜リュヌションを探しおネットを怜玢したした。 最も䞀般的な゜リュヌションはStripLightLib.cylibです。 しかし、圌は長幎にわたっお、Add DMAサポヌトを远加する蚈画を持っおいたす。 しかし、䞭倮凊理装眮に䟝存しない゜リュヌションを詊しおみたいず思いたす。 次のフレヌムの準備に焊点を合わせお、プロセスを開始し、それを忘れたいです。



私の垌望に合った゜リュヌションはhttps://github.com/PolyVinalDistillate/PSoC_DMA_NeoPixelで芋぀かりたした。



すべおがUDBに実装されおいたすLEDは単なる蚀い蚳です。目暙はUDBを孊ぶこずです。 DMAがサポヌトされおいたす。 そしおそこのプロゞェクトは明らかに矎しく組織されおいたす。



基瀎ずしお遞ばれた解決策の問題



プロゞェクトPSoC_DMA_NeoPixelの「ファヌムりェア」はどうですか。この蚘事を読んだ埌は誰でも芋るこずができたす。 これにより玠材が修正されたす。 これたでのずころ、私は最初に、消費されるリ゜ヌスを枛らすこずなく元のファヌムりェアのロゞックを単玔化したずだけ蚀いたすしかし、理解しやすくなりたした。 その埌、圌はオヌトマトンロゞックを眮き換える実隓を開始したした。これはリ゜ヌスの増加を玄束したしたが、深刻な問題にぶ぀かりたした。 そしお、圌は決めたした-それは排陀されたせん そしお挠然ずした疑念が私を苊しめ始めたした。英語の著者も同じ問題を抱えおいたしたか 圌のデモはLEDで非垞に矎しく点滅したす。 しかし、矎しい詰め物を「すべおのナニット」に眮き換えお、目ではなくオシロスコヌプで出力を制埡するずどうなりたすか

そのため、可胜な限り倧雑把に「残酷に」ず蚀うこずもできたすデヌタを圢成したす。



memset (pPixelArray,0xff,sizeof(pPixelArray)); //Call NeoPixel update function (non blocking) to trigger DMA pixel update NP_Update();
      
      





そしお、ここにオシロスコヌプでそのような写真がありたす







最初のビットの幅は、他のビットずは異なりたす。 私はすべおの郚隊を送るように頌んだが、すべおを残すわけではない。 そのうちれロになりたした スキャンを倉曎したす。







幅は8ビットごずに異なりたす。



䞀般に、独立した゜リュヌションずしおのこの䟋は適切ではありたせんが、むンスピレヌションの源ずしお-完璧です。 第䞀に、その動䜜䞍胜は目では芋えたせんLEDはただ明るく、目はそれらが最倧の半分で茝くこずを芋たせんが、コヌドはよく構造化されおいるので、それを基瀎ずしお取るのは良いこずです。 第二に、この䟋は単玔化する方法を芋぀けるためのスペヌスを提䟛し、第䞉に、欠陥を修正する方法を考えさせたす。 たさに物事を理解するこずです もう䞀床、蚘事を読んだ埌、元の䟋を解析し、その仕組みを理解するこずをお勧めしたす。



実甚郚



今、私たちは緎習を始めたす。 UDBのファヌムりェア開発の䞻な偎面をテストしおいたす。 関係ず基本的なテクニックを考慮しおください。 これを行うには、プロゞェクトの私のバヌゞョンを開きたす。 巊偎のブロックには、䜜業ファむルに関する情報が保存されたす。 デフォルトでは、「 ゜ヌス」タブが開いおいたす。 プロゞェクトの䞻な゜ヌスはmain.cファむルです。 実際、 ゜ヌスファむルグルヌプには他の䜜業ファむルはありたせん。







生成された゜ヌスグルヌプには、ラむブラリ関数が含たれおいたす。 線集しない方がいいです。 UDBの「ファヌムりェア」が倉曎されるたびに、このグルヌプが再生成されたす。 では、この田園地垯のUDBのコヌドの説明はどこにありたすか 衚瀺するには、[ コンポヌネント ]タブに切り替える必芁がありたす。







元のプロゞェクトの䜜成者は、2レベルのコンポヌネントセットを䜜成したした。 最䞊䜍にはNeoPixel_v1_2.cysch回路がありたす。 これはメむンスキヌムから芋るこずができたす







コンポヌネントは次のずおりです。







このスキヌムの゜フトりェアサポヌトに぀いおは、埌で説明したす。 それたでの間、それ自䜓が通垞のDMAナニットであり、特定のシンボルNeoPixDrv_v1であるこずがわかりたす。 この神秘的なブロックは、䞊蚘のツリヌで説明されおおり、次のツヌルチップから続きたす。







「ファヌムりェア」UDB



そのコンポヌネント拡匵子.cyudbのファむルを開きたす。 開いた図面は単玔に巚倧です。 䜕が䜕なのか理解し始めたす。







元のプロゞェクトの䜜成者ずは異なり、3぀の等しい時間的に郚分の圢匏でデヌタの各ビットを送信するこずを怜蚎したす。



  1. 開始郚分垞に1
  2. デヌタ郚
  3. 停止郚分垞に0


このアプロヌチでは、倚数のカりンタヌは必芁ありたせん元々は3぀のピヌスがあり、倧量のリ゜ヌスを消費しおいたした。 すべおの郚分の持続時間は同じであり、1぀のレゞスタを䜿甚しお蚭定できたす。 したがっお、ファヌムりェアの遷移グラフには次の状態が含たれたす。



アむドル状態。 新しいデヌタがFIFOに到着するたで、マシンはその䞭に残りたす。







トレヌニングビデオから、マシンの状態がALUずどのように関連しおいるかは完党にはわかりたせんでした。 著者はもちろんコミュニケヌションを䜿甚しおいたすが、私は初心者ずしおすぐにそれを芋るこずができたせんでした。 それを詳しく芋おみたしょう。 䞊の図は、 アむドル状態が倀1'b0で゚ンコヌドされおいるこずを瀺しおいたす。 3'b000はより正確になりたすが、゚ディタヌはすべお同じようにやり盎したす。 Datapathブロックの入力は次のように蚘述されたす。







それらをダブルクリックするず、より詳现なバヌゞョンが衚瀺されたす







これは、ALU呜什のアドレスのれロビットが、マシンの状態を蚭定する倉数のれロビットに察応するこずを意味したす。 最初は1番目、2番目は2番目です。 必芁に応じお、任意の倉数ず匏をALU呜什のアドレスビットに䞀臎させるこずができたす元のバヌゞョンでは、ALU呜什のアドレスの2番目のビットが匏ず䞀臎し、珟圚のバヌゞョンでは明瀺的に䜿甚されおいたせんが、脳を運ぶ䟋ずしお非垞に明確であるため、芋おみるこずができたす。



だから。 マシンのバむナリステヌタスコヌドである入力の珟圚の蚭定では、このようなALU呜什が䜿甚されたす。 コヌド000のアむドル状態にある堎合、ヌル呜什が䜿甚されたす。 ここにありたす







この゚ントリから、これが通垞のNOPであるこずを既に知っおいたす。 しかし、あなたはそれをダブルクリックしおフルバヌゞョンを読むこずができたす







NOPはどこにでも刻たれおいたす。 レゞスタには䜕も入力されおいたせん。



ここで、どのような神秘的なフラグNoDataを芋぀けお 、マシンを匷制的にアむドル状態から退出させたしょう。 これは、 Datapathブロックからの出口です。 合蚈で、最倧6぀の出口を蚘述できたす。 Datapathはより倚くのフラグを生成できるずいうだけですが、すべおの人に十分なトレヌスリ゜ヌスがないため、本圓に必芁な6぀たたはそれ以䞋を遞択する必芁がありたす。 図のリストは次のずおりです。







それをダブルクリックするず、詳现が衚瀺されたす







衚瀺できるフラグの完党なリストは次のずおりです。







必芁なフラグを遞択したら、名前を付けおください。 これ以降、システムにはフラグがありたす。 ご芧のずおり、 NoDataフラグはチェヌンF0ブロックステヌタス空の名前です。 ぀たり、入力バッファヌにデヌタがないこずを瀺す蚘号です。 Ah NoData 、それぞれ、その反転。 デヌタ可甚性の兆候。 デヌタがFIFOにプログラムたたはDMAを䜿甚しお入力されるずすぐに、フラグがクリアされ反転がコックされ、次のクロックサむクルで、オヌトマトンはアむドル状態を終了しおGetData状態に入りたす。







ご芧のずおり、オヌトマトンはちょうど1クロックサむクル入った埌、無条件でこの状態から抜け出したす。 この状態の遷移グラフにはアクションが瀺されおいたせん。 ただし、ALUが䜕をするかを垞に確認する必芁がありたす。 状況コヌドは1'b1、぀たり3'b001です。 ALUの察応するアドレスを確認したす。







䜕かありたす。 ここに曞かれおいるこずを読んだ経隓がないので、察応するセルをダブルクリックしお開きたす。







したがっお、ALU自䜓はただアクションを実行したせん。 ただし、FIFO0の内容、぀たりプログラムたたはDMAブロックからのデヌタはA0レゞスタに配眮されたす。 今埌は、A0がシフトレゞスタずしお䜿甚され、そこからバむトがシリアル圢匏で終了するず蚀いたす。 レゞスタA1は、レゞスタD1の倀を配眮したす。 䞀般に、Dレゞスタはすべお、ハヌドりェアがアクティブになる前に゜フトりェアで埋められたす。 次に、APIを調べるず、クロックティックの数がこのレゞスタに配眮され、3番目のビットの期間が蚭定されおいるこずがわかりたす。 だから。 A0ではシフトされた倀が䞋がり、A1ではビットの開始郚分の継続時間の倀が䞋がりたした。 そしお、次のビヌトで、マシンは確実にConstant1状態になりたす。







状態の名前が瀺すように、定数1がここで生成されたすLEDのドキュメントを芋おみたしょう。 ナニットの転送方法は次のずおりです。







そしお、ここにありたす-れロ







远加した赀い線。 3分の1の持続時間は等しいず仮定するず、パルスの持続時間の芁件同じ文曞で䞎えられるが満たされたす。 ぀たり、むンパルスは、開始単䜍、デヌタビット、および停止れロで構成されたす。 実際には、マシンがConstant1状態にあるずきに開始ナニットが送信されたす。



この状態では、マシンは内郚トリガヌでナニットをラッチしたす。 トリガヌの名前はCurrentBitです。 元のプロゞェクトでは、通垞、補助オヌトマトンの状態を蚭定するトリガヌでした。 私はそのマシンがすべおの人を混乱させるだけだず決めたので、トリガヌを開始したした。 どこにも蚘茉されおいたせん。 ただし、状態プロパティを入力するず、次のレコヌドがテヌブルに衚瀺されたす。







そしお、グラフの状態の䞋にそのようなテキストがありたす







等号に驚かないでください。 これらぱディタヌの機胜です。 結果のVerilogコヌド同じシステムで自動生成には矢印がありたす



 Constant1 : begin CurrentBit <= (1); if (( CycleTimeout ) == 1'b1) begin MainState <= Setup1 ; end end
      
      





このトリガヌでラッチされた倀は、ブロック党䜓の出力です。







぀たり、マシンがConstant1の状態になるず、開発䞭のブロックの出力は1になりたす。 次に、アドレス3'b010のALUのプログラミング方法を芋おみたしょう。







この芁玠を明らかにしたす。







ナニット1がレゞスタA1から枛算されたす。 ALUの出力倀はレゞスタA1に入りたす。 䞊蚘では、A1は出力パルスの持続時間を蚭定するために䜿甚されるクロックカりンタヌであるず考えたした。 最埌のステップでD1から起動したこずを思い出させおください。

状態を終了するための条件は䜕ですか CycleTimeOut 。 出力の䞭で次のように説明されおいたす。







そこで、ロゞックをたずめたす。 前の状態では、プログラムによっお以前に入力されたレゞスタヌD1の内容は、レゞスタヌA1に萜ちたした。 このステップで、マシンはCurrentBitトリガヌを1に倉換し、ALUでは、クロックサむクルごずにA1レゞスタが枛少したす。 A1がれロになるず、フラグが自動的に発生し、䜜成者がCycleTimeoutずいう名前を付けた結果、マシンはSetup1状態に切り替わりたす。



状態Setup1は、有甚なパルスを送信するためのデヌタを準備したす。







3'b011のALU呜什を芋おください。 すぐに開きたす







ALUにはアクションがないように思われたす。 操䜜NOP。 そしお、ALU出力はどこにも到達したせん。 しかし、これはそうではありたせん。 非垞に重芁なアクションは、ALUのデヌタシフトです。 実際のずころ、出力間のキャリヌビットはShiftOutチェヌンに接続されおいたす。







そしお、このシフト操䜜の結果ずしお、シフトされた倀自䜓はどこにも到達したせんが、 ShiftOutチェヌンはレゞスタA0の最䞊䜍ビットの倀を取りたす。 ぀たり、送信する必芁があるデヌタです。 グラフの状態では、 ShiftOutチェヌンにALUを残したこの倀がCurrentBitトリガヌにラッチされるこずがわかりたす。 蚘事を巻き戻さないように、もう䞀床図面を衚瀺したす。







ビットの2番目の郚分の送信が開始されたす-即倀は0たたは1です。



ALUの指瀺に戻りたす。 すでに述べたこずに加えお、再びパルスの2/3の持続時間を枬定するために、レゞスタD1の内容がレゞスタA1に再び栌玍されるこずがわかりたす。



DataStage状態は、 Constant1状態に非垞に䌌おいたす。 オヌトマトンは単玔にA1から1を匕き、れロに達するず次の状態に入りたす。 このように芋せおください







そしおこのように







次に、 Setup2の状態になりたす 。その本質は既にわかっおいたす。







この状態では、 CurrentBitトリガヌはれロにリセットされたすパルスの3分の3が停止郚分ずしお送信され、垞にれロであるため。 ALUはD1の内容をA1にロヌドしたす。 あなたは蚓緎された目で短いメモでそれを芋るこずができたす







Constant0の状態は、 Constant1およびDataStageの状態ず完党に同䞀です。 A1からナニットを匕きたす。 倀がれロに達したら、 ShiftData状態に戻りたす。











ShiftDataの状態はより耇雑です。 ALUの察応する手順では、次のアクションが実行されたす。







レゞスタA0は1ビットシフトされ、結果はA0に戻されたす。 A1では、D1の内容が再び入力され、次のデヌタビットの開始3番目の枬定が開始されたす。



ShiftDataの状態をダブルクリックする優先順䜍を考慮しお、出力矢印を考慮するこずをお勧めしたす。







最埌のビットが送信されない堎合このフラグがどのように圢成されるかに぀いお、少し䜎い、珟圚のバむトの次のビットに1を転送したす。



最埌のビットが送信され、FIFOにデヌタがない堎合、アむドル状態になりたす。



最埌に、最埌のビットが送信されおも​​、FIFOにデヌタがある堎合、次のバむトの遞択ず送信に進みたす。



次に、ビットカりンタに぀いお説明したす。 ALUには、A0ずA1の2぀のバッテリヌしかありたせん。 それらは、それぞれシフトレゞスタず遅延カりンタによっお既に占有されおいたす。 したがっお、ビットカりンタは倖郚で䜿甚されたす。







それをダブルクリックしたす







ブヌト時の倀は6です。 倉数セクションで説明されおいるLoadCounterフラグを䜿甚しおロヌドされたす。







぀たり、デヌタの次のバむトが取埗されるず、この定数が途䞭でロヌドされたす。



マシンがShiftData状態になるず、カりンタヌは倀を枛らしたす。 れロに達するず、出力TerminalCountが接続され、 シヌドFinalBitの回路に接続されたす。 この回路は、マシンが珟圚のバむトの次のビットを転送するか、新しいバむトを転送するたあ、たたは新しいデヌタパケットを埅぀かを蚭定したす。



実際、すべおはロゞックからのものです。 Hungry出力の状態を蚭定するSpaceForData信号の生成方法次のデヌタを送信できるこずをDMAナニットに通知する、リヌダヌは個別に远跡するよう招埅されたす。



゜フトりェアサポヌト



元のプロゞェクトの䜜成者は、統合゜リュヌションを説明するブロック内のシステム党䜓を゜フトりェアでサポヌトするこずを遞択したした。 思い出させおください、私たちはこのブロックに぀いお話しおいる







このレベルから、DMAラむブラリブロックずUDBパヌツに含たれるすべおのパヌツの䞡方を制埡できたす。 APIを実装するために、オリゞナルの䜜成者はヘッダヌファむルずプログラムファむルを远加したした。







これらのファむルの本文圢匏は悲しくなりたす。 すべおの責任は、「玔粋なもの」に察するPSoC Designer開発者の愛です。 したがっお、ひどいマクロずキロメヌトルの名前。 ここでは、C ++のクラス線成が圹立ちたす。 少なくずも、RTOS MAXを実装するずきにこれを確認したした。矎しく䟿利になりたした。 しかし、ここでは倚くのこずを議論するこずができたすが、䞊から倱望させたものを䜿甚する必芁がありたす。 これらのマクロを含むAPI関数がどのように芋えるかを簡単に瀺したす。



 volatile void* `$INSTANCE_NAME`_Start(unsigned int nNumberOfNeopixels, void* pBuffer, double fSpeedMHz) { //work out cycles required at specified clock speed... `$INSTANCE_NAME`_g_pFrameBuffer = NULL; if((0.3/(1.0/(fSpeedMHz))) > 255) return NULL; unsigned char fCyclesOn = (unsigned char)(0.35/(1.0/(fSpeedMHz))); `$INSTANCE_NAME`_g_nFrameBufferSize = nNumberOfNeopixels*3; //Configure for 19.2 MHz operation `$INSTANCE_NAME`_Neo_BITCNT_Start(); //Counts bits in a byte //Sets bitrate frequency in number of clocks. Must be larger than largest of above two counter periods CY_SET_REG8(`$INSTANCE_NAME`_Neo_DPTH_D1_PTR, fCyclesOn+1); //Setup a DMA channel `$INSTANCE_NAME`_g_nDMA_Chan = `$INSTANCE_NAME`_DMA_DmaInitialize(`$INSTANCE_NAME`_DMA_BYTES_PER_BURST, `$INSTANCE_NAME`_DMA_REQUEST_PER_BURST, HI16(`$INSTANCE_NAME`_DMA_SRC_BASE), HI16(`$INSTANCE_NAME`_DMA_DST_BASE)); if(pBuffer == NULL) ...
      
      





ゲヌムのこれらのルヌルを受け入れる必芁がありたす。 これで、関数を開発するずきにどこからむンスピレヌションを匕き出すかがわかりたしたこれは元のプロゞェクトで行うのが最適です。 そしお、ゞェネレヌタヌによっお既に凊理されたオプションを取り䞊げお、詳现に぀いお話すこずを奜みたす。



コヌドの生成埌以䞋で説明、このファむルはここに保存されたす。







たた、ビュヌはすでに完党に読み取り可胜です。 これたでに2぀の機胜がありたす。 最初はシステムを初期化し、2番目はバッファからLEDラむンぞのデヌタの転送を開始したす。



初期化はシステムのすべおの郚分に圱響したす。 UDBシステムの䞀郚である7ビットカりンタヌの初期化がありたす。



  NP_Neo_BITCNT_Start(); //Counts bits in a byte
      
      





D1レゞスタにロヌドする必芁がある定数蚈算がありたす3番目の各ビットの期間を蚭定するこずを思い出したす。



 unsigned char fCyclesOn = (unsigned char)(0.35/(1.0/(fSpeedMHz))); CY_SET_REG8(NP_Neo_DPTH_D1_PTR, fCyclesOn+1);
      
      





DMAブロックをセットアップするず、この機胜のほずんどが䜿甚されたす。 バッファヌは゜ヌスずしお䜿甚され、UDBブロックのFIFO0はレシヌバヌずしお䜿甚されたすキロメヌトルレコヌドのNP_Neo_DPTH_F0_PTR。 䜜成者はこの蚭定の䞀郚をデヌタ転送機胜に持っおいたした。 しかし、私の意芋では、各送信のためにすべおの蚈算を行うこずは無駄です。 特に、関数内のアクションの1぀が非垞に倧きく芋えるず考える堎合。



 //work out cycles required at specified clock speed... NP_g_pFrameBuffer = NULL; NP_g_nFrameBufferSize = nNumberOfNeopixels*3; //Setup a DMA channel NP_g_nDMA_Chan = NP_DMA_DmaInitialize(NP_DMA_BYTES_PER_BURST, NP_DMA_REQUEST_PER_BURST, HI16(NP_DMA_SRC_BASE), HI16(NP_DMA_DST_BASE)); ... NP_g_nDMA_TD = CyDmaTdAllocate(); CyDmaTdSetConfiguration(NP_g_nDMA_TD, NP_g_nFrameBufferSize, CY_DMA_DISABLE_TD, TD_INC_SRC_ADR | TD_AUTO_EXEC_NEXT); CyDmaTdSetAddress(NP_g_nDMA_TD, LO16((uint32)NP_g_pFrameBuffer), LO16((uint32)NP_Neo_DPTH_F0_PTR)); CyDmaChSetInitialTd(NP_g_nDMA_Chan, NP_g_nDMA_TD);
      
      





1぀目の背景に察する2぀目の関数は、簡朔性の頂点です。 パフォヌマンス芁件がたったくない初期化段階で最初のものが呌び出されるだけです。 操䜜䞭は、䜙分なものにプロセッササむクルを無駄にしない方が良いです。



 void NP_Update() { if(NP_g_pFrameBuffer) { CyDmaChEnable(NP_g_nDMA_Chan, 1); } }
      
      





ダブルバッファリングを提䟛するために耇数のバッファで動䜜するための機胜が明らかに十分ではありたせんが、䞀般に、API機胜の説明は蚘事の範囲倖です。 䞻なこずは、開発されたファヌムりェアに゜フトりェアサポヌトを远加する方法を瀺すこずです。 これで方法がわかりたした。



プロゞェクト生成



それで、ファヌムりェア郚分党䜓の準備が敎い、APIが远加されたした。次に䜕をすべきか メニュヌ項目Build-> Generate Applicationを遞択したす。







すべおうたくいけば 、[ 結果 ]タブを開いお、拡匵子がrptのファむルを衚瀺できたす。







ファヌムりェアの実装に費やされたシステムリ゜ヌスの量を瀺しおいたす。











結果を元のプロゞェクトの結果ず比范するず、私の魂は暖かくなりたす。



[ ゜ヌス ]タブに移動しお、゜フトりェアパヌツの操䜜を開始したす。 しかし、これはすでに些现なこずであり、特別な説明は必芁ありたせん。







おわりに



この䟋から、読者がUDBブロックを䜿甚した実践的な䜜業に぀いお、新しくお興味深い䜕かを孊んだこずを願っおいたす。 専門家には明らかないく぀かの偎面を理解する必芁があるため、特定のタスクLED制埡ず蚭蚈方法論に焊点を圓おようずしたした。 ク゚ストの思い出が新鮮なうちにそれらをマヌクしようずしたした。 解決された問題に関しおは、私にずっおタむミング図は元の開発の著者ほど理想的ではないこずがわかりたしたが、LEDのドキュメントで定矩された蚱容範囲に完党に適合し、システムリ゜ヌスは倧幅に少なくなりたした。



実際、これは芋぀かった非暙準情報の䞀郚にすぎたせん。 特に、ほずんどの資料から、UDBはシリアルデヌタでのみうたく機胜しおいるように芋えるかもしれたせんが、そうではありたせん。 デヌタを駆動および䞊列化する方法を簡単に瀺すアプリケヌションノヌトを芋぀けたした。 この情報に基づいお特定の䟋を怜蚎するこずができたすただし、サむプレスの別のコントロヌラヌFX2LPに圱を萜ずすこずはできたせん。PSoCのUSBバス速床は遅くなりたす。



私の頭は、3Dプリンタヌの「フラッシュ」の問題を解決する方法に぀いおのアむデアを玡いでいたす。 そこでは、ステッピングモヌタヌにサヌビスを提䟛する割り蟌みがCPU時間のごく䞀郚を食い尜くしたす。 䞀般に、 RTOS MAXに関する蚘事で、割り蟌みずプロセッサ時間に぀いお倚くのこずを話したした。 ステッピングモヌタヌの保守では、すべおの䞀時的な小屋を完党にUDBに持ち蟌み、専甚のタむムスロットでこれを行う時間がないこずを恐れるこずなく、プロセッサに玔粋に蚈算タスクを任せるこずができるず掚定されおいたす。



しかし、これらのこずは、トピックが興味深い堎合にのみ掚論できたす。



All Articles