スタむルの質問に

䞀䞇里の旅は、最初のステップから始たりたす。



前文



前の投皿の調査結果によるず、私の蚘事を読んでいる人の倧郚分が組み蟌みシステムのプログラミングのコヌスを受講したいこずが明らかになったので、次のテキストを入門講矩ず考えるこずを提案したす。 別の、それほど倧きくはないが、かなりの郚分の読者が自分で同様のコヌスを読む機䌚を宣蚀したので、参加しおください。Habréであなたの講矩を芋たこずがありたせん。



MKのハヌドりェア初期化モゞュヌルを構築する方法に関する最近の私がそれを曞き始めたずき、圌は本圓に最近でした投皿ちなみに、このトピックに興味がある人は、コメントを必ず確認しおください、残念ながら、完党に玠晎らしい解決策はありたせん、この原皿の䜙癜に収たる私はSTMマむクロコントロヌラのUARTの機胜に次の投皿を捧げるこずを玄束したした。 それにもかかわらず、この玄束を攟棄するこずなく、特定の調敎を行いたす-適切な゜フトりェアパッケヌゞ開発のトピックに関する䞀連の投皿が䜜成されたずえば、MODBUSプロトコルの実装が採甚されたす、そのフレヌムワヌク内に䞊蚘のトピックに専念する郚分がありたす。



私たちは正しい開発を研究するので、反䟋が必芁になりたす。他の人の間違いを瀺すこずほど簡単ではないため、前述のプロトコル、぀たりFREEMODBUSのよく知られた実装が出発点ずしお採甚されたす。 機胜の問題を怜蚎せずに、この゜フトりェア補品のスタむルは私には理想的ではないようであり、どのように改善できるかを瀺しおみたす。



予定されおいる䞀連の投皿の目的は、組み蟌みデバむス甚の゜フトりェアシステムの蚭蚈方法、考慮すべき考慮事項、適甚すべき基本的な手法、結果を瀺すこずです。 プレれンテヌションでは、このテキストの読者が組み蟌み゜フトりェア開発の分野で働くために必芁な特定の知識を持っおいるずいう暗黙に暗瀺されおいる事実から進みたす。私の仕事は、圌がこの知識を䜓系化しお、可胜な限り最高の品質の結果を埗るこずです。



したがっお、プレれンテヌションは必ずしも十分に厳密であるずは限らず、倚くの堎合、問題を指定し、その重芁性を蚌明せず、問題の可胜な解決策を䞻匵しお衚瀺するだけです。 それにもかかわらず、埗られた結果は確かに真実であり、さらに、日垞の実践で非垞に適甚可胜です。 理論的な考察自䜓は、この理論の具䜓的な䜿甚䟋ほど興味深いものではないさらに、読み曞きが難しいので、芪愛なる読者は、前述のラむブラリに基づいおラむブラリを蚭蚈するこずに埓事したす。



ラむブラリ、぀たり私たちが今埌䜿甚するこずを意図しおいない補品を䜜成する堎合、どの機胜を考慮する必芁がありたすか。 たず、同僚の目を芋るのが恥ずかしくないように、特別な泚意を払っお曞かれるべきです。 「子䟛向けの本を曞く方法は 倧人だけでなく、それだけが優れおいたす。」 もちろん、「フィガク、フィガク、プロダクション」スタむルは最近、特定のサヌクルで人気を博しおいたすが、あなたず私は、䞀時的な利益のために信頌性のある船を離れるサむレンの呌び出しに屈するこずはありたせん。 さらに、コヌドの最も重芁な読者いいえ、これは瀟長ではありたせん、぀たり自分自身に぀いおも忘れおはなりたせん。 「なぜここで䜿甚したのだろう...」のような衚珟は、私たちが望むよりもはるかに頻繁に発音されたす。成功したラむブラリおよび他の方法を取埗し、倚くのナヌザヌから需芁がある堎合、それを修正する必芁がある堎合があるためです、そしお私はロシア語の豊富な語圙、特に非芏範的な郚分を適甚せずにこれをしたいず思いたす。 しかし、これらは䞀般的な考慮事項であり、すべおの開発に圓おはたる必芁がありたす。これが垞に行われるわけではないのは残念です。 したがっお、実際のコヌドの蚘述を進める前に、それに䌎う重芁な状況を刀断する必芁がありたす。



倉数最悪の堎合はモナドを䜿甚し、遞択した蚀語で䞀般的には、遞択しなかったため、Pascalファミリヌの蚀語ではなく、どこに行けばよいかわからない Cは組み蟌みシステムのプログラミングにおける䞻芁な蚀語であり、「敵を倒せない堎合は、それらを導いおください」倉数は類型化されおいるので、たずは型に぀いお話したしょう。



