Pigweed 是 Google 開源的一套面向嵌入式開發的 C++ 模塊化庫集合。它的目標很直接——幫助大型嵌入式開發團隊以更快的速度、更高的可靠性交付產品。
Pigweed相關鏈接:
官方網站:https://pigweed.dev/
源代碼倉庫:https://github.com/google/pigweed

Pigweed 的模塊設計為“按需采用”——我們不需要全盤接受,只需要引入項目真正需要的部分,它已經在數百萬臺消費設備中經受考驗。
Pigweed把"業務做什么"和"硬件怎么做"徹底拆開。

HAL定義“怎么做”的接口。Pigweed 為各種硬件外設提供了標準化的 C++ 抽象接口:
pw_digital_io | |
pw_i2c | |
pw_spi | |
pw_sensor |
每個模塊都是"接口 + 后端實現"的模式。接口定下來,換硬件就換后端,上層代碼一行不動。
OSAL隔離 RTOS 差異。Pigweed 的操作系統抽象層可以在裸機、FreeRTOS、Zephyr、ThreadX 甚至 Linux 上工作。主要模塊包括:

這些 API 的設計與 C++ STL 高度相似,開發者上手成本很低。
RPC 與模擬測試讓業務邏輯“不依賴硬件”也能跑。
Pigweed 的 pw_rpc 模塊支持通過 HDLC 等協議進行遠程過程調用。更厲害的是 Host Device Simulator——它可以讓我們在Linux上模擬嵌入式設備的行為, spawning 線程來模擬 RPC、日志等設施。
這意味著什么?
我們可以在不連接任何真實硬件的情況下,在 PC 上完成業務邏輯的全部開發和測試。
下面,我們用 Pigweed 搭一個溫控器,硬件包括:I2C 溫度傳感器 + GPIO 加熱器。
thermostat/
├── hal/ # 抽象接口定義
│ ├── temperature_sensor.h
│ └── heater.h
├── drivers/ # 具體硬件實現(唯一跟硬件打交道的地方)
│ ├── i2c_temp_sensor.cc
│ └── gpio_heater.cc
├── business/ # 業務邏輯(PID控制器)
│ └── temperature_controller.cc
├── app/
│ └── main.cc # 組裝所有模塊
└── test/ # 單元測試,不接硬件
抽象接口(位于 hal/temperature_sensor.h):
class TemperatureSensor {
public:
virtual pw::Result<float> ReadCelsius() = 0;
virtual pw::Status Init() = 0;
};
沒有任何硬件細節——不出現 /dev/i2c-1,不出現寄存器地址。
具體驅動(位于 drivers/i2c_temp_sensor.cc):
pw::Result<float> I2cTemperatureSensor::ReadCelsius() {
// 只有這一處知道怎么跟硬件對話
uint8_t data[2];
pw::i2c::Message msgs[] = {
pw::i2c::Message::Write(kTempRegister),
pw::i2c::Message::Read(data),
};
i2c_device_.DoWriteReadFor(msgs);
return (data[0] << 8 | data[1]) / 256.0f * 165.0f - 40.0f;
}
業務邏輯(位于 business/temperature_controller.cc):
pw::Status TemperatureController::Update() {
float current = sensor_.ReadCelsius(); // 不知道背后是I2C還是SPI
float output = pid_.Compute(setpoint_, current);
if (output > 0.5f) heater_.TurnOn(); // 不知道GPIO是幾號引腳
else if (output < -0.5f) heater_.TurnOff();
return pw::OkStatus();
}
業務層根本不知道"溫度怎么讀到的",它只知道"我調了 ReadCelsius() 就能拿到溫度"。
應用層組裝(位于 app/main.cc):
void UserAppInit() {
// 在應用層把具體硬件"注入"到業務邏輯里
pw::i2c::LinuxInitiator i2c_bus("/dev/i2c-1");
I2cTemperatureSensor sensor(i2c_bus, 0x48);
GpioHeater heater(17);
TemperatureController ctrl(sensor, heater, 2.0f, 0.5f, 0.1f);
ctrl.SetSetpoint(25.0f);
while (true) {
ctrl.Update();
pw::thread::sleep_for(std::chrono::milliseconds(200));
}
}
TemperatureController 不關心 sensor 是 I2C 還是 SPI,不關心 heater 的 GPIO 是 17 號還是 23 號。它只要"能讀溫度、能開關加熱器"就行。
換硬件的時候,改哪里?

Pigweed 的 OS 抽象層可以在 Linux、FreeRTOS、Zephyr、ThreadX 等不同環境下工作。同一份業務邏輯代碼,可以在開發機上模擬運行,也可以燒錄到 MCU 上真實運行。
Pigweed 的 Host Device Simulator 可以在你的 Linux 機器上模擬整個嵌入式設備。我們可以:
Pigweed 的模塊針對資源受限的硬件進行了高度優化,同時支持 C++20 的現代特性(如無堆分配的協程)。它的 API 設計遵循 STL 風格,開發者上手成本低。
Pigweed提供了一套經過 Google 實戰檢驗的“工程化方案”。它幫我們把“做什么”和“怎么做”干凈地分開,讓業務代碼干干凈凈,讓硬件驅動各司其職。

END
來源:嵌入式大雜燴