暙準ラむブラリの質問に

この話はなぞなぞから始めたす。

アリスでさえほずんど答えたせん、

その埌のおずぎ話の残り、

蚀われた埌



この゚ッセむはさたざたなトピックに専念したすが、その䞭にはサブタむトルで提起された質問に察する堎所ず答えがあり、物語は䞻に珟代のMKの呚蟺の初期化に関連する問題を䞭心に展開したす。

そのため、MKのハヌドりェアのセットアップに関連する䞻な問題の抂芁を説明したす。倚数のパラメヌタヌを蚭定する必芁があり、そのほずんどはそれぞれの堎合に指定されたせんが、それでもなお、任意に蚭定するこずはできたせんが、事前に定矩された倀を取る必芁がありたす。 このような単玔な問題の声明が意識の流れを匕き起こし、あたり明確でない解決策に぀ながる可胜性があるず考えおいる堎合は、



錻が痛いむンタヌフェヌス、すなわちIRPSラゞアルシリアルむンタヌフェヌス-圌女は珟圚UARTキャラクタヌずしお登堎したのはこの名前でしたのセットアップに関連する䟋を芋おみたしょう。 私は、ロシア語の略語が道路䞊に郚分的にメモを曞くずいう事実である理由にすぐに答えたす。私は個人的に、キヌボヌドレむアりトの切り替えをAndroidキヌボヌドの䟿利な郚分ずは呌びたせん個人的には、そうでなければ画面を突くのはずおも䞍䟿です。

もちろん、提起された問題の範囲はIRPSに限定されるものではなく、他のMK機噚を構成する必芁がありたすが、䟋ずしお取り䞊げたした。 そのため、IRPSの動䜜を蚭定するには、少なくずも送信フォヌマットを蚭定する必芁がありたす。送信フォヌマットは、次のパラメヌタヌによっお決定されたす-送信速床、送信デヌタビット数、パリティビットの存圚ずタむプ、ストップビット数。 そしお、これはほんの始たりに過ぎず、実際には拡匵構成もあり、はるかに長くなりたすが、今ではそれに぀いおではありたせん。 たた、IRPSを䜿甚する堎合、ケヌスの70で暙準構成9600-8-0-1が蚭定され、別の25で䌝送速床のみが倉曎され、他のすべおの構成は残りの5を共有するが、そのために存圚する必芁があるこずも考慮する必芁がありたすカスタマむズする機胜。



この問題を解決するためのさたざたなオプションを怜蚎する前に、特定のオプションの成功を評䟡するための基準を決定する必芁がありたす。そうしないず、より適切なオプションの遞択が奜みの議論に倉わりたす。 私の投皿では、以䞋の状況が決定するこずを考慮しおいるため、䞻に信頌性基準から進みたす。1.間違いを犯すのは人間の性質です。2.コンパむラのタスクは、これらの゚ラヌをできるだけ早く指摘し、理想的にはその倖芳。 䞊蚘の2぀の仮説の少なくずも1぀に同意しない堎合、おそらくこの蚘事はあたり奜きではないので、このレッスンは犁止されおいたせんが、これらの立堎から、私は1぀たたは別の解決策の受容性を怜蚎したすコメントであなたの立堎を継続し、必然的に合理的に述べる



そもそも、前䞖代のMKPIC、AVR、51では、察応するレゞスタヌに盎接録音するこずで機噚を構成するずいう玠晎らしい仕事をしたため、このような問題が発生した理由を理解できたすか たあ、たず第䞀に、あなたは登録を知る必芁がありたす、たたは、今日それを眮くこずが慣習であるので、マニュアルを吞っおください、そしお私には個人的にこのレッスンは特に面倒ではないようですが、特に珟圚のマニュアルの品質を考慮しお、重芁な郚分に぀いおコミュニティでは、このアプロヌチが本圓に問題になる可胜性がありたす。



最近のドキュメンテヌションの品質に぀いおの小さなメモ私は本圓にそう思いたした-草は以前より緑だったかもしれたせんが、最近のブログの1぀でゞャックハンスリヌのフレヌズに完党に同意したす。 「䞍十分」ずいう蚀葉が最も゜フトな定矩になりたすが、以前は存圚しないず定矩されおいたした。 もちろん、むンタヌネットは玠晎らしいものですそしお、ここには皮肉はありたせん、これは本圓に新しい䞖界の奇跡です。開発者ずフォヌラムの䞡方で、あいたいな堎所で質問をするこずができ、倚くの答えを埗るこずができたす。 、しかし䞍䞀臎の䜙地を残さないような方法でドキュメントを曞いおみたせんか 圌らは通垞、開発者は良いドキュメントを曞くために関䞎する必芁があり、圌らの時間は貎重であり、テクニカルラむタヌはタスクに察凊できないず答えたすが、私の意芋では、これは私の問題ではありたせん。



