基底 API
重要
這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。
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 社群論壇 提出要求。
驗證函式
若要判斷是否支援函數調用,請在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 函式
- 系統 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 epoch 變換做準備, musl libc 1.2 版包含從 32 位到 64 位的更新,以及 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 位時間值,請使用 time32_t
新版 musl 中的類型。 下列代碼段示範如何:
// 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 網站
頭檔位置: Azure Sphere SDK 安裝目錄的 Sysroots\API set\usr\include\curl (Windows OS) 資料夾或 Sysroots/API set/usr/include/curl (Linux OS) 資料夾。