Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Android

Giải mã khả năng tiết kiệm năng lượng của Android:Vai trò của cài đặt ổ cắm Bluetooth ở Đảo năng lượng thấp của AOSP

Giải mã khả năng tiết kiệm năng lượng của Android:Vai trò của cài đặt ổ cắm Bluetooth ở Đảo năng lượng thấp của AOSP

Hãy hình dung thế này:bạn đang ngồi trong quán cà phê với máy tính xách tay đang mở, điện thoại trên bàn, đồng hồ thông minh cứ kêu vài phút và tai nghe Bluetooth đang phát nhạc. Theo quan điểm của bạn, cuộc sống thật yên bình. Từ góc độ điện thoại của bạn, nó luôn xử lý vô số gói Bluetooth cực nhỏ.

Mỗi khi đồng hồ đồng bộ hóa các bước của bạn, mỗi khi tai nghe của bạn nhận được một đoạn âm thanh khác, mỗi khi thiết bị chạy nền kiểm tra – bộ xử lý ứng dụng chính bên trong điện thoại của bạn buộc phải thức dậy, xem dữ liệu, quyết định xem phải làm gì với dữ liệu đó rồi quay lại chế độ ngủ. Hãy làm điều đó vài nghìn lần và đột nhiên viên pin 5000 mAh xinh xắn đó bắt đầu nhỏ đi một cách đáng ngờ.

Các kỹ sư Android đã xem xét mô hình này và về cơ bản đã nói, điều gì sẽ xảy ra nếu chúng ta không đánh thức CPU lớn cho mọi thứ Bluetooth nhỏ bé? Điều gì sẽ xảy ra nếu chúng ta có một bộ não trợ giúp nhỏ hơn có toàn bộ công việc là xử lý lưu lượng Bluetooth lặp đi lặp lại nhàm chán trong khi CPU chính thư giãn? Đó chính xác là nơi xuất hiện khái niệm Đảo quyền lực thấp, thường được rút ngắn thành LPI.

Trong kiến trúc Android Bluetooth hiện đại, đặc biệt là từ thế hệ AOSP 16 trở đi, một lượng lớn công việc Bluetooth có thể được chuyển sang bộ xử lý chuyên dụng tiêu thụ điện năng thấp đặt gần đài Bluetooth hơn. Bộ xử lý nhỏ này được nhúng trong bộ điều khiển Bluetooth hoặc SoC và được thiết kế để chạy rất hiệu quả. Nó tiêu thụ ít năng lượng hơn nhiều so với CPU chính và có thể hoạt động mà không làm hao pin như một bộ xử lý ứng dụng đầy đủ. Công việc của Android là quyết định lưu lượng nào có thể tồn tại trên hòn đảo này và lưu lượng nào vẫn cần CPU chính.

Nhưng làm thế nào để Android đưa ra quyết định đó trong thực tế? Đây là nơi ổ cắm Bluetooth và thứ gọi là BluetoothSocketSettings phát huy tác dụng.

Trong một ứng dụng thông thường, khi bạn mở BluetoothSocket, bạn sẽ có cảm giác như đang mở một đường dẫn để có thể gửi và nhận byte. Tuy nhiên, về cơ bản, khuôn khổ này đang đặt ra một câu hỏi sâu sắc hơn nhiều:đường ống này có nên đi qua đường cao tốc lớn đánh thức CPU chính hay đường ống này có thể được kết nối trực tiếp vào mạng lưới đường riêng của hòn đảo năng lượng thấp?

Trong ngăn xếp Bluetooth AOSP mới nhất, câu trả lời cho câu hỏi đó được thể hiện thông qua một đối tượng cấu hình nhỏ:BluetoothSocketSettings. Lớp này cho phép mã cấp hệ thống mô tả cách hoạt động của ổ cắm. Nó có thể chỉ định liệu dữ liệu sẽ được lưu giữ trên đường dẫn máy chủ thông thường hay được chuyển tải vào đường dẫn dữ liệu phần cứng kết thúc trên bộ xử lý có công suất thấp.