デバむスの開発者はあたりにも自明であるず信じおいるため、開発者に自明なこずは垞により正確には、垞にではなくナヌザヌには自明ではないため、ドキュメントの執筆を倖郚委蚗するこずをお勧めしたすが、デバむスを䜿甚するデバむス開発者にはお勧めです。 この皮のサヌビスを提䟛するオフィスを䜜成するこずもできたすが、補造業者の文曞に察する態床を考えるず、こうした高䟡で䞍芁なサヌビスを䜿甚する可胜性は䜎いでしょう。



ドキュメントのトピックに関する若干の回想。 私は最近、単䞀チップの説明を調べたしたちなみにIntelによる。PE_RST_Nずいう名前の入力がありたす。これは、+ 3.3Vdc入力ずしお蚘述され、アサヌトされるず、電力ずクロック呚波数の存圚を通知したす。 入力がどのように正確に蚘述されおいるか-高たたは䜎は瀺されおいたせん、この信号の時間図はありたせんただし、時間図にはPERST信号があり、デバむス状態図では同じ名前で瀺されおいたす倀0bはリセットのアクティビティを瀺したす。リセットが存圚する堎合の動䜜モヌドの衚では、列の倀にチェックマヌクがあり、ヒントのようになっおいたす。 䞀般に、間接的な兆候の党䜓に基づいお、デバむスのリセットに぀ながるこのレッグのアクティブレベルはむ゚ス、ロヌであるず結論付けるこずができたすが、ドキュメントの察応する明確で簡朔で理解可胜な説明を読むだけでなく、なぜ掚枬する必芁がありたすか

なぜ私は掚枬ず掚枬の䞍安定な地に入るこずを䜙儀なくされるのですか おそらく個人的には、これは過去の人生における悪いカルマに察する眰です私もこの人の倩䜿ではありたせんでしたが、他の開発者は䜕をしたしたか 私の同僚の䞀人は、このような文曞化は膝から立ち䞊がるのを困難にするために特別に行われおいるずいう興味深い仮説を衚明したしたが、なぜそれが英語で曞かれおいるのですか それずも私たちのために特別に䜜られたものですが、西掋では実際の正しい文曞を䜿甚しおいたすか この堎合、「単玔な怠inessによっお説明できるこずを悪意を持っお説明するべきではない」ずいうフレヌズは完党に圓​​おはたりたすそのようなドキュメントの䜜成者を逐語的な匕甚で怒らせたせん。



しかし、私の個人的なコレクションの本圓の傑䜜は、プルアップ抵抗噚接続の接続制埡が次のように蚘述されおいる文曞で、䞀般的には囜内䌁業によっお補造された悪くないMKの説明です「0-プルアップ抵抗噚のドロップアりト」、1 ...そこに曞かれおいたすか -「プルアップ抵抗噚は脱萜したせん」-良い詊みですが、掚枬したせんでした...スタゞオでのドラムロヌル...「倀は0の反察です」。 みんな拍手、カヌテン。



しかし、䞊蚘のすべお誰かがすでに忘れおいる堎合、ドキュメントの重芁でない品質に぀いお話しおいるは、問題の䞀郚であり、その2番目のコンポヌネント

珟代のMKは前任者よりも本圓に耇雑であるずいう事実にありたす。 ハヌドりェアがより耇雑になり、「開発者の増え続けるニヌズをたすたす完党に満たす」がこの珟象の理由のリストの最初に来ない理由に぀いお、私自身のポむントがありたすが、党䜓的な私の考えは䞀般的に状況を倉えたせん-珟代のMKは本圓に耇雑ですその前任者のうち、ハヌドりェアブロックがはるかに倚く、ブロック自䜓がより耇雑になり、開発者がビゞネスに䜿甚できるおよび䜿甚する必芁がある远加の機胜を実装しおいたす。 START UARTファミリのいく぀かの機胜本圓に圹立぀のトピックに関する投皿を考えたした。これを終えたら、これらの機胜の䜿甚を実装するずきだけ、この投皿に呜を吹き蟌んだ問題に぀いお考えたした。



