Azure Sphere ベース API の概要
Azure Sphere アプリケーション ランタイムには、高度なアプリケーション開発に使用できる基本 API が定義された一連の共通ライブラリが含まれています (POSIX ベースの C 標準ライブラリ、curl ベースの HTTP クライアント ライブラリ、Azure IoT C SDK ライブラリ)。
このトピックでは、Azure Sphere に含まれる基本 API を調べる方法と、基本 API のリファレンス ドキュメントを探す場所について説明します。 デバイス固有の API の詳細については、Applibs の API に関するページを参照してください。
サポートされていない関数
Azure Sphere アプリケーション ランタイムの API サーフェスに明示的に含まれている基本 API 関数だけを使うことが重要です。 サポートされていない関数をアプリケーションで呼び出すと、Azure Sphere OS の将来のリリースと互換性がなくなり、デバイスが不安定になる可能性があります。 追加機能のサポートを要求する場合は、 Azure Sphere Community フォーラム を使用して要求を行うことができます。
関数を確認する
関数呼び出しがサポートされているかどうかを判断するには、Visual Studio で IntelliSense のオートコンプリートを使うか、または Azure Sphere SDK のヘッダー ファイルに含まれていることを確認します。 各ライブラリのヘッダー ファイルの場所は、後のセクションで示します。 今後、これらのライブラリの関数が追加または変更された場合は、このトピックでそれらの一覧を示します。
musl C 標準ライブラリ
Azure Sphere には、 musl C 標準ライブラリ (musl libc) が付属しています。 glibc と同様に、musl libc は POSIX に準拠した標準 C ライブラリです。 musl libc と glibc の機能上の違いについては、 musl libc wiki に記載されています。
Azure Sphere のセキュリティ ポリシーとアーキテクチャと一貫性があり、すべての POSIX 関数が公開されるわけではありません。 たとえば、Azure Sphere では、open() 関数や fopen() 関数はサポートされていません。 ライブラリのサポートされている API サーフェス全体は、Azure Sphere SDK のヘッダー ファイルで定義されています。 現在の実装は、将来のリリースで変更される可能性があります。
API リファレンス: POSIX 仕様
ヘッダー ファイルの場所: Sysroots\API set\usr\include (Windows OS) または Sysroots/API set/usr/include (Linux OS) フォルダー。
ヒント
Sysroots\API set\usr\include\sys フォルダーには低レベルのシステム依存 API のヘッダーが含まれていますが、Sysroots\API set\usr\include 親フォルダーには一般的な API のヘッダーが含まれています。 これは Linux の場合も同様です。 一般的な API を使用することをお勧めします。
最新の SDK をダウンロード はこちら。
C 標準ライブラリの機能
次の C 標準ライブラリの機能の重要な部分が除外されています。
- ファイル システムのパス
- ターミナルのサポート
- 認証と権限承認
- Syscall 関数
- System V (SysV)
fcntl
fcntl(int fd, int cmd, .../* arg */)関数の CMD が公開され、使用できます。
- F_GETFL - ファイル アクセス モードと関連するファイルステータスフラグを取得します。
- F_SETFL - arg によって設定されるファイル記述子のファイルステータスフラグを設定します。
- O_NONBLOCK - F_SETFL専用に公開される引数。
fcntl()関数の標準的な使用方法については、MUSL ライブラリを参照してください。
C 型のtime_t
2038 年の UNIX エポック ロールオーバーの準備として、 musl libc バージョン 1.2 には、32 ビットから 64 ビットまでの C 型 time_t
とそのすべての派生物の更新が含まれていました。 この更新プログラムの詳細については、「 musl time64 リリース ノートを参照してください。
20.10 ターゲット API セット (sysroot 7) 以降に対してコンパイルされたアプリケーションでは、64 ビット バージョンの time_t
が使用されます。 以前のバージョンの Azure Sphere SDK またはターゲット API セット 20.04 (sysroot 5) 以前を使用してビルドされたアプリケーションでは、引き続き 32 ビット定義のtime_tを使用できます。 Azure Sphere OS の新しいバージョンでは、これらのアプリケーションに同じアプリケーション バイナリ インターフェイス (ABI) が引き続き提供されます。
time_t
値のサイズに関する想定を行わないアプリケーション コードは影響を受けません。 ただし、 time_t
値が 32 ビットであると明示的または暗黙的に想定するアプリケーション コード (たとえば、 time_t
値をuint32_tにキャストするなど) は、64 ビット バージョンを反映するように書き換える必要があります。
次のスニペットは、 time_t
が 32 ビット値であり、20.10 SDK (sysroot 7) 以降で再コンパイルするとバッファー オーバーランが発生することを前提としています。
// Incorrect code that assumes a 32-bit time_t value
time_t t = time(NULL);
char buffer[4];
memcpy(buffer, &t, sizeof(t)); // <-- buffer overrun when time_t is 64 bits
次の修正されたコードでは、バッファーが time_t
値と同じサイズに定義されているため、 time_t
のサイズに関する前提条件は削除されます。
// Corrected version of the code. It does not hard-code the size of time_t
time_t t; // time_t represents the 64-bit struct.
char buffer[sizeof(time_t)]; // Buffer size is based on the actual size of time_t
memcpy(buffer, &t, sizeof(t));
32 ビットの時間値を引き続き使用する必要がある場合は、新しいバージョンの musl で time32_t
型を使用します。 次のコード スニペットは、その方法を示しています。
// Corrected version of the code for cases where 32-bit time_t is needed
time32_t t = /* ... initialize 32-bit value ... */;
char buffer[sizeof(time32_t)];
memcpy(buffer, &t, sizeof(t));
curl ライブラリ
Azure Sphere SDK には、libcurl マルチ プロトコル転送ライブラリのサブセットが含まれています。 この API を使用して、HTTP/HTTPS 経由でデータを転送できます。 他の転送プロトコルはサポートされていません。 ライブラリのサポートされている API サーフェス全体は、Azure Sphere SDK のヘッダー ファイルで定義されています。
API リファレンス: libcurl Web サイト
ヘッダー ファイルの場所: Sysroots\API set\usr\include\curl (Windows OS) フォルダーまたは Azure Sphere SDK インストール ディレクトリの Sysroots/API set/usr/include/curl (Linux OS) フォルダー。