Bên trong có các trường như DATA_PATH_NO_OFFLOADDATA_PATH_HARDWARE_OFFLOAD , cùng với các thông tin bổ sung như hubId , endpointId , và requestedMaximumPacketSize giúp bộ điều khiển hiểu cách định tuyến các gói trong thế giới LPI.

Nhìn từ bên ngoài, có vẻ như bạn đang làm việc với một BluetoothSocket bình thường. Tuy nhiên, bên trong khung Bluetooth, ổ cắm đó hiện được gắn thẻ siêu dữ liệu bổ sung để lặng lẽ thông báo cho ngăn xếp Bluetooth:cái này rất đặc biệt, hãy gửi nó đến đảo.

Sau đó, ngăn xếp máy chủ sẽ giao tiếp với một lớp mã mới trong hệ thống Bluetooth được gọi là trình quản lý giảm tải LPP và HAL (Lớp trừu tượng phần cứng) dành riêng cho ổ cắm để bộ xử lý công suất thấp có thể được thông báo bất cứ khi nào ổ cắm được mở hoặc đóng và có thể yêu cầu chịu trách nhiệm xử lý dữ liệu.

Vì vậy, nếu chúng ta giữ ví dụ về quán cà phê, trước đây mọi khách hàng Bluetooth đều hét lên yêu cầu của họ trực tiếp với nhân viên pha chế chính. Với Low Power Island và BluetoothSocketSettings, Android có thể nói, "những đơn đặt hàng cà phê espresso thông thường này có thể được chuyển đến nhân viên pha chế cấp dưới ở quầy phụ. Chỉ những đồ uống tùy chỉnh kỳ lạ mới được chuyển đến nhân viên pha chế chính". Người dùng có cùng trải nghiệm Bluetooth nhưng ít hỗn loạn hơn và ít lãng phí năng lượng hơn ở quầy tính tiền.

Trong bài viết này, chúng tôi sẽ đi sâu hơn từ câu chuyện cấp cao này vào các API Android thực tế. Chúng ta sẽ xem xét cách xác định BluetoothSocketSettings trong khung, cách bạn yêu cầu giảm tải phần cứng cũng như ý nghĩa thực sự của các trường trông đáng sợ như hubId và endpointId bằng tiếng Anh đơn giản.

Mục lục

  1. Cấu trúc của BluetoothSocketSettings

  2. Bên trong HAL:Quá trình tải xuống Bluetooth thực sự hoạt động như thế nào

  3. Khi CPU ngủ nhưng Bluetooth không hoạt động:Quản lý nguồn đang hoạt động

  4. Cách nhà phát triển có thể khai thác BluetoothSocketSettings

  5. Phần cuối cùng:Sự sang trọng của giấc ngủ thông minh

Cấu trúc của BluetoothSocketSettings

Cho đến nay chúng ta đã nói về BluetoothSocketSettings giống như một tấm vé thần kỳ nào đó gửi các gói của bạn đến một hòn đảo năng lượng thấp đầy nắng ở đâu đó bên trong điện thoại của bạn. Bây giờ chúng ta hãy thực sự xem tấm vé đó trông như thế nào trong mã.

Nếu bạn mở cây Dự án nguồn mở Android và điều hướng đến lớp khung, bạn sẽ tìm thấy định nghĩa lớp ẩn trong frameworks/base/core/java/android/bluetooth/BluetoothSocketSettings.java . Thoạt nhìn nó có vẻ nhỏ, gần như quá đơn giản đối với một thứ giúp bạn tiết kiệm nhiều pin đến vậy. Nhưng lớp nhỏ này chứa các hướng dẫn bí mật cho ngăn xếp Bluetooth biết nơi dữ liệu trong ổ cắm của bạn sẽ chảy.

Phiên bản rút gọn trông như thế này:

public final class BluetoothSocketSettings implements Parcelable {
 public static final int DATA_PATH_NO_OFFLOAD = 0;
 public static final int DATA_PATH_HARDWARE_OFFLOAD = 1;
 private int mDataPath;
 private int mHubId;
 private int mEndpointId;
 private int mRequestedMaxPacketSize;
 public BluetoothSocketSettings(int dataPath, int hubId, int endpointId,
 int requestedMaxPacketSize) {
 mDataPath = dataPath;
 mHubId = hubId;
 mEndpointId = endpointId;
 mRequestedMaxPacketSize = requestedMaxPacketSize;
 }
 public int getDataPath() { return mDataPath; }
 public int getHubId() { return mHubId; }
 public int getEndpointId() { return mEndpointId; }
 public int getRequestedMaxPacketSize() { return mRequestedMaxPacketSize; }
}

Khi một ổ cắm mới được tạo trong Android Bluetooth, hệ thống hoặc dịch vụ đặc quyền có thể chuyển một trong các đối tượng cài đặt này xuống ngăn xếp. Dòng chính là DATA_PATH_HARDWARE_OFFLOAD . Đó là công tắc thông báo cho hệ thống Bluetooth, này, hãy cố gắng duy trì lưu lượng truy cập này trên bộ vi xử lý của bộ điều khiển thay vì đánh thức CPU chính.

hubIdendpointId giống như những địa chỉ trên đảo. Chúng cho phần sụn biết cổng hoặc hàng đợi logic nào sẽ được sử dụng cho ổ cắm cụ thể đó. requestedMaxPacketSize giúp nó điều chỉnh việc phân bổ bộ đệm để có thể cân bằng thông lượng và hiệu quả sử dụng năng lượng.

Tại thời điểm này, bạn có thể tự hỏi, làm thế nào mà đối tượng Java nhỏ bé này thực sự có thể xâm nhập vào phần cứng? Câu trả lời nằm ở HAL (Lớp trừu tượng phần cứng). Khi bạn gọi một cái gì đó như BluetoothSocket.connect() , cuối cùng nó sẽ chuyển xuống mã gốc trong các tệp như btif_sock.ccbtif_core.cc . Ở đó, bạn sẽ thấy dấu vết như:

bt_status_t status = BTA_SockConnect(type, addr, channel, flags);
if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) {
 BTIF_TRACE_DEBUG("Configuring socket for hardware offload path");
 BTA_SockSetOffloadParams(settings.hub_id, settings.endpoint_id);
}

Đoạn mã này có thể trông đơn giản nhưng nó thể hiện sự thay đổi lớn về trách nhiệm. Thay vì gửi mọi gói lên ngăn xếp máy chủ, bộ điều khiển Bluetooth giờ đây có thể yêu cầu quyền sở hữu đường dẫn dữ liệu. Sau đó, phần sụn Bluetooth bên trong SoC sẽ đảm nhận vai trò xử lý việc truyền lại gói, xác nhận và kiểm soát luồng mà không cần liên tục đánh thức CPU chính.

Nếu bạn theo dõi nhật ký kernel của thiết bị trong quá trình kết nối như vậy, bạn thậm chí có thể phát hiện ra điều gì đó như:

bt_vendor: enabling LPI offload for handle 0x0041
bt_controller: lpi path active, cpu wakelocks released

Dòng nhật ký đó là sự xác nhận thầm lặng của bạn rằng đường dẫn dữ liệu đã di chuyển thành công đến đảo năng lượng thấp.

Về mặt con người, điện thoại chỉ quyết định rằng cuộc trò chuyện qua Bluetooth này có thể dự đoán đủ để bộ xử lý mini xử lý, vì vậy, nó lịch sự nói với CPU lớn:"Bây giờ bạn có thể ngủ trưa. Tôi hiểu rồi."

Trong phần tiếp theo, chúng ta sẽ theo dõi hành trình này sâu hơn một cấp, đi thẳng vào ranh giới HAL và phần sụn, để xem các cài đặt ổ cắm này biến thành định tuyến dữ liệu năng lượng thấp thực tế bên trong chip điều khiển như thế nào. Đây là nơi điều kỳ diệu thực sự của phần cứng xảy ra và nơi số tiền tiết kiệm được bắt đầu tăng lên từng miliwatt mỗi lần.