問題の次の郚分は、さたざたなメヌカヌのMKファミリず1぀のメヌカヌの同じシリヌズ内のMK亜皮の䞡方の呜名法の増加に関連しおおり、1぀の亜皮内のかなり倚様なデバむスで終わりたす。 呜名法の拡倧ず同時に、家族の特定の代衚者のラむフサむクルが短瞮され、新しいデバむスぞの氞続的な移行の問題が生じたす。 繰り返したすが、これは垞に必芁ずいうわけではありたせんが、それに察凊するこずは非垞に難しいので、別のMKぞの切り替えができるだけ痛みがなく、理想的には1行を眮き換えるように゜フトりェアを開発するこずをお勧めしたす
#define device xxxxx
      
      



もちろん、これは暙準ラむブラリを䜿甚するこずで容易になりたす。そのため、私はこの投皿を正しい私の芳点からは、別のこずも知っおいたすに぀いお曞いおいたす。



IRPS蚭定を実装するための可胜なオプションの怜蚎を開始し、それらの最初のものは、すべおの可胜なパラメヌタを持぀単玔な初期化関数になりたすここでは、しばらくの間、アルゎリズムプログラミング蚀語であるANPにサンプルテキストを曞く誘惑に苊しみたしたが、それはすでに囜境の反察偎にあるず決定したした、善から悪を分離し、いじめから簡単にトロヌリングを行いたす。 そしお、次のようなものが埗られたす
 UARTInit(9600,8,0,1);
      
      



前述の暙準的なケヌスの堎合以䞋、MKに存圚する機噚の1぀の調敎可胜なチャネルを遞択するずいう質問は、括匧から陀倖したす。 ここではすべおが順調で、超自然的なこずを曞く必芁はありたせんが、このオプションの欠点を芋぀け、もちろん、他の理由で欠点を排陀しようずしたす。



たず最初に、ハヌドりェアのセットアップ手順で䞀般的に必芁なものず、それに蚭定する芁件を決定する必芁がありたす。 私の意芋では、プログラムは䞻に信頌でき、安党で、理解できるものでなければなりたせん。 初期化は原則ずしお䞀床実行され、あたり速くないため、効率芁件はそれほど重芁ではありたせんが、メモリがコンパクトで速床が芁求されない堎合、これは評䟡の远加プラスです。 ずころで、少なくずも1぀の技術、぀たりCharliplekingでは、MKレッグの動䜜モヌドを倉曎する必芁があるため、速床をたったく無芖しないでください。



このテクノロゞヌで芋られる欠点そしお、それ以倖の堎合はさらに詳しく説明したす-たず、倚数のパラメヌタヌを厳密に定矩された順序でリストする必芁があり、どこかで間違いを犯した堎合、結果は埗られたせん期埅しおいたもの。 各パラメヌタヌにカスタムデヌタ型を定矩するず、パラメヌタヌの順序に関する問題は倚少緩和され、次のようになりたす。
 typedef enum {
UARTSpeed9600
} UARTSpeedT; void UARTInit(UARTSpeesT UartSpeed,
};
      
      



、ミスをしようずするず、コンパむラから譊告が衚瀺されたす。 このアプロヌチは、実行段階ずコンパむル段階で少しも費甚がかかりたせん。そのため、私はそれを匷くお勧めするず同時に、著者独自のラむブラリを含むがこのような単玔か぀同時に効果的な方法で無芖されおいるずいう苊痛な戞惑いを衚珟できたす。



圌らの唯䞀の正圓化は、盎感的な皮肉だったマゞックナンバヌ9600ずは察照的に、蚘憶する必芁がある衚珟を䜿甚する必芁があるかもしれたせん。 別の方法は、関数に入るずきの倚数のアサヌションで、コンパむラヌのパラメヌタヌの正確性をチェックしたす。 原則ずしお、このアプロヌチはそれほど悪くはありたせん小さな魚でも倧きなゎキブリよりも優れおいたすが、デバッグをリリヌスし、゚ラヌメッセヌゞを実行ステヌゞに転送する必芁がありたす。



ただし、パラメヌタヌの順序の芁件を少し滑らかにするず違反しようずするずscられるようになりたす、それでもすべおのパラメヌタヌをリストする必芁があり、面倒です。 高床な蚀語で䜜業する堎合、デフォルトのパラメヌタヌ倀がありたすが、叀兞的なCのフレヌムワヌク内にずどたる堎合そしお、前に譊告しない限り、それらに留たる堎合、この方法は私たちには適しおいたせん。 さらに、このメ゜ッドには非垞に倧きな制限がありたす。぀たり、すべおのデフォルトパラメヌタは定矩されたパラメヌタに埓う必芁があるため、リストの最埌のパラメヌタを明瀺的に蚭定するには、以前のパラメヌタをすべお指定する必芁がありたす。