カッコ内の発蚀に関する必芁な説明は、私はたったくC蚀語の堅固な敵ではなく、敵ではないずいうこずですが、プログラマずしおの私の開発はPascal蚀語䞀般的に、正盎に蚀うず、マシンのANPの蚀語「ナむリ」-ああ、これらの玠晎らしい指什は「導入」ず「終了」-それから、ロシア語の指什は以前のように良いアむデアではないこずに気づきたした、そしおFortranでは、これらの蚀語に぀いおあたりにも倚くの読者がしないこずを恐れおいたす圌らは知っおいるし、私は珟時点ではそれらを掚薊する぀もりはないが、パスカルの 私はたったくそれを行うこずはできたせん、このシヌリング珟象が起こり、Cが提䟛するロヌプの長さを個人的に確信したずき、それは私にずっお䞍快でしたそしおそれはパスカルがあなたを支えおいるサポヌトよりもはるかに長いですサポヌトなしで独立しお移動したす。 しかし、それでも、Cを第䞀蚀語ずしお、あなたはあなたの子䟛のためにそのような歩行指導をしたいず思いたすか



列挙ず定矩



それで、私たちの矊、぀たりタむプに戻っお、あなたは驚かれるかもしれたせんが、本圓に話すこずがありたす。 たず、ファむルを開きたす...すぐに、著者がラむブラリで積極的に䜿甚するこずを蚈画しおいるナヌザヌタむプのアナりンスに出䌚いたすが、すぐに䞀郚の執筆が気に入らなくなりたす。 この堎合、ブヌル型の導入に぀いお説明しおいたす。 これは、この蚀葉の受け入れられおいる意味の誀りではありたせんが、私のプログラミングパラダむムのフレヌムワヌクの倧きな誀りです。 バカな人はコンパむラを曞くず思うので、蚀語を䜿甚するずいう点で、自分よりもはるかに高床だず考えるべきではありたせん。 論理定数を定矩する叀兞的な実装ずchar型の䜿甚がこのファむルに蚘茉されおいたす。列挙型による実装ずは察照的です。



typedef enum {False=0,True=1} Boolean; Boolean IsOk=True; ...; if (IsOk==False) ...;
      
      





私たちは提案された実装をより詳现に怜蚎しお、それが提䟛するすべおの利点を理解し、欠点がないこずを確認したす。その埌、定矩に基づいお最初の実装を䞀床忘れおしたい、その適甚をたずもな瀟䌚の蚱容できない珟象に垰したす。 「パヌティヌには䞍吉な静寂があり、誰もが振り向いおあなたを非難し、ホヌルの隅にいる誰かがカクテルを萜ずすこずさえありたす。」



そのため、たず、列挙型が䜜成された目的-割り圓おの混圚が蚱容されないため、これを実行しようずするず、コンパむラの譊告が衚瀺されたす。 もちろん、倉数党䜓を論理倀に割り圓おるこずには䜕の問題もないず誰かが蚀うでしょう。それらは同等であり、䞀般に譊告ぱラヌずは異なりたす。それらを無芖できたす。私たちは人間ではありたせん-今日、圌は列挙型を混合し、明日ポむンタを䞎え、明埌日はポむンタをロヌカル倉数に戻すずいう譊告を無芖し、困惑しおアむドルコヌドを芋お、「昚日はすべおうたくいきたした。おそらく Eコンパむラグリッチ「ずINETAに行くにはneglyuchnyコンパむラを求め、そこには戻りたせんが、现郚にコヌドを無芖する独特のスタむルでそれらを曞かれお理解する必芁がありたす。 怠inessず過倱を陀いお列挙型を混合する蚀い蚳はないため、すべおがこの順序で発生し、リストされた最初のものにすべお敬意を払っおこれらの2぀の性質を持っおいたす結局、圌女は前に生たれたので、䞀般的には進歩゚ンゞンですコヌドを同行させたいプログラマヌの最高の特性に垰するこずができたす。



ずころで、私はコヌダヌに異垞なほど熱くされたキャラクタヌがあるこずをすぐに譊告したいず思いたすが、私の投皿ではこの欠点をできるだけ隠しおいたすが、血たみれのマニアず呌ぶこずはかなり可胜です、私はキャラクタヌより悪くない家にいく぀かの倧きな包䞁を持っおいたす有名な映画のスティヌブン・セガヌルは、実際のIPアドレスを蚈算したり、コヌドからそれを抜出したりする技術においお、私は同等ではありたせん。



次のプラスは、コンパむラが実装に必芁なプリミティブ型を遞択するこずです。倀を栌玍するのに8ビットで十分な堎合、列挙型は必ずしも敎数ずしお栌玍されたせん。 私にずっお、IARは、論理型列挙型の倉数を1バむトに配眮するこずでそれを実珟したした。 䞀般的に、論理型を盎接決定する堎合は、char型ではなくat_least8_tたたはfast8_tを䜿甚する必芁がありたす。最埌の2぀はバむトず䞀臎する必芁はありたせんが、バむトず䞀臎する必芁はありたせん。 さらに、たずえば、メモリ内のアドレス指定可胜なビットなど、論理倉数をより適切な堎所に配眮できるコンパむラ実装を陀倖したせん。これは、自䜜の定矩よりもメモリず速床の䞡方で間違いなく効率的です。



明瀺的な比范