Bên trong HAL:Cách hoạt động thực sự của việc giảm tải Bluetooth

Cho đến nay, chúng ta chủ yếu sử dụng Java và các lớp gốc của Android, một căn hộ tiện nghi nơi các khung và dịch vụ hệ thống hoạt động. Nhưng bên dưới đó là một tầng hầm chứa đầy máy móc thông minh:Lớp trừu tượng phần cứng hoặc HAL. Đây là nơi Android ngừng nói chuyện với “đối tượng” và bắt đầu nói chuyện bằng opcode và bộ đệm, đồng thời là cầu nối giữa phần mềm và silicon.

Khi cờ BluetoothSocketSettings thông báo cho hệ thống “vui lòng sử dụng giảm tải phần cứng”, yêu cầu đó không dịch chuyển tức thời đến chip một cách kỳ diệu. Nó đi từng bước xuống ngăn xếp Bluetooth, xuyên qua JNI (Giao diện gốc Java) vào C++, sau đó vào HAL, được xác định bên trong hardware/interfaces/bluetooth/ .

Bắt đầu từ Android 14 và đặc biệt là trong AOSP 16, HAL đã phát triển thông minh hơn:giờ đây HAL hiểu được các khả năng của LPI và có thể định tuyến lưu lượng truy cập socket nhất định tới chúng.

Chúng ta hãy xem qua hàm HAL đơn giản hóa. Đây không phải là một đoạn hư cấu. Nó gần giống với những gì bạn có thể tìm thấy ở bluetooth_audio_hw.cc hoặc bluetooth_socket_hal.cc :

Return<void> BluetoothHci::createSocketChannel(
 const hidl_string& device, const BluetoothSocketSettings& settings,
 createSocketChannel_cb _hidl_cb) {
 int fd = -1;
 if (settings.data_path == DATA_PATH_HARDWARE_OFFLOAD) {
 ALOGI("LPI offload requested for socket on hub %d endpoint %d",
 settings.hub_id, settings.endpoint_id);
 fd = controller->allocateLpiChannel(settings.hub_id, settings.endpoint_id);
 } else {
 fd = controller->allocateHostChannel();
 }
 _hidl_cb(Status::SUCCESS, fd);
 return void();
}

Nói một cách dễ hiểu, phương pháp này giống như nhân viên giao thông ở ngã tư Bluetooth. Nó xem xét cài đặt ổ cắm của bạn và quyết định đường nào sẽ gửi dữ liệu của bạn. Nếu DATA_PATH_HARDWARE_OFFLOAD được đặt, đường dẫn dữ liệu sẽ được nối với MCU bên trong của bộ điều khiển thay vì bộ đệm phía máy chủ thông thường.

Cuộc gọi tới controller->allocateLpiChannel() là nơi HAL nói, "Được rồi, chip, vui lòng tạo một hàng đợi hoàn toàn nằm bên trong bộ xử lý công suất thấp của bạn." Bộ vi điều khiển này về mặt vật lý gần giống với đài Bluetooth hơn. Nó có thể tự xử lý các phản hồi xác nhận, các đợt bùng phát dữ liệu nhỏ và thậm chí cả một số thời gian giao thức, những việc thường yêu cầu đánh thức CPU chính.

Sau khi kênh này được tạo, khung và ứng dụng Android vẫn thấy bộ mô tả tệp bình thường, như thể ổ cắm hoàn toàn cục bộ. Điều kỳ diệu nằm ở chỗ bộ mô tả này được hỗ trợ bởi bộ nhớ do chương trình cơ sở quản lý và các đường dẫn DMA thay vì bộ đệm nhân Linux.

Nếu bạn đính kèm trình gỡ lỗi hoặc kết xuất nhật ký từ bộ điều khiển, bạn có thể thấy nội dung như:

bt_lpi_mcu: channel 0x03 opened for handle 0x0041
bt_hci: diverting ACL packets to LPI path
bt_lpi_mcu: sleeping host processor