C ++などの高床な蚀語で再び䜜業する堎合、もう1぀の方法がありたす-割り圓お挔算子をオヌバヌロヌドしたすが、4 + 4 * 3 + 4 + 1 = 21割り圓お関数をハヌド匕数の順序ず、任意の順序のさらに想像できない数の割り圓お関数。 それにもかかわらず、そのような可胜性が存圚し、良識の芏則はそれを蚀及するこずを必芁ずしたすが、圌らはそれを䜿甚するこずを矩務付けおいたせん。



マクロ蚀語機胜を実際に提䟛する優れたプリプロセッサがあれば、可倉数の型付き匕数を䜿甚しおマクロ関数呌び出しを蚘述し、プリプロセッサによっお生成された関数呌び出しを取埗できたすが、それはありたせんたあ、Cには優れたプリプロセッサがありたせん 、平均がありたせん。 この投皿の読者の1人がC蚀語の暙準プリプロセッサを本圓にマクロ蚀語であるず考えおいる堎合、DECマシンのアセンブリ蚀語マクロプロセッサの説明に粟通するこずを匷くお勧めしたす。そうすれば、この䞻題に぀いおさらに詳しく議論するこずが可胜になりたす。 しかし、この順序でのみであり、コヌド生成の他の開発された手段ずの知り合いを排陀したせん。 それにもかかわらず、そのようなアプロヌチは衚珟手段が限られおいるため利甚できないため、独自のプリプロセッサを䜜成するこずはありたせん。 この悲芳的な泚意事項に぀いおは、盎接パラメヌタヌ転送で初期化関数を䜿甚するオプションの説明を締めくくりたす。



別のオプションは、特定の制埡構造を䜿甚し、この構造のフィヌルドの倀を蚭定するプロセスデフォルトで蚭定されおいるものを含むを初期化プロセス自䜓から分離するこずです。 䜕が私たちにそのような分離を䞎えたすか たず第䞀に、デフォルト倀ずは異なるパラメヌタヌのみを倉曎する埅望の機䌚です。

もちろん、同時に、これらの倀を非垞によく想像しお芚えおおく必芁がありたすが、2コマンドコンパむラは達成䞍可胜な理想のたたです。 しかし、あなたはこの䞖界のすべおにお金を払わなければなりたせん、そしおそのような機䌚のために、私たちはこれらの非垞にデフォルト倀を保蚌する必芁性を支払わなければなりたせん、関数ぞの盎接呌び出しを䜿甚するずき、䜕らかの方法でコンパむラによっお保蚌されたした。



もちろん、デフォルト倀を蚭定するための関数を䜜成し、䜿甚する予定の制埡構造に察しおそれを呌び出す堎合、問題はありたせん。 そしお、これをするのを忘れたら 最良の堎合、期埅したものずは少し異なり、䞭皋床の深刻床の堎合、期埅したものがたったく埗られず、非垞に悪い堎合、機噚を損傷するほど倚くは埗られたせんが、最悪の堎合はすべお埗られたす䞊蚘の突然、぀たり、たれで繰り返しの少ない状況です。 これは、タスクが決しお決しおフェッチされないようにするためです。



繰り返したすが、C ++を䜿甚する堎合、コンストラクタは私たちの願望に察する自然な答えであり、スマヌトポむンタもねじ蟌むず、゜リュヌションは理想に近くなりたすが、これはサムラむの方法であるため、玔粋なCのフレヌムワヌクのたたですセグメンテヌション障害連続パス。



制埡構造の䜿甚に関連する1぀の問題、぀たり構造自䜓の圢匏ずそのコンポヌネントの倉曎方法に察する態床を決定したす。

たず第䞀に、私は個人的に、䞀般にラむブラリの内郚構造、特にこのラむブラリの制埡構造に関する情報をナヌザヌに提䟛するこずに反察するこずを宣蚀したす。 この振る舞いの逞脱の理由は、呪われた過去のため、OOPの原則からはほど遠いものであり、コンピュヌタヌが倧きい遠い時代に眮かれたため、名前テヌブルの倧小のRAMがコンパむルを本圓に遅くする可胜性がありたした。 したがっお、カプセル化ずむンタヌフェむスの抂念は、内郚抵抗なしで、コンパむル段階でメモリを節玄するこずずはたったく異なる理由で䜜成されたしたが、私は非垞に冷静に私の時代に受け入れたした。

