Azure Sphere Base API の概要
Azure Sphere Application Runtime には、POSIX ベースの C 標準ライブラリ、curl ベースの HTTP クライアント ライブラリ、Azure IoT C SDK ライブラリなど、高度なアプリケーション開発に使用できる基本 API を定義する一連の共通ライブラリが含まれています。
このトピックでは、Azure Sphere に含まれている基本 API と、基本 API の参照ドキュメントを見つける場所を決定する方法について説明します。 デバイス固有の API の詳細については、「 Applibs API」を参照してください。
サポートされていない関数
Azure Sphere Application Runtime の 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) または Azure Sphere SDK インストール ディレクトリの 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
サイズに関する前提を持たないアプリケーション コードは影響を受けません。 ただし、値が 32 ビットであると明示的または暗黙的に想定する time_t
アプリケーション コード (たとえば、値をuint32_tにキャスト time_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) フォルダー。