Dòng thứ ba, sleeping host processor , là giấc mơ trở thành hiện thực của mọi kỹ sư điện. Theo đúng nghĩa đen, điện thoại sẽ tắt phần lớn hệ thống con CPU trong khi vẫn duy trì Bluetooth.

Đây cũng là nơi các nhà cung cấp như Qualcomm hay Broadcom thêm nước sốt đặc biệt của họ vào. HAL của họ thường bao gồm các móc nối bổ sung cho bộ định thời “duy trì hoạt động”, “khoảng thời gian kết hợp” và “truyền lại theo hướng chương trình cơ sở”. Những điều này đảm bảo kết nối luôn mượt mà ngay cả khi bộ xử lý chính không hoạt động.

Từ chế độ xem cấp cao, quy trình bây giờ trông như thế này:

App -> Bluetooth Framework -> JNI -> btif_sock -> HAL -> Controller MCU (LPI)

Mỗi lớp hiểu vừa đủ để truyền dùi cui một cách rõ ràng cho lớp tiếp theo. HAL đóng vai trò là người phiên dịch, nhận các cài đặt cấp cao và biến chúng thành các lệnh cấp thấp mà chương trình cơ sở của chip có thể thực thi.

Vào thời điểm đồng hồ thông minh của bạn gửi một gói hoặc tai nghe của bạn yêu cầu một đoạn âm thanh, CPU chính thậm chí không nhấp nháy. Toàn bộ giao dịch tồn tại và chết trong miền nhỏ của bộ điều khiển Bluetooth, tiêu thụ năng lượng thay vì nuốt chửng.

Trong phần tiếp theo, chúng ta sẽ khám phá cách kiến trúc giảm tải này tích hợp với hệ thống quản lý năng lượng của Android, bao gồm khóa đánh thức, chế độ ngủ gật và phối hợp hạt nhân, cũng như cách kiến trúc này đảm bảo rằng ngay cả khi CPU chính ở chế độ ngủ, kết nối không bao giờ bị lỡ nhịp.

Khi CPU ngủ nhưng Bluetooth không hoạt động:Quản lý nguồn đang hoạt động

Được rồi, chúng ta đã thấy cách giảm tải ổ cắm di chuyển từ lớp ứng dụng xuống HAL và cuối cùng đến MCU nhỏ bé nằm bên trong chip Bluetooth. Nhưng điều gì xảy ra tiếp theo? Điều gì sẽ xảy ra nếu CPU chính của điện thoại của bạn quyết định tạm dừng trong khi quá trình truyền tệp hoặc luồng âm thanh vẫn đang diễn ra? Điều đó có nguy cơ làm đứt kết nối Bluetooth không?

Đây là nơi vũ điệu quản lý năng lượng của Android bước vào. Đó là điệu nhảy giữa ba người biểu diễn:Power HAL , ngăn xếp Bluetoothhệ thống khóa hạt nhân .

Khi ổ cắm Bluetooth được định cấu hình cho Low Power Island, ngăn xếp Bluetooth của Android sẽ báo hiệu cho kernel rằng kết nối này có thể được duy trì mà không cần sự trợ giúp của CPU chính. Bên trong, nó sẽ xóa hoặc giảm tỷ lệ bộ hẹn giờ khóa chế độ thường giữ cho bộ xử lý luôn hoạt động trong khi lưu lượng Bluetooth. Trong nhật ký kernel, bạn có thể thấy nội dung như thế này:

wakelock: release "bt_wake" (LPI mode active)
bt_controller: firmware handling link supervision locally

Thông báo này là vàng cho các kỹ sư hệ thống. Nó cho bạn biết bộ điều khiển đã có toàn quyền sở hữu kết nối. Chương trình cơ sở Bluetooth hiện đang giám sát thời gian chờ giám sát, xử lý việc truyền lại và duy trì bộ đếm mã hóa.

Từ quan điểm của người quản lý nguồn, thiết bị Bluetooth có vẻ “không hoạt động” vì không có ngắt nào được tạo ra đối với CPU chính. Trong khi đó, bộ điều khiển MCU lặng lẽ trao đổi các gói với tai nghe hoặc đồng hồ thông minh của bạn bằng miền đồng hồ tiêu thụ điện năng thấp của riêng nó.