ちなみに、VMKで教えられたコヌスに基づいお「数孊者のためのプログラミング」ずいう本をお勧めしたすか぀お、操䜜方法の芳点からこの甚語を䜿わずにOOPの原理を完党に説明しおいたす。



そしお、私の行動は逞脱であり、䞻流からの逞脱であるこずが、STMやTIを含む有名な゜フトりェアパッケヌゞの゜ヌスの調査によっお確認されおいたす。 理解できない考慮事項のため、これらのパッケヌゞの䜜成者は、ヘッダヌファむルの入れ子になった包含ず再包含に察する保護を䜿甚するこずによっお達成されるすべおに぀いおすべおを知っおおく必芁があるず考えおいたす。 ぀たり、突然IRPSモゞュヌルがUSBホスト制埡レゞスタ内のビットの分垃を芋぀けられない堎合、「苊しみ、衰匱し、さらには...死ぬ」こずになりたす。



提起されたトピックに関する小さな䜙談-hファむルでのincludeディレクティブの䜿甚は悪であるず本圓に考えたす。たた、ヘッダヌファむルの先頭に条件付きマクロを配眮しお、喫煙による害を枛らす方法のヒントずしお再包含を防ぐこずをお勧めしたす。 正しいシンプルな解決策-喫煙しない-は掚奚事項の䜜者によっお考慮されおいたせん。぀たり、゜フトりェアパッケヌゞのアヌキテクチャを怜蚎し、モゞュヌルの関係を決定し、その階局の平均を構築するこずを暗瀺しおいたす平均以䞊たたはよく知られおいる䌁業の補品に぀いお話しおいるプログラマヌ組み蟌みシステムは定矩䞊機胜しおいたせん。そのため、私たちは曲がった利き手による害を最小限に抑えるこずに぀いおのみ話すこずができたす。

これがどれほど真実かはわかりたせんが、個人的には、そのような埋め蟌みヘッダヌファむルには、䜜成者の優れた信頌性が高く䟿利なコヌドを曞く胜力に疑問を投げかけるものがありたす。 しかし、これは個人的な意芋であり、頻繁な䌚話で衚明され、圌らが蚀うように、「しかし、私はそれがそのように可胜であったこずを知りたせんでした」。



だから圌らはSTMずTI圌らが望むように、私は「あなたが知っおいるほど眠れない」、たたは別の蚀い回しで「あなたが知らないこずはあなたを心配させるこずはできない」ずいう原則を守り続けたす。 したがっお、ラむブラリのナヌザヌはその内郚構造に関するFIG情報をあきらめなかったず信じおいたすが、C内ではそれを提䟛する矩務がありたすそしおTurbo Pascalではナニットコンセプトでどれだけクヌルでしたが、実珟䞍可胜の倢は䜕ですか C ++には含たれないこず17。 だからどこかで

 Typedef struct { UARTSpeedT UARTSpeed; 
 } UARTConfigT;
      
      



そしおその倖芳は共産䞻矩劎働者の勝利ず同じくらい避けられない。 しかし、誰も私たちに泥沌ぞの道に沿っお別の䞀歩を螏み出し、スタむルで制埡情報の倀を蚭定するこずを匷制したせん
 UARTConfigT UARTConfig; UARTConfig.UARTSpeed=UARTSpeed9600;
      
      



ナヌザヌは私たちの特定の分野に党く興味がなく、必芁なこずが起こるずいう自信だけが必芁だからです。 したがっお、次のコヌドフラグメントに瀺すように、1぀たたは別のSET-teraの䜿甚が望たしいず思われ、別の関数たたはメンバヌ関数ずしおの実装は奜みの問題のたたです。
 void UARTSetSpeed(UARTConfigT *UARTConfig, UARTSpeedT UARTSpeed); UARTSetSpeed(&UartConfig, UARTSpeed9600);
      
      



関数の呜名スタむルがどれほど重いかおaび申し䞊げたすが、名前に20文字を远加するこずで30分間のデバッグを節玄できれば、勝ちたした。

このアプロヌチは、OOPの原則に埓うこずに加えお、実甚的な䟡倀がありたす-C ++を䜿甚する堎合ただし、䜿甚しない堎合、忘れないでください、1぀のオヌバヌロヌド関数を蚘述し、スタむルでさたざたなパラメヌタヌを蚭定するこずができたす
 void UARTSetParam(UARTConfigT *UARTConfig, UARTSpeedT UartSpeed); void UARTSetParam(UARTConfigT *UARTConfig, UARTParityT UartParity);
      
      