比范挔算子が曞かれおいる行に泚意を払いたしょう。「真実ずは䜕か」ずいう確立された慣行ずは察照的に、明確に曞かれた比范でオプションを断固ずしお䞻匵したす。 このオプションは必芁な条件を明確に瀺しおおり、掚枬の䜙地がないため、「れロではありたせん」。 たあ、珟代のコンパむラの99を考慮するず「すべお」を蚘述したすが、䜕が起こるかわかりたせん、れロずの比范を芋るず、その実装のコヌドは生成されたせんたたは、たったく同じになりたす if゚ラヌ条件での比范の欠劂に぀いおは、効率が䜎䞋するこずはありたせん。結論ずしお、NoErrのような名前の倉数を避けるこずももう1぀の考慮事項です倉数の名前は、栌玍されおいる倀の意味ず䞀臎する必芁がありたすが、あなたは疑いを持っおいない、そうでなければ私たちは倧きな問題を抱えおいたす などの可胜誀解ず混乱匏溶解if (NoErr==False)



、及び任意の手段によっお回避されるべきであり、その意味でISOK倉数が奜たしいです。



ステヌトメント圢匏で条件を蚘述するこずも望たしいです。぀たり、 (IsOk == False)



(IsOk |= True)



よりも望たしいのですが、 ~(IsOk == True)



オプションは思い浮かぶこずすらありたせん。 トロヌリングされおいたかもしれたせんが、私には埮劙すぎたすが、冗談を蚀うのは䞍適切ですバリアントState|= !!ErrNumber << 5



、通垞の衚珟if (ErrNumber! = 0) State = State | (1 << StateErrorBitNumber)



if (ErrNumber! = 0) State = State | (1 << StateErrorBitNumber)



。 これが真実であり、私のコンパむラのコヌドが短くも速くも動䜜しなかったずしおも、この効率は、同様の蚀語構造からの1分間の困惑の䟡倀さえありたせんでした。



おそらく、組み蟌み゜フトりェアの分野で働いおいる人は、議論党䜓の二重反転の結果を理解する必芁がありたすが、それにもかかわらず、オリンピックやむンタビュヌのためにそのような構造を保存したしょう。実際の䜜業ではそれらを回避したす。 簡単な理由-読者が知的パズルを解く胜力を評䟡するためのコヌドを曞いおいるわけではありたせんこれは圓業界にありたす。たあ、私の反察意芋を呌んでください。そしお、プログラムコヌドでは、私は個人的にそのような行動を䞍適切であるず考えおいたす誰かが私の行動に反しお自分自身を持っおいるので、間違った意芋がある堎合は、コメントたたは応答で合理的に述べるこずができたす それはそうですが、すなわち、Iは、間違っおいる可胜性がありたす。



さお、もう1぀発蚀-C蚀語暙準では、このフラグメントの䞊蚘のコヌドの䜜成者の芳点から正しい動䜜の保蚌はないこずをここで教えおくれたす。 これが本圓かどうかはわかりたせんが、ずにかく泚意する方が良いです。



ビットフィヌルド



ずころで、ビットフィヌルドに関しお。 私の反察意芋を読んだ人は知っおいたす、そしお残りのためにもう䞀床繰り返したす-あなたがコンパむラで単語のバむト順序を制埡できるなら、ビットフィヌルドはレゞスタず通垞の䞡方で個々のビットずビットフィヌルドを扱う本圓に楜しい方法ですif (ErrNumber! = 0) State.ErrorBit = 1



前の段萜で䞎えられたものよりもさらに明確なので、この機䌚を䜿甚するこずを匷くお勧めしたす。 子䟛の頃に宗教䞊の考慮事項や心理的トラりマを受け取った堎合、䞡芪が曞いたファむルを予期せず開いお、そこにこの開かれたテクニックを芋たずき、ビットフィヌルドを䜿甚するこずを蚱可せず、ビットマスクを奜む堎合、私は匷く掚奚したす-操䜜を隠すそれらはマクロの背埌にあり、個別にではなく、埓属定数を盞互に定矩したす。



私の初期の投皿では、この問題を考慮したした。コメントには、 #define StateBitNumber (12)

#define StateBitMask (1 << StateBitNumber)




ような結合定数の埓来の定矩ずずもに蚱可するマクロさえありたす。 #define StateBitNumber (12)

#define StateBitMask (1 << StateBitNumber)




#define StateBitNumber (12)

#define StateBitMask (1 << StateBitNumber)




は、 #define StateBitMask (0x00004000)

#define StateBitNumber (BITNUMBER(StateBitMask))




スタむルで反察を䜿甚したす #define StateBitMask (0x00004000)

#define StateBitNumber (BITNUMBER(StateBitMask))




#define StateBitMask (0x00004000)

#define StateBitNumber (BITNUMBER(StateBitMask))




。 最埌のマクロの独自の実装を考え出すか、たたは芋るこずができたす。 そしお、神のために、これらの定数の導関数のみを䜿甚しおください。 *(uint *) 0x20008000 = *(uint*) 0x20008000 & 0xffff0fff | 0x00004000



*(uint *) 0x20008000 = *(uint*) 0x20008000 & 0xffff0fff | 0x00004000



、さらに、同じ定数を持぀類䌌の衚珟がテキストに䜕床もありたすが、倧きな包䞁に぀いおはすでに芚えおいたす。



レゞスタ内のビットフィヌルドは決しお論理型ではありたせんが、1ビットの長さではあるが敎数はその型を敎数ず決しお異にしたせんが、プロセス状態ワヌド倉数内ではたた、このような構造-ビット長1の論理タむプを蚱可したす。たた、elseブランチに぀いおも忘れないでください。これは、この䟋ではかなり意識的に芋逃したした。そのため、批刀される挔算子に完党に察応し、察応するコンテキストで正しい堎合がありたす。 同時に、 ProcessOK = (Boolean) (((ReadOk==True) || (WriteOK==True)) && (ErrNum ==0))



ようなものを曞く暩利を制限したせん。オペレヌタヌは、䜕が起こっおいるのかを明確に理解し、起こりうる結果に察しお責任を負う決意を衚明したした。



倉数名



別の重芁ではないが、特定のサヌクルでは、物議を醞す状況、すなわち倉数の名前は、存圚する限り圱響を受けたす。 私の䟋からわかるように、私はこの点に関しお特定の奜みを持っおいたすが、私はそれらを決しお匷芁したせん、䞋線付きのスタむルは悪くありたせんおそらく、私はそれを䜿甚しないため、ずにかくそれはおそらく悪いです、ハンガリヌの衚蚘は非垞に䞀般的です広く、その利点があるため、オブゞェクトず属性の順序はどのような方法でも可胜です。そのため、唯䞀の掚奚事項は、同じ呜名スタむルを厳守し、IsOK6のような名前を避けるこずです。



個人的たたは組織内で、倉数のコヌディングおよび呜名の圢匏が非公匏たたは正匏に確立されおいる堎合は、暙準ではなくおも暙準よりも優れおいるため、優れおいたす。 ho声やパヌ゜ナラむズに至るたで、倉数の真に正しい呜名のトピックに぀いお無限に議論するこずができたすので、私はあなたがやりたいこず特定のルヌルに埓いたすをもう䞀床蚀いたす、そしお私は「はい、すべおの本圓の信じる卵割」の支持者ですEMUがより䟿利な最埌から」ずいう有名な匕甚の私の改蚂が匷調されおいたすが、そのような修正がリリプヌトを内戊から救うかどうかは完党にはわかりたせん。



実際、列挙型の長所ず短所は、私の奇劙な想像力の逃避に続いお誰かが忘れおいない堎合、考慮したので、この問題に戻りたしょう。 提案された実装の利点を調べ、目に芋えるマむナスがないこずを確信したしたが、それは起こらず、䜕かが悪化するはずでした。 「読者はすでにバラの韻を埅っおいたす-たあ、すぐにそれをキャッチしたす。」 列挙型を論理匏ずしお解釈する機胜を倱いたした。これは、デフォルトでは組み蟌み敎数型のCで衚されたすが、完党に倱われるこずはありたせんでしたが、そのような詊みにはコンパむラヌの譊告が䌎うため、無芖しないこずに同意したした。



はい、私たちはif (~NoErr || !NoSuccess && NoRetry) ...



ような魅力的な衚珟を曞くこずができたせんif (~NoErr || !NoSuccess && NoRetry) ...



これは、半幎の䌑憩の埌に著者に間違いなく数分の䞍快な時間を提䟛し、残りに぀いお話すこずは䜕もありたせんが、私を信じお、損倱は​​それほど倧きくありたせん。 そしお、誰もが理解できる圢匏で論理条件を衚珟するには、たずえばif (IsOk==True) || ((Success==True) && (Rerty==False))) ...



if (IsOk==True) || ((Success==True) && (Rerty==False))) ...



ここでは、すべおがシンプルで明確であり、この構造に2マむクロ秒かかる堎合でも、個人的にはわからないので、それだけの䟡倀がありたす。 賢い人の䞀人が蚀ったように、私たちはコンパむラのためではなく、他の人のためにプログラムを曞いおいたす。



さお、先ほど述べたように、誰も型キャストをキャンセルしおいたせん。私はそれを普遍的な悪ずは考えおいたせん。たた、暗黙のキャストを避け、健康のためにそれを䜿甚したす。これは本圓に悪です。 結局、キャスト挔算子を曞いた堎合、結果ずしお埗られるものを理解し、敎数バむトを割り圓おるず䞊䜍ビットが砎棄され、関数にアクセスするずきに定数倉数ぞのポむンタヌを䜿甚するこずを理解しおいるこずをコンパむラに瀺したこずが理解されたす、仮パラメヌタヌが倉数ぞのポむンタヌである堎合、䞀郚のランタむム環境で䟋倖が発生する可胜性がありたすか あなたはこれを理解しおいなかったので、迷惑な譊告を取り陀くために型キャストを蚭定したした-これらはあなたの問題です、コンパむラはあなたが十分に責任あるプログラマであり、圌を倱望させないようにあなたの動機を掘り䞋げたせん。かなり。



自分を明確に衚珟する



したがっお、可胜な限り単玔なコヌドよく知られおいるKISSルヌルを曞くこずをお勧めしたす。これは、垞にプロのプラむドの誀った理解から違反したすブラックボックスの最埌のレコヌドは「どうすればいいか」ず思われる意芋がありたす倚くの堎合、習慣から倖れおいたす。 前の投皿ぞのコメントで私に勧められた「21䞖玀から」ずいう良い本を読みたしたが、非垞に銎染みのある堎所であるstatic int Data=0; if (!Data) ...



static int Data=0; if (!Data) ...



; 単玔で理解しやすい条件デヌタ== 0がこの圢匏で曞かれおいる目的に぀いお質問がありたす。もし私たちが倉質するこずに決めたら、〜Data1ず曞くこずもできたすこの衚珟はもっずクヌルで、タむプ党䜓の振る舞いを深く理解したすが、これはプログラムを曞く䞻な目暙です-あなたの知識を誇瀺するために、しかし、あなたは䜕か他のものを思い぀くこずができたす。 テキストを入力するずきに2文字を保存し、ファむルを保存するずきにディスク容量を節玄するためですか もちろん、3぀のオプションはすべお同じように機胜し、Cでは型党䜓を条件ずしお解釈できたすが、それでも、なぜですか 読者ナヌザヌがC構文芏則の知識を確認する必芁はありたせん。繰り返したすが、むンタビュヌはしおいたせん。



パフォヌマンスに぀いお私に話を始めないでください。事前に、より理解しやすいバヌゞョンのコヌドは、䞡方の異垞なこの定矩を䞻匵するメ゜ッドのコヌドに過ぎないず蚀うこずができたす。 ちなみに、最初の2぀のオプションではコヌドはたったく同じであるこずが刀明したしたが、3番目のオプションはコヌドの䜜成者の深い知識を瀺すように蚭蚈されおおり、圓然長くなりたした。



マシンに䟝存しないタむプ



プログラムのテキストをさらに調べお、別の神秘的な堎所、぀たり、UCHAR型ずUINT型の定矩に出䌚いたす。 なぜ神秘的な堎所ですか 第䞀に、これらのタむプがたったく導入されない理由が明確ではなく、名前から䜕も続きたせん意味のある識別子に同意したしたか、第二に、テキストはこれらが暙準タむプの単なる゚むリアスであるこずを瀺し、第䞉に、暙準タむプが採甚された理由、およびサむズが明瀺的に瀺されおいる組み蟌みプログラミングでの䜿甚が明瀺的に掚奚されおいないタむプ。 入力する文字数を少なくしようずするだけですか



もしそうなら、この決定はただ存圚する暩利を持っおいたすが、もしそれがマシン独立型を定矩する詊みであったならそしお、これは「私の手玙の最初の行で」行われるべきですので、私は心からそう望みたす、それは明らかに倱敗したした。 マシンに䟝存しない型の正しい名前の問題は別のholivarのトピックです。TIがその䟋で䜿甚するミニマリストの定矩、぀たりu8、s16などは個人的には奜きですが、別のオプションを奜むかもしれたせん。



ずころで、奜奇心reader盛な読者にずっお興味深い質問は、これらの型が蚀語実装のサむズの明瀺的な指瀺でどのくらい正確に定矩されおいるかずいうこずです。 しばらく考えおからオプションを提案し、コンパむラのstdint.hファむルコヌドを確認するこずをお勧めしたす。 個人的には、__ INT8_T__のような匏のIAR゚むリアスを芋぀けたした。これはさらに分析するこずはできず、明らかにコンパむラヌ自䜓に実装する必芁がありたす。 C蚀語暙準を読んでいる人私が自分の無知を誇瀺する方法を参照しおください、これは初めおではありたせんはコメントで私を修正できたすが、これらのマクロはsizeof挔算子の堎合のように、内郚実装であるようです私がか぀お探したが、芋぀けられなかった人は、同様の衚珟に反しお䌑んだ。 しかし、Keilでは、これらの型は暙準型を介しお盎接実装されおいるため、どのように実際にあるべきか、たたは実装は完党にコンパむラメヌカヌに委ねられおいるのではないでしょうか



奜奇心reader盛な読者に察する別の質問は、サむズを明瀺的に指定する必芁がある堎合、どのタむプを䜿甚でき、どのタむプを䜿甚する必芁があるかずいうこずです。 䞀方では、ケヌスuint8_tを䜿甚するこずをお勧めしたす。その実装はオプションですが、fastint8_tは、長さが䞋から制限されおおり、タむプatleast8_tのように厳密に蚭定されおいたせん。 もちろん、経隓䞊、明瀺的にサむズを瀺すすべおのタむプのタむプが、実際にアクセス可胜なすべおのコンパむラヌに実装されおいるこずが瀺されおいたす反察のケヌスはわかりたせんが、読者は個人的な経隓を䞀般化するずいう私の欲求にすでに気付いおいるようですが、墓の2メヌトルよりも溝のメヌトル。 䞀方、最埌の2぀のタむプは正確な長さを保蚌するものではありたせんが、短い敎数ずみなされ、バむトず䞀臎したせん。



私の解決策は、sizeofchar== 1が暙準で厳密に固定されおいるため、本圓にバむトが必芁な堎合、char型は正しいですが、16ビットの敎数にはfast16_tを䜿甚する必芁がありたすが、これも䜕も保蚌したせん。 したがっお、正しい゜リュヌションは、バむトのセットの圢匏で情報パケットを蚘述し、バむトの配列を䜿甚しお明瀺的に芏定された操䜜によっお、さたざたなタむプの内郚倉数ぞの倉換およびその逆の倉換です。



笊号なしの型



すぐに笊号なし数字のトピックに觊れおください。 䜕らかの理由で、倖郚デバむスのレゞスタを決定するためにおよびデヌタ転送パケットの構造を蚘述するずきに笊号なしの型が䜿甚されるずいう慣行が開発されたした。笊号付きず笊号なしの型の違いは>ず<operationsの実装のみであるため、先頭のビットは笊号付きの型、笊号なしの型のキャリヌビットは分析されたすが、これらの挔算は実行したせん。たた、型倉換にもわずかな違いがあり、これによりパフォヌマンスがわずかに倉化したす少なくずもARMストヌンの堎合。たた、方向が異なりたす。



同時に、笊号なしの型の䜿甚は、䜙分なu文字を蚘述する必芁があるこずを陀いお、マむナスの結果に぀ながりたせん。これは、ディスクスペヌスを節玄するずいう珟代のプログラミングの䞻なパラダむムに準拠しおいたせん。たずえば、パケット内のデヌタの長さなど、笊号なしの倀ずしお解釈される情報を実際に含むフィヌルドの堎合、定矩によっお負になるこずはありたせん。笊号なしの型を䜿甚するず、匏Len> 0ずLen= 0を同等にするこずができたす。より䟿利なものを䜿甚したすが、そのような情報を含たないフィヌルドの堎合、笊号なしの型はオプションです。



さお、最埌の発蚀-これらのタむプが倧文字で曞かれおいる理由は明らかではありたせん。そのような呜名が掚奚されおいるマクロがないため、おそらくおそらく、過去の遺産、実際に定矩があり、カスタムタむプに眮き換えられたマクロがありたせん。誰にもわからないが、私にずっおは倧文字だけで構成される名前が目を匕き、このスタむルはサポヌトしおいないが、ご存知のように「色はすべお味が違う」。繰り返したすが、正圓な反察意芋を持っおいるこずをコメントしおください。



ファむル構造



ファむルに぀いお少し説明したす。私はあなたのこずを知りたせんが、これたで十数幎以䞊ありたしたがモゞュヌルの構造ずそれらを実装するファむルが眮かれおいる堎所の説明が蚘茉されたテキストファむルをプロゞェクトのルヌトディレクトリで芋぀けられないのは珍しいこずです。おそらく、ヘッダヌファむルはINCで始たる名前のディレクトリずSRCディレクトリの゜ヌスにあるこずを理解しおいたすが、ここには既にSOURCEなどのオプションがありたすが、若い頃はそのようなファむルの存圚が必須ず考えられおいたので、この理由はわかりたせん私は緎習を拒吊し、この゜フトりェアパッケヌゞの䜜成者ずそれが開発されたラむセンスの皮類を通知するテキストファむルを、私はそれが完党に䞍適切であるず考えたす。



Jack Gansleyがブログで曞いたように、「プログラムテキストの冒頭に、ラむセンスの芁件に関する2ペヌゞの説明があり、コメントがほが終了しおいるので、著者の資栌に぀いお疑問がありたす。」この衚珟は、問題の補品を完党に少しだけ蚀及しおいたす。そしお、Doxygenを促進するサむレンがあなたにコメントを曞くこずを信じないでください。圌はファむルの構造ず構成の説明を本圓に準備できたす。特にあなたが圌を助ければ、コメントはあなただけの仕事です。



そしお、コメントに぀いお話し始めたので、私のアドバむスは、コメントを次のスタむルで曞くべきではないずいうこずです。Counter ++; //



。これは冗談ではありたせん。そのようなコメントは、倚くの堎合、著者がそれらを公開するこずを恥ずかしがらないプログラムで芋られたす。最近、「コメントは読者を怒らせおはならない」ずいう良い衚珟を読みたした。確かに、この珟象はArduino環境の特城ですが、それでも、そのようなコメントは存圚しないずいうよりも悪いのです。しかし実際には、コメントはなく、たったく同じ操䜜がわずかに異なるプログラミング蚀語で曞かれおおり、この皮のコメントがプログラムのロゞックを理解するのに圹立぀コヌドの読者ず予想される人がいる堎合そしおこれがコメントの䞻な目的です私が圌らにアドバむスできるのは、掻動の皮類を倉曎し、粟神的胜力を非垞に明確に超える芁件のある領域に関䞎しないこずです。



すぐに必芁な説明をしたいず思いたす-私はこの方向のフォロワヌを決しお無芖したせん、Arduinoには本圓に良いプロゞェクトがあり、これはそれ自䜓の玠晎らしいシステムです、それはかなり歎史的に起こったので、あたり経隓のある人たちは、指定された䟋に䌌たプログラムを曞くスタむルを自分自身に蚱可する初心者プログラマず慣習的に呌んでいたす。あなたの痛みを䌎う困惑ずそれらに察する唯䞀の可胜な答えは、プログラミング党般、特にC蚀語に関する本を読むずいう提案でしょう。



ヘッダヌファむル



ヘッダヌファむルに぀いおもう1぀、たたは2぀です。

たず、ファむルに保存するのではなく、番号を保存しないでください。モゞュヌルが内郚定数たたはナヌザヌが必芁ずしない他の゚ンティティを必芁ずするが、それらの単玔で䟿利な倉曎の可胜性を保持したい堎合ただし、そのようなオブゞェクトの説明はプログラムテキストの先頭にあり、別のファむルにないため、倉曎は耇雑になりたすが、䞀臎するものは保存したせん、モゞュヌルむンタヌフェむスの説明がある共通のヘッダヌファむルにドラッグしないでください。あらゆる堎合にモゞュヌルごずにヘッダヌファむルを1぀だけ持぀ずいうルヌルはありたせん。たた、誰もがこれを行うずいう事実は、あなたにずっお正圓な理由にはなりたせん。



ナヌザヌは必芁なものを知るだけで倚くの理由がありたすが、重芁な情報を含む小さなファむルは5ペヌゞのシヌトよりも読みやすく、最初の2ペヌゞでラむセンスの詳现がわかりたす補品、次の3぀は、䜿甚しない内郚定数ずオブゞェクトを定矩し、最埌のペヌゞの終わりに、ナヌザヌが必芁ずする3぀の関数のプロトタむプが孀独に朜んでいたす。



他の堎合には、耇数のヘッダヌファむルが圹立぀堎合がありたす。いく぀かのアクティブに䜿甚される倉数を含むパッケヌゞがある堎合の䟋を芋おみたしょう。たずえば、倚くのモゞュヌルが読み取るこずができるが、倉曎できるのはごく少数の゚ラヌコヌドです。もちろん、ナヌザヌの慎重さを期埅しおそれにアクセスするこずはやや無謀であるため、ゲッタヌは自然な解決策のように芋えるので、2぀のヘッダヌファむルを䜜成したす。1぀は内郚䜿甚を目的ずし、2぀目は読み取り関数のシグネチャずナヌザヌのみが、たずえその倉数の存圚を知っおいるだけなので、本圓に望んでも倉数を台無しにするこずはできたせん。



第二に、添付されたヘッダヌファむル。聖戊を開始するリスクがあるず、私は次のこずを宣蚀したす-それらの解決は、モゞュヌルを接続するための真に効果的なメカニズムを䜜成するこずをためらうこずによっお匕き起こされた蚀語開発者の間違い、たたはむしろ束葉杖でした。はい、珟時点では、C蚀語はネストされたヘッダヌを䜿甚しおいたすが、必須ではありたせんが、これはugい解決策です。ただし、あたり矎しくはありたせんが、この゜リュヌションでは、ラむブラリ内の各モゞュヌルがパッケヌゞ党䜓にのみ含たれるすべおのヘッダヌファむルを含むグロヌバルヘッダヌを含むこずで始たる堎合、モンスタヌを生成する必芁はありたせん。 STMのラむブラリもこのアプロヌチの䟋ずしお機胜し、この゜リュヌションはすべおのリリヌスで保持されおいるずいう事実に基づいお、これが䌚瀟の䞻芁な䜍眮です。もちろん同時に、各ヘッダヌには繰り返しむンクルヌドに察する保護が装備されおおり、コンパむラヌはそのようなビネグレットを冷静に消化したすが、そのような解決策は、パッケヌゞ内のモゞュヌルの盞互接続が開発者によっお考慮されおおらず、パッケヌゞ自䜓の機胜郚分を実装するのに十分な資栌があるかどうか疑問です。



圌らはここで教えおくれたすもちろん、この人はプログラマヌずしお非垞に資栌があり、圌の意芋は䟡倀がありたすが、圌は私の末っ子であり、圌が最初の声明を曞いた瞬間から私ず議論しおきたので、これはある皋床長匕く独立のデモだず思いたす-悪気そのような解決策を行うこずはできたせんせずに、我々は、我々は圌の単䜍で仕事に行くされおいるオブゞェクトのすべおのヘッダを含たないこずを、最倧が、私は、蚀っおいない「ず理由を、実際には、ないでしょうか」



䞀郚で明瀺的にリストする必芁がある蚀語特定のモゞュヌルからむンポヌトされたすべおの゚ンティティを解決するために、私は私だけでなく、自分の経隓のみに䟝存しおいたすこれらの蚀語で䜜業したしたが、「生きお、健康で、陜気です」、぀たり、そのような芁件は死刑宣告に盞圓したせん。



ファむルの先頭にむンクルヌドヘッダヌファむルの名前を含むペヌゞたたは2぀を本圓に配眮する必芁がある堎合、おそらくモゞュヌルが倧きすぎるため、voutを分解する必芁がありたすかこの堎合、無理をせずに、2行の実行でコヌドを含む100500の小さなファむルを䜜成しないのがいいでしょう。真実は、い぀ものように、䞡極端の間に䜍眮し、非垞に玠晎らしい特性を持っおいたす-垞に真ん䞭に暪たわるあなたがそれに曞かれおいるこずを超えおこのフレヌズから䜕かを読んでいるなら、あなたは恥ずべきですはい、前述のスピヌカヌに同意する準備ができおいたす。倚くの堎所で、添付されたヘッダヌファむルは非垞に明癜ですが、それでも、それらは䟿利であり、必芁ではありたせん。「デリゲヌタヌ」パタヌンを実装した組み蟌みプログラミングおよび゜フトりェア開発のこのセクションに぀いおのみ曞いおいるが最埌だったのはい぀ですか



キヌワヌド



同様に重芁なトピックであるキヌワヌドに぀いお説明したしょう。゚ントロピヌ、゚ルゎヌド的情報源、倚次元メッセヌゞ空間、ビット、倚矩性、マルコフ過皋など、非垞に魅力的なストヌリヌからの長い匕甚を蚱可したす。これらの蚀葉はすべお、䞊べられた順序に関係なく非垞に印象的です。それらを正しい順序に䞊べるず、特定の理論的内容が埗られたす。そしお、本圓の専門家は、圌らの助けを借りお、日垞の実際的な問題の解決策を芋぀けるこずができたす。」したがっお、キヌワヌドを有意矩に䜿甚したす。぀たり、



volatile — , ,

static — , ,

const — , ,

auto register — , , , .


他のキヌワヌドはそれほど重芁ではありたせんが、コンパむラヌの機胜を忘れおいない堎合、むンラむンディレクティブを適切に䜿甚するこずで実際にパフォヌマンスを向䞊させるこずができたすが、その動䜜のメカニズム、したがっおその䜿甚の意味を実際に理解しおいないため、組み蟌みディレクティブを匷くお勧めしたせん。他のすべおのディレクティブは、通垞コンパむラに䟝存し、他の実装GNUコンパむラで気に入っおいるwarm__unused_resultプラグマなどに存圚せず、機胜が倚少異なるため、非垞に泚意しお䜿甚する必芁がありたす。取り䞊げたトピックにより、次の段萜、぀たりランタむムぞのチュヌニングにスムヌズに進むこずができたす。



コンパむラヌのセットアップ



プログラマからの疎倖を暗瀺する゜フトりェアパッケヌゞに固有の別のセクションは、タヌゲットコンパむラぞのチュヌニングです。ここで珟圚コンパむルされおいる通垞のプログラムずは異なり、開発䞭の汎甚゜フトりェアパッケヌゞは、異なるプログラミング蚀語少なくずもCおよびC ++、異なるアヌキテクチャ、同じ蚀語内の異なるコンパむラヌで動䜜する必芁がありたすさたざたな違いがありたす、さたざたなプログラミング環境およびそれらにはさらに違いがありたすおよびさたざたなタヌゲットMCたあ、埌者はコヌドに匱い圱響を盎接䞎えたすが、モゞュヌルの構造を蚭蚈するずきはこの芁件を考慮するずよいでしょう。



たず、蚀語の蚭定が必芁です。この特定の堎所で、extern Cディレクティブずしお衚され、C ++プログラムがC蚀語の芏則に埓っおオブゞェクトファむルで蚭蚈された関数を䜿甚できるようにしたす。パッケヌゞを枡す堎合、このディレクティブの䜿甚は絶察に必芁ですオブゞェクトファむルたたはラむブラリの圢匏ですが、完党なアセンブリの゜ヌスコヌドを䜿甚する堎合は陀倖できたす。完党に組み立おられたら、このディレクティブをオフにするこずをお勧めしたすが、ここで決めるこずができたす。しかし、スタむルに関する単なる発蚀-元の䟋では、このディレクティブは条件付きの甚語で盎接蚘述されおおり、個人的にはあたり奜きではありたせん。このようなディレクティブを個別のむンクルヌドファむルずしお蚭蚈するこずを奜みたす。たた、ディレクティブの実装を制埡し、このアプロヌチを掚奚したす。



たずめ



芁玄するず、どこでも同じスタむルで話す名前を䜿甚し、可胜であれば列挙型を䜜成し、必芁に応じおデヌタのサむズを明瀺的に瀺し、マシンに䟝存しない型を䜿甚し、パッケヌゞ構造ずモゞュヌルの関係を熟考し、ヘッダヌファむルを慎重に管理し、コヌドにコメントを付け、耇雑なものを避けたす理解および/たたはあいたいな衚珟ず䜕が起こるかを参照しおください。



PS



䞊蚘の掚奚事項に基づいお構築されたコヌドの最初の郚分は、Githが最終的に察凊するずきに、Githab / tGarryC / Modbus /に配眮されたす。



All Articles