Để phối hợp điều này, Bluetooth HAL hiển thị các lệnh gọi lại nhỏ thông báo cho Power HAL bất cứ khi nào mức lưu lượng truy cập thay đổi. Bạn có thể tìm thấy đoạn mã như thế này trong bt_vendor_qcom.cc :

void bt_lpi_activity_update(bool active) {
 if (active)
 power_hint(POWER_HINT_LPI_ACTIVITY, 1);
 else
 power_hint(POWER_HINT_LPI_ACTIVITY, 0);
}

Khi active về 0, Power HAL biết rằng nó có thể cho phép các trạng thái ngủ của hệ thống sâu hơn (chẳng hạn như tạm dừng RAM), vì Bluetooth sẽ giúp mọi thứ tự hoạt động.

Điều kỳ diệu thực sự là người dùng không bao giờ nhận thấy bất kỳ điều gì trong số này. Điện thoại có thể ở trạng thái "ngủ", tắt màn hình, lõi CPU bị kiểm soát nhưng âm thanh Bluetooth của bạn vẫn phát, đồng hồ thông minh của bạn vẫn đồng bộ hóa và điện thoại của bạn vẫn có thể được phát hiện.

Nó gần như nên thơ. Bộ xử lý chính đang mơ màng, bộ điều khiển kêu nho nhỏ và danh sách phát của bạn vẫn tiếp tục phát như chưa có chuyện gì xảy ra.

Nếu muốn xác minh điều này trên thiết bị Android thực, bạn có thể sử dụng lệnh:

adb shell cat /sys/kernel/debug/wakeup_sources | grep bt

Khi bạn thấy bt_wake đó bộ đếm vẫn ở mức thấp ngay cả khi đang phát trực tuyến, xin chúc mừng! Việc giảm tải của Đảo Năng lượng Thấp đang thực hiện rất tốt công việc của mình.

Trong phần tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về phần sụn để xem tất cả những điều này phù hợp như thế nào với thế giới của nhà phát triển hàng ngày. Bạn, với tư cách là nhà phát triển ứng dụng hoặc hệ thống, có thể thực sự kiểm soát hoặc hưởng lợi trực tiếp từ các cài đặt ổ cắm này không? Và làm cách nào để hiểu chúng có thể giúp bạn xây dựng các ứng dụng Bluetooth tiêu thụ năng lượng thay vì tiêu thụ năng lượng?

Cách nhà phát triển có thể khai thác BluetoothSocketSettings

Bây giờ chúng ta đã đi sâu vào trung tâm của ngăn xếp Bluetooth, hãy quay trở lại nơi bạn và tôi thực sự đang sống:lớp nhà phát triển. Bạn có thể thắc mắc, “Được rồi, tất cả những thủ thuật phần cứng đó đều tuyệt vời, nhưng thực tế tôi có thể làm với nó?”

Đây là phần thú vị:mặc dù Low Power Island chủ yếu là một tính năng cấp hệ thống, nhưng hiểu cách hoạt động của nó vẫn có thể giúp bạn thiết kế các ứng dụng Bluetooth tiết kiệm điện hơn và dễ dự đoán hơn.

Ở cấp khung, bạn không thể bật hoặc tắt LPI trực tiếp khỏi ứng dụng của mình. Những công tắc đó nằm sâu trong các thành phần hệ thống như BluetoothService và BluetoothSocketManagerService. Nhưng mỗi khi bạn sử dụng BluetoothSocket hoặc BluetoothServerSocket , dữ liệu của bạn sẽ âm thầm chảy qua các lớp đó để kiểm tra xem có giảm tải LPI hay không.

Điều đó có nghĩa là ứng dụng của bạn sẽ tự động được hưởng lợi miễn là bạn không làm bất cứ điều gì buộc CPU phải thức một cách không cần thiết . Ví dụ:sử dụng chế độ ngủ luồng thích hợp, tránh vòng lặp bận rộn và để luồng I/O Bluetooth của Android xử lý việc lưu vào bộ đệm sẽ giúp bạn tận dụng được logic giảm tải.