など、名前を蚘憶するために必芁な機胜の数を枛らすこずにより、ナヌザヌの脳ぞの負荷を枛らすこずができたす。

もちろん、「DarZaNeBy」Heinleinを倧切にしおいる人ぞの特別な挚拶ずセッタヌぞのアクセスには、フィヌルドに倀を盎接割り圓おるよりも、実行に時間がかかり、コヌドを保存するためにより倚くのメモリが必芁ですむンラむン関数の堎合、このステヌトメントず疑わしい、しかし、私の芳点から、利点は勝りたす。



もう1぀の興味深い偎面は、ナヌザヌがコントロヌル構造を必芁ずせず、それに぀いお圌が考えるこずは䜕でも知らないずいうこずです。そのため、ナヌザヌには芋えないようにするずよいでしょう。これにより、その䜿甚方法たたは匿名むンスタンスに特定の制限が課せられたすが、これに぀いおは埌で詳しく説明したす。



したがっお、個々のフィヌルドの倀を蚭定する方法では、明瀺的に指定されおいないフィヌルドの倀に関しお疑問が生じ、それに応じおデフォルトで蚭定されたす。 ここでは、2぀の偎面を区別する必芁がありたす。フィヌルドにゎミが存圚しないこずを保蚌するこずず、構造䜓の以前の䜿甚で残った倀です。 たた、初期化された倉数を䜿甚しお最初の倉数を凊理できる堎合、初期化関数の明瀺的か぀盎接的な呌び出しを行わない2番目の倉数は、デザむナヌ私たちにはないでも解決できたせん。



初期初期化に関しおは、これは制埡されおいるので原則ずしお正しく蚱容される構造の宣蚀点での盎接初期化、たたはそのれロ化を保蚌するグロヌバル倉数の領域に構造を配眮するかのいずれかであり、この方法は原則ずしお受け入れられないず考えおいたすそれは制埡䞍胜であり、デフォルト倀に倧きな制限を課しおいるため、それらは0に等しくなければなりたせん。いずれにしおも、再利甚の問題はそのような手法を解決したせん。 瀟䌚化は良いスタむルのデモンストレヌションずしおのみ芋るこずができたすが、解決策ずしおではありたせん。



スズメの逌に他のすべおを混ぜた埌、どのような解決策が受け入れられるず思いたすか この゜リュヌションは耇雑です。぀たり、デフォルト倀を提䟛するこずができ、パラメヌタヌを遞択的に倉曎するこずができたす。ナヌザヌ゚ラヌを排陀し、血䞭コレステロヌルを䞋げ、この包括的な゜リュヌションの兞型であるように、はるかに有甚で必芁なこずを行いたす。 そしお、その重芁な特性のもう1぀は、玔粋なCで蚘述されおいたす。぀たり、歊道道は損傷を受けたせんでした。



結局のずころ、日本の鋌の貧匱な性質ず、刃ぞの刃の叀兞的なフェンシングの䞍可胜性に぀いお話すこずができたすが、䞀撃で戊いを解決するこずは非垞に矎しいです。たず、鞘から刃を匕き抜き、血の滎を振り萜ずしお単䞀の動きで返すこずで終わりたす道路䞊の䞍運な盞手。 批評家に関しおは、最近、「Don Juanのむンポテンツによる批評は客芳的に公平になり埗るが、それでも䞍快な意味合いを持っおいる」ずいう玠晎らしいフレヌズを読みたした。

正盎なずころ、私はこの瞬間に投皿を停止し、読者を党く戞惑いず倱望に远い蟌みたいず思っおいたすが、それでもさらなるテストを行い、非垞に矎しく説明された解決策が厄介で䞍䟿であるこずが刀明したずいう事実から別の皮類の倱望を埗るこずができたす。



そこにありたす。
 UARTConfigT UARTConfigInit(void) { UARTConfigT UARTConfig; UARTConfig.UARTSpeed=UARTSpeed9600; return UARTConfig; };
      
      





したがっお、Cでは、配列を陀く任意の型を返すこずができ、配列を含む構造䜓を返すこずができたす。これには少し驚かされたすが、KerniganずRichieにはそのような解決策の理由があったようです。 しかし、悪いこずは起こり埗たせん。そのような解決策は絶察に信頌でき、蚀語暙準に準拠しおいたす。 しかし、これは初期化手順にすぎたせんが、重芁なパラメヌタヌのタスクをどのように実行したすか 䞭間倉数を䜿甚するオプションは、ナヌザヌの゚ラヌの䟋倖を保蚌せず、次のスタむルでカスケヌド䜿甚を䜜成するわけではないため、inりで华䞋されたす。
 UARTConfigT UARTConfigSpeed(UARTSpeedT UARTSpeed,UARTConfigT UARTConfig) { UARTConfig.UARTSpeed=UARTSpeed; return UARTConfig; };
      
      



パラメヌタヌを蚭定する順序に泚意しおみたしょう。このような゜リュヌションの利点は次のずおりです。
 UARTConfigSpeed(UARTSpeed4800,UARTConfigParity(UARTParityEven,UARTConfigInit()));
      
      





ここで、パラメヌタ倀は関数名の盎埌に続きたす。関数名は、次の匏に比べお芋やすくなっおいたす
 UARTConfigSpeed(UARTConfigParity(UARTConfigInit(),UARTParityEven),UARTSpeed4800));
      
      





実際、TurboVisionでプログラミングした人は、最埌にたくさんの閉じ括匧があるこの忘れられないスタむルを認識しおいたしたが、1行の匏を䜜成する必芁はなく、代替案はすでに悪倢のように芋えたす
 UARTConfigSpeed(UARTSpeed4800, UARTConfigParity(UARTParityEven, UARTConfigInit() ) );
      
      



しかし、これはすでに奜みの問題であり、定矩によっお議論するこずはできたせん-味は議論されおいたせん。



このオプションの利点-制埡構造の初期化をスキップする可胜性を排陀し、ナヌザヌがこの構造に粟通しおいないこずを排陀したす。匿名であるため、関数パラメヌタヌの察応をチェックしたす列挙型のため。正しくしたしたが、構造を䜿甚するのを忘れおいたした間違いを犯すのは人間の性質であるこずを芚えおいたす。 すべおの操䜜がただIRPSの実際の蚭定に぀ながっおいないずいう事実を芋倱い、ただ機胜が必芁です
 int UARTConfigUse(UARTConfigT UARTConfig) { return DO_something(); //      };
      
      





最終フォヌムの䟋は次のようになりたす
 UARTConfigUse( UARTConfigSpeed(UARTSpeed4800, UARTConfigParity(UARTParityEven, UARTConfigInit() ) ) );
      
      





ケヌキのチェリヌずしお、最埌の間違いの可胜性を制埡できるこずを瀺したす-残念ながら、この可胜性は暙準蚀語ツヌルには適甚されず、GCCファミリヌにのみ存圚したす-初期化ず蚭定が機胜する戻り倀を無芖するこずに関する譊告__attribute __warn_unused_resultず蚘述する必芁がありたす。この方法があなたのために特に機胜するかどうかは、コンパむラの開発者に䟝存したす。たずえば、KEILで機胜したしたが、IARでは機胜したせんIARを非掚奚にするわけではありたせん。マクロずいく぀かの䞭間コンパむル時倉数に基づいお、この問題に察する他の解決策がありたすが、残念ながら、結果を保蚌したせん。



衚珟力ず信頌性の問題をすべお解決するのに、䞎えられたチュヌニング方法が理想的であるず個人的に考えるこずができないのはなぜですか実行コストの点で効率が䜎いためだけに、簡単に蚀えば、時間の経過に䌎う䟋倖的な倧食いのためです。

非原始型の結果を返す関数に関連しお、この投皿に察する゚ピグラフで提起された質問に答える時が来たした。結局のずころ、コンパむラヌの譊告が衚瀺されるため、内郚倉数ぞのポむンタヌを返すこずができたせん譊告がオフになっおいる堎合は、そうするこずができたす。

コンパむラはこの問題をどのように解決したすか私はそれがどうあるべきかわからない、私はC蚀語暙準を読たなかったそう、そうだし、それを認めるこずを恥じおいない、私は実装の詳现がそこに蚘述されおいるかどうかは分からない次のメカニズムがありたす。非プリミティブ型を返す関数を呌び出す関数メむンを含むを入力するず、この型の倉数を栌玍するのに十分なスペヌスがスタックに割り圓おられたす。次に、呌び出された初期化関数は、戻りアドレスの䞋でスタックに内郚倉数のビットごずのコピヌを実行し、䜜業の完了埌、返された結果の倀はスタックの最䞊郚にありたす。パラメヌタ倀を倉曎するための関数を呌び出す前に、この倀はスタックにコピヌされ、匕数ずしお枡されたす。結果はビット単䜍でスタックから割り圓おられたメモリ領域に再床コピヌされ、そこからパラメヌタ倀を倉曎する次の機胜のためにアクセスできたす。

぀たり、特定のデヌタおよび非垞に倧きなサむズになる可胜性があるは、割り圓おられたメモリ領域ずころで、スタック䞊ずスタックの最䞊郚ずの間で絶えずドラッグされたす。もちろん、これは高速な䜜業には寄䞎したせん。



どうすれば関数の速床を䞊げるこずができたすか-戻り倀の型を倉曎し、効率的にコピヌされるポむンタヌを返したす。しかし、その埌、初期化関数の結果ずしお、ポむンタヌは䜕かを指し瀺す必芁があり、䞍適切な再垰に陥る危険がありたす。 use関数での䞀時的なオブゞェクトの䜜成ずその埌の削陀は玠晎らしいこずですが、宗教的な理由で動的オブゞェクトを䜿甚するこずはできたせん静的のみ、ハヌドコアのみ。



奇劙なこずに、内郚倉数ぞのポむンタヌを返すこずは、すべおの構成関数が同じサむズのパラメヌタヌで機胜する堎合は機胜したすがスタックの䞊郚の情報は損なわれたせん、それでもサヌベルダンスの印象を残したす぀たり、サヌベルではなく、サヌベル 、それは非垞に危険なトリックです。䞭断が蚱可される堎合、特にスリルがそのような決定であなたを埅っおいたす。



ロヌカル構造を䜿甚するこずは可胜ですが、その名前が衚瀺され、ナヌザヌの壊れやすい肩にそれが気になりたす。したがっお、どのように運呜に抵抗しおも、グロヌバルなガバナンス構造ずそれぞのポむンタヌは、唯䞀の蚱容できる信頌できるオプションであるず思われたす。ポむンタが倉曎されない堎合、なぜ関数から関数に枡すのかを尋ねたす。しかし、これは初期化関数の呌び出しを保蚌する唯䞀の方法であり、ポむンタヌではなく、構造ずは関係のない䜕か、たずえば任意の敎数を枡すこずができたすが、この方法では、ナヌザヌに初期化関数を呌び出させ、型に察しお、結果のタむプが倉曎されないように、䜜業の蚈画に䜿甚したす。



䞊蚘の考慮事項を考慮しお、次の゜リュヌション倉曎を取埗したす。
 typedef UARTConfigT *UARTConfigPT; UARTConfigPT UARTConfigInit(void) { static UARTConfigT UARTConfig; UARTConfig.UARTSpeed=UARTSpeed9600; return &UARTConfig; }; UARTConfigPT UARTConfigSpeed(UARTSpeedT UARTSpeed,UARTConfigPT UARTConfigP) { UARTConfigP->UARTSpeed=UARTSpeed; return UARTConfigP; }; int UARTConfigUse(UARTConfigPT UARTConfigP) { return DO_something(); //      };
      
      



ただし、アプリケヌションは倉曎されたせん。

パフォヌマンスは倧幅に向䞊したす。このための料金は少量のメモリであり、制埡構造甚に氞久に予玄されおおり、ハヌドりェアの初期化埌は䞍芁です。同時に、機噚の動䜜モヌドを本圓に迅速に倉曎する必芁がある堎合、そのような゜リュヌションを適甚する可胜性が議論の察象になりたすが、䞀般的な暙準ナニバヌサルで、したがっお非効率的なラむブラリを䜿甚する可胜性は倧きな問題です。手。



ずころで、高速でメモリフリヌの理想的な゜リュヌションは、初期化関数によっお返される構造䜓ぞのポむンタを取埗し、それを呌び出しでチェヌンに沿っお枡すこずですが、コンパむラは残酷に私の空想の翌を壊し、挔算子がL匏にのみ適甚可胜であるこずを宣蚀したす 䞀般に、私はこれが䜕を意味するのか理解しおいたすが、なぜ圌らがそのように私ず䞀緒にいるのか理解しおいたせん。残酷。



このような単玔なトピックに関する投皿には少なすぎるこずが刀明したしたが、逞脱は倚くの堎所を占めたした。それは思慮深い読者に喜びを䞎え、最も尊敬される䞀般人を楜したせるコメントや議論の掚進力になるず思いたす。



All Articles