CMSIS vs HAL vs標準周辺機器ライブラリ


29

そこで、PICからARMに切り替えて、STM32F4ディスカバリーボードを購入しました。これまでのところ、それをプログラムするには、メモリ内のすべてのレジスタに直接アクセスできること(明らかな方法)と、生活を楽にするために使用できる3つのメインライブラリがあることを理解しています。さて、私の質問は、これら3つ(CMSIS、HAL、Std Peripherals Lib)のどれが最も低レベルの1つですか?すなわち。オーバーヘッドの少ないもの。私の目標はコントローラーの内部の仕組みを学び、私の生活を楽にすることではないので(少しだけ)、アセンブリを使用せずにこれらのどれがコアに近いかを知りたいと思います。


10
[のSTM32側] CMSISは基本的にレジスタ定義であり、コードではないため、CMSIS ==直接レジスタアクセスです。AFAIK STにはCMSISのみの個別のダウンロードはありませんが、StdPeriph LibまたはSTM32Cubeをダウンロードすると、CMSISパーツのみを使用することを選択できます。STM32レジスタ定義は、いずれかLibraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hまたはDrivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hそれぞれにあります。
アレクシトルハモ

回答:


27

間違いなくCMSIS。これは厳密にはライブラリではなく、さまざまなレジスタの定義がほとんど含まれています。

マイクロコントローラのレジスタに簡単にアクセスして、独自のHALを実装するために必要なものです。レジスタにアクセスするだけなので、オーバーヘッドはありません。

CMSISは、他の2つとは異なり、STではなくARMによって定義されることに注意してください。これは、さまざまなマイクロコントローラー用のさまざまなCMSISライブラリが非常に似ていることを意味し、移植性を大幅に向上させます。

さらに、CMSISはより単純なものであるため、(IMO)最も汎用性が高く、最も信頼性が高く、バグが少ない(またはない)可能性があります。私が使用したさまざまなmcuのhalライブラリのいくつかは、そのバグで非常に有名です。

一方、CMSISにはかなり多くの作業が必要です。しかし、私の個人的な選択です。私は自分のニーズに合った高品質のライブラリの作成に時間を費やし、チップの動作を理解することを好みます。


私は必ずSTはまだCMSISライブラリをサポートしていることはないよ
スコットサイドマン

1
まあ...そのようなもの。直接的なリンクはなく、彼らはそれを落胆させます(彼らはコードに可能な限りユーザーを結び付けたいようで、他のブランドに向かわせないように思われます)が、他のライブラリで使用されています。そこから抽出できます。それは非常に単純で、コードの多くを含まず、成熟しているようです。サポート対象として販売するかどうかに関係なく、実稼働環境で使用しても安全なようです。
Fotis Panagiotopoulos

ええ、その方向への開発を停止したのは残念です。CMSISコンプライアンスは、そもそもSTに惹かれた要因の1つでした。まだ使っていますが、都合が悪い日が来ると感じています。
スコットサイドマン

3
@ ScottSeidman、CMSISとStdPeriphを混同したと思います。CMSISは十分にサポートされており、無期限にサポートされます。そのStdPeriphは基本的に非推奨になりましたが、CMSISは10年前と同じように生きています。
ScienceSamovar

14

それがどのように機能するかを学ぶには、上記のどれも使用したくないでしょう。アームクロスコンパイラとstのドキュメントを取得します。コーディングを開始します。これらのチップは一般にプログラムが非常に簡単です。ドキュメントには、どのレジスタのどのビットが何をするかが示されています。

これらのライブラリのいずれか/すべては、あなたからその理解/負担/作業を取り除き、アプリケーションプログラミングエクスペリエンスのようなAPIを呼び出すだけのように感じさせることを目的としています。これは多くの人が望むものです。これらのライブラリのすべてのソースを使用して理解を深めることができますが、上手くいくと、ライブラリに穴や問題、場合によっては非常に怖いコードが見つかります。一緒に投げられ、一般的に書かれ、チップからチップに大まかに移植されたコード、チップにない機能などをサポートします。そして、それらはすべて過度のオーバーヘッドを持っています。タスクに対して10〜100倍のコードが多すぎます。多くのコードが最適化されてしまう可能性がありますが、そもそもなぜそこにあるのでしょうか。

自分でライブラリを作成する場合でも、これらのライブラリを使用する場合でも、使用しているライブラリのソースを調べて、ライブラリの動作に満足できるかどうか、理にかなっている場合、チップのドキュメントと一致するかどうかを確認する必要があります。うまくいかないのは、その理由を見つけるために、あなたのものと同じくらいそれらのものを掘り下げる必要がある可能性が高いからです。

チップのドキュメントも完璧ではないことに注意してください、それは楽しみの一部です。

ベアメタルプログラミングについての議論でアセンブリが出てくる理由がわかりません。ごくわずかな組み立てで対応できます。これらのcortex-mチップの場合、技術的にはこのasmを起動するだけで十分です。

.globl _start
_start:
.word 0x20001000
.word main

データやbssに依存することはできず、最小限のasmでmainから戻ることはできません。しかし、それがベアメタルのベアリストに必要なすべてです。割り込みを実行する場合は、ベクターテーブルにさらにエントリが必要です。より多くの.word行。私はより多くのasmをお勧めしますが、おそらく10または20行以上です。

これは通常、私が使用するすべてのasmです。

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .
.align
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr
.thumb_func
.globl dummy
dummy:
    bx lr
.end

うん、それはcortex-m0と言っていますが、これは私のm4コードの実際のブートストラップです。私はこれがthumb2ではなくthumbであることを好みます。そして、このコードを1つのcortex-mから別のcortex-mに再利用し、必要に応じてスタックポインターアドレスを変更するだけで、m0、m3、m4で機能します。私はまだm7を持っていないし、あまり研究していません。

fpuを有効にするには、特定の指示が必要なため、asmの行がさらにいくつか必要になる場合があります。しかし、ポイントは、低レベルのプログラミングとasmを混同しないでください。Cには、チップの構成やアプリケーションの作成に必要なものがあります。あなたが話しているライブラリはasmではなくCで書かれているため、明らかにasmを使用する必要はありません。

内部の仕組みを学びたい場合は、独自のコードを作成してください。これらのライブラリを参照として以外に使用しないでください。コードを読むよりも、ハッキングする方が簡単な場合があります。(STだけでなく、すべてのベンダー。ベンダーの1つがコード行を持っていたので、私はそれをインタビューの質問として使用しているので、ここでは投稿しません。

STはもちろんですが、他のベンダーも同様に、電力を節約するために、チップのセクションのクロックを有効にします。そのため、LEDを点滅させようとする前に、そのgpioブロックの有効ビットを見つけて出てくるかどうかを確認する必要がありますリセットが有効になっている場合、有効になっていない場合、クロックを有効にせずにそのgpioロジックと通信すると、応答しないロジックからの応答を待機しているため、プロセッサがハングします。彼らは常にこれらの可能性についてあなたに話してはいけません。一度有効にすると、特定の周辺機器の初期化について説明します。ST docsはかなり優れています。ドキュメントのグレードがかなり悪いマイクロチップから来るので、問題はないはずです。


2
OPは、起動手順などについては尋ねませんでした。どのライブラリが彼/彼女の使用に最も適しているかだけです。
Fotis Panagiotopoulos

asmが言及されたため、asmに関するコメント
old_timer

2
また、CMSISにはコードが含まれていませんが、最低限必要なコードはありません。起動コード、リンカースクリプトなどは含まれません。レジスタの定義のみが含まれます。なぜナイスネームを使用してレジスタに直接アクセスするのではなく、不可解なコードを記述するか、ホイールを再発明するのですか
Fotis Panagiotopoulos

2
@John ASMをまったく使用せずに、同等の効率で簡単にARMマイクロコントローラーを起動できます。興味がある場合は新しい質問をし、いくつかの例を示すためにここにリンクをコメントしてください。
Fotis Panagiotopoulos

1
@ user3634713私は実際に非常に興味があります。ありがとう、electronics.stackexchange.com
ジョン

2

ベアメタルレジスタアクセスとstd周辺機器ライブラリの両方を使用しました。レジスターを処理する方が簡単だと思います。また、デバッガを使用している場合は、レジスタを表示して、プログラムした内容が含まれていることを確認できます。そのようにして、チップの動作についてももっと学んだと思います。


2

8ビットの世界から来て、私はいつもレジスタを介して周辺機器のプログラミングに慣れていました。マイクロコントローラのデータシート(STM32リファレンスマニュアルなど)では、レジスタ表記のみで周辺機器について説明しています。プログラマは、これを使用する前に、周辺機能と機能について知るために、これとまったく同じドキュメントを読まなければならないので、レジスタのプログラミングを始めるのは自然なことです。細心の注意を払ったコードレイアウトとコメントを使用すると、数か月後に戻った後でも、コードを快適に読んだり変更したりすることができます。


2

これまで私はCMSIS定義を使用し、レジスタを直接使用することを楽しんでいました。一方、私はいくつかのプロジェクトでHALライブラリを使用しました。コードの実行時間に大きな影響を与えたため、終了しました。CMSISは私の興味に役立ちますが、最近はlibopencm3のファンになります。LLSTが提供するライブラリに似ています。ただし、STファミリの場合でも、より多くのマイクロコントローラーをカバーしています。

libopencm3プロジェクト(以前はlibopenstm32と呼ばれていました)は、ST STM32、東芝TX03、Atmel SAM3U、NXP LPC1000などを含むさまざまなARM Cortex-M3マイクロコントローラー用のフリー/ライブラリ/オープンソースファームウェアライブラリを作成することを目的としています。

その点に注意してください:

libopencm3は、名前にもかかわらず、たとえばCortex-M0やCortex-M4 / Cortex-M4FなどのARM Cortexに関連する他のマイクロコントローラーもサポートしています。

サポートされているマイクロコントローラーのリストはこちらにあります


実際の問題は、STがHALが何をすべきかについて間違った考えを持っていることです。適切なHALには、adc_get_result()リアルタイムアスペクト、割り込みなどを含む完全なADC周辺機器ドライバーをラップするような機能がありwrite_to_scary_registerます。公平を期すと、このような過剰な膨張を提供するベンダーはSTだけではありません。AtmelASFなども同様に悪いです。
ランディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.