Nếu tìm hiểu nhật ký máy chủ hệ thống của AOSP trong khi kết nối ổ cắm Bluetooth, bạn có thể nhận thấy điều gì đó như thế này:

BluetoothSocketManager: Offload eligible socket detected, enabling LPI mode
Bluetooth HAL: LPI channel activated for fd=42

Dòng nhỏ đó cho bạn biết rằng ổ cắm của bạn đã được định tuyến lại một cách lặng lẽ qua hòn đảo mà bạn không cần nhấc ngón tay lên.

Bên dưới, framework đã tạo một BluetoothSocketSettings đối tượng và chuyển nó xuống chuỗi khi ổ cắm được mở. Trong giả Java, nó trông như thế này:

BluetoothSocketSettings settings =
 new BluetoothSocketSettings(
 BluetoothSocketSettings.DATA_PATH_HARDWARE_OFFLOAD,
 /* hubId */ 1,
 /* endpointId */ 2,
 /* maxPacketSize */ 512);
BluetoothSocket socket = adapter.createSocket(device, settings);
socket.connect();

Tất nhiên, đây chưa phải là một phần của SDK công khai, nhưng các ứng dụng hệ thống hoặc khung đặc quyền sử dụng các lệnh gọi tương tự để mô tả cách xử lý lưu lượng truy cập.

Vậy tại sao bạn, nhà phát triển, nên quan tâm? Bởi vì biết rằng một con đường như vậy tồn tại có nghĩa là bạn có thể thiết kế theo nó . Ví dụ:bạn có thể:

  • Ghi BLE nhỏ hàng loạt thay vì gửi từng cái một, cho phép bộ điều khiển xử lý chúng một cách hiệu quả bên trong bộ đệm giảm tải.

  • Tránh các chu kỳ kết nối/ngắt kết nối thường xuyên, điều này sẽ buộc ngăn xếp phải đánh thức CPU chính nhiều lần.

  • Cấu trúc quá trình truyền nền của bạn để phù hợp gọn gàng trong giới hạn của bộ đệm công suất thấp (hãy nghĩ đến các phần nhỏ hơn và khoảng thời gian dài hơn).

Về cơ bản, mẫu dữ liệu của bạn càng dễ dự đoán thì càng có nhiều khả năng ở lại đảo mà không đánh thức chủ nhà.

Nếu bạn đang xây dựng phần mềm hệ thống, chẳng hạn như thiết bị Android tùy chỉnh hoặc sản phẩm nhúng, thì bạn có thể tiến xa hơn nữa. Bạn có thể điều chỉnh hành vi HAL, gán ID trung tâm hoặc điểm cuối tùy chỉnh và thậm chí điều chỉnh kích thước gói tối đa mà chương trình cơ sở sử dụng để truyền DMA. Điều này cho phép bạn xây dựng các tính năng Bluetooth:chẳng hạn như truyền phát dữ liệu từ xa tiêu tốn ít năng lượng hoặc đồng bộ hóa cảm biến trên thiết bị đeo, chạy gần như hoàn toàn không tải.

Khi đó, chip Bluetooth của bạn sẽ trở thành một máy chủ mini tiếp tục hoạt động trong khi hệ điều hành chính ở chế độ ngủ, mang lại thời lượng pin vượt trội và khả năng kết nối lại nhanh chóng.

Trong phần cuối cùng, chúng ta sẽ tóm tắt mọi thứ và nhìn lại bức tranh toàn cảnh, tại sao BluetoothSocketSettings và Low Power Island cùng nhau đại diện cho một trong những ví dụ điển hình nhất về “kỹ thuật vô hình” của Android. Đó là một trong những chiến thắng thầm lặng mà bạn hiếm khi thấy trong một bài phát biểu quan trọng nhưng lại cảm nhận được hàng ngày khi điện thoại của bạn vẫn còn pin vào lúc nửa đêm.

