①マクロ宣言

このコード部分の話

#![no_std]
#![no_main]

マクロ(#![no_std]#![no_main]

Rustのマクロは、コンパイル時に処理されます。 コンパイルする時にコードを上書きしてくれるイメージです。 これは、C言語の#defineに少し似ています。 書き方は、#![macro_name]です。 他にも関数のような使い方ができるマクロもあり、info!(argument)がそれに当たります。

そして、最初の2行に#![no_std]#![no_main]が記載されているかと思いますが、これもマクロです。

#![no_std]

#![no_std]は、Rustのstdクレートの代わりにcoreクレートをリンクします。 このstdクレートは、WindowsやLinuxといったOS上で動作するソフトウェアに対して利用できます。 一方で、今回の組み込みソフトウェアでは、OSなしのベアメタル環境になるめstdクレートが利用できません。 そのため、OSなしの環境でも動作するcoreクレートに切り替える必要があるわけです。

#![no_main]

#![no_main]は、Rustコンパイラの通常のエントリポイント(main関数)を利用しないことを意味します。 通常のmain関数を利用しない代わりに、今回のコードでは#[rp2040_hal::entry]というマクロを宣言しています。 つまり、RP2040専用のエントリポイントを利用しているということです。

Point

少し難しい説明でしたが、ベアメタル(OSなし)の環境ではstdクレートとmain関数が利用できないため、#![no_std]#![no_main]を宣言する必要があると覚えておけば初めは問題ないです。