Vòng chung kết:Sự sang trọng của giấc ngủ thông minh

Hãy lùi lại một chút. Chúng tôi bắt đầu ở một quán cà phê với một nhân viên pha chế làm việc quá sức. Sau đó, chúng tôi phát hiện ra một trợ lý ẩn, Đảo Năng lượng Thấp, có nhiệm vụ lặng lẽ giữ cho quán cà phê hoạt động ngay cả khi nhân viên pha chế chính bước đi.

Chúng tôi đi theo con đường của một ổ cắm Bluetooth khiêm tốn, chứng kiến nó được bọc trong BluetoothSocketSettings , đi qua HAL và cuối cùng đáp xuống một bộ xử lý thu nhỏ bên trong bộ điều khiển phát ra âm thanh trong khi CPU lớn mơ mộng.

Và đó chính là điểm hay của nó:Cơ chế giảm tải Bluetooth của Android là một trong những ví dụ điển hình nhất về kỹ thuật vô hình. Nó không tự thông báo bằng API mới hoặc hoạt ảnh lạ mắt. Nó chỉ âm thầm làm cho pin của bạn bền hơn, Bluetooth của bạn đáng tin cậy hơn và điện thoại của bạn cảm thấy mượt mà hơn mà bạn không hề biết rằng nó ở đó.

Từ góc độ kỹ thuật, sự sáng chói nằm ở sự cân bằng. Hệ thống vẫn cho phép các ổ cắm có đầy đủ tính năng và xử lý giao thức phong phú khi bạn cần, nhưng đối với các luồng dữ liệu thông thường, âm thanh, đo từ xa, thông báo hoặc truyền phát nhịp tim, hệ thống sẽ cho phép bộ điều khiển công suất thấp đảm nhiệm vai trò điều khiển. Giống như Android đã học cách ủy thác.

Mỗi khi đồng hồ thông minh của bạn đồng bộ hóa trong khi màn hình điện thoại tắt hoặc tai nghe của bạn vẫn được kết nối trong suốt chuyến bay dài mà không làm cạn kiệt pin, bạn sẽ thấy BluetoothSocketSettings và khuôn khổ Đảo Quyền lực Thấp đang hoạt động. Chúng là một phần của triết lý lớn hơn trong thiết kế Android hiện đại, đưa trí thông minh đến gần hơn với phần cứng. Chúng ta càng dạy chip xử lý các tác vụ tự động thì chúng ta càng có thể để bộ xử lý chính nghỉ ngơi.

Nếu bạn là nhà phát triển hoặc kỹ sư hệ thống, việc hiểu kiến trúc này không chỉ mang tính học thuật. Nó có thể truyền cảm hứng cho cách bạn thiết kế các tính năng của riêng mình. Cho dù bạn đang xây dựng ROM Android tùy chỉnh, tối ưu hóa chương trình cơ sở cho thiết bị đeo hay tạo thiết bị IoT bằng chip Bluetooth, bài học đều rõ ràng:đừng bắt CPU chính của bạn trông coi mọi gói tin. Giảm tải khi bạn có thể, ngủ khi cần thiết và thiết bị của bạn sẽ cảm ơn bạn với thời gian hoạt động thêm hàng giờ.

Vì vậy, lần tới khi bạn cắm tai nghe và nhận thấy điện thoại luôn mát và phần trăm pin hầu như không di chuyển, hãy nhớ:ở đâu đó sâu bên trong, một MCU Bluetooth nhỏ bé đang thực hiện tất cả những công việc nặng nhọc trong khi CPU chính tận hưởng giấc ngủ ngắn trên chiếc võng tiêu thụ điện năng thấp.

Đó chính là thiên tài thầm lặng của Low Power Island và BluetoothSocketSettings của Android. Nó không chỉ là về Bluetooth. Đó là việc dạy các thiết bị của chúng ta trở nên thông minh hơn chứ không phải bận rộn hơn. Và có lẽ, chỉ có thể thôi, đó cũng là một bài học đáng ghi nhớ cho chính chúng ta.

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu