| 項目 | Dabao | Raspberry Pi Pico 2 | ESP32-DevKitC | Teensy 4.1 | Adafruit Feather M4 | BBC micro:bit v2 |
|---|---|---|---|---|---|---|
| メーカー | Baochip | Raspberry Pi Ltd | Espressif Systems | PJRC | Adafruit | Micro:bit Educational Foundation |
| MCU / SoC | Baochip-1x(シングルコア Vexriscv) | RP2350(デュアルコア Cortex-M33) | ESP32(デュアルコア Xtensa LX6) | NXP iMXRT1062(Cortex-M7) | SAMD51(Cortex-M4F) | nRF52833(Cortex-M4F) |
| クロック周波数 | 350 MHz | 150 MHz | 240 MHz | 600 MHz | 120 MHz | 64 MHz |
| I/O コプロセッサ | BIO(PicoRV ×4 @ 700 MHz) | PIO ブロック ×2(ステートマシン 8基) | ULP コア ×2(RISC-V / FSM) | FlexIO | SERCOM | なし |
| ハードウェアセキュリティ | 署名付きブート、TRNG、鍵ストア、ワンウェイカウンタ、RSA、ECC、ECDSA、X25519、SHA-256/512、SHA3、Blake2/3、AES;セキュアメッシュ、グリッチセンサ、ECC 保護 RAM | TrustZone、署名付きブート、OTP 鍵ストア、HW SHA-256、TRNG | eFuse セキュアブート + AES フラッシュ暗号化、HW RNG | HAB セキュアブート、AES-256 暗号化 XIP(ロック可能) | NVM の読み出し保護のみ | 読み出し保護のみ;HW 暗号なし |
| IRIS で検査可能 | 対応 | 非対応 | 非対応 | 非対応 | 非対応 | 非対応 |
| ブートローダがオープン | オープン | オープン | 非公開 | 非公開 | 非公開 | 非公開 |
| RTL がオープン | ほぼオープン | 非公開 | 非公開 | 非公開 | 非公開 | 非公開 |
| メモリ保護 | MMU | MPU + TrustZone | MPU 相当 | MPU | MPU | MPU |
| スワップメモリ | 対応(Xous + 外部 PSRAM) | 非対応 | 非対応 | 非対応 | 非対応 | 非対応 |
| Rust ネイティブ | 対応 | 非対応 | 非対応 | 非対応 | 非対応 | 非対応 |
| RAM | 2048 KB + I/O バッファ 256 KB | 520 KB | 520 KB | 1 MB | 192 KB | 128 KB |
| Flash | 4 MB(内蔵 RRAM) | 4 MB | 4 MB | 8 MB + SD スロット | 内蔵 512 KB + 外付け 2 MB | 内蔵 512 KB |
| Flash インターフェース | 内蔵 XIP(最大 1200 MB/s) | QSPI(XIP 約 56 MB/s) | QSPI(約 40 MB/s) | FlexSPI octal/quad(XIP 約 100 MB/s) | 内蔵 NVM(XIP 推定約 400 MB/s) | 内蔵 NVM(推定 20–40 MB/s) |
| GPIO ピン | 20 | 26 | 34 | 55 | 20 | 大ピン5 / 全19 |
| 無線 | なし | なし(W 版は Wi-Fi/BT 搭載) | Wi-Fi + Bluetooth 4.2 | なし(アドオンあり) | なし(Wing エコシステム) | Bluetooth 5.0 + 2.4 GHz |
| USB | USB-C(USB 2.0 HS デバイス) | Micro-USB(ネイティブ) | Micro-USB(CP2102 経由) | USB-C(ネイティブ、デバイス + ホスト) | Micro-USB | Micro-USB |
| 価格(目安) | $12 | $5–$7 | $8–$12 | $30–$35 | $20–$24 | $15–$18 |
| 向いている用途 | セキュリティ、高信頼性、汎用 | 汎用、MicroPython/C++ | IoT、無線接続 | オーディオ DSP、高速データ、USB MIDI/HID | CircuitPython、モジュール式 Wing 拡張 | 教育、子ども向け、授業でのコーディング |
#include <stdint.h>
#include "bio.h" // これは必ず一番最初に書くこと
#define GPIO_PIN 21
void main(void) {
uint32_t output_mask = 1 << GPIO_PIN;
set_gpio_mask(output_mask);
set_output_pins(output_mask);
clear_gpio_pins_n(!output_mask); // Low に駆動
while (1) {
for(int i = 0; i < 10; i++) {
set_gpio_pins(output_mask);
}
for(int i = 0; i < 10; i++) {
clear_gpio_pins_n(!output_mask); // ピンを Low に駆動
}
}
}
// コア0 で動く
void main(void) {
uint32_t tx = 0;
uint32_t rx;
while(1) {
push_fifo1(tx);
rx = pop_fifo0();
tx = rx + 1;
}
}
// コア1 で動く
void main(void) {
uint32_t rx;
while(1) {
rx = pop_fifo1();
push_fifo0(rx + 1);
}
}
git clone --depth 1 https://github.com/betrusted-io/xous-core/
cd xous-core
git fetch --depth 1 origin tag v0.10.1
rustup update」で最新化してください
cargo xtask dabao dabao-console
impl<'a> ShellCmdApi<'a> for Ver {
cmd_api!(ver);
fn process(&mut self, args: String, env: &mut CommonEnv) ->
Result<Option<String>, xous::Error> {
use core::fmt::Write;
let mut ret = String::new();
let helpstring = "ver [xous]";
let mut tokens = args.split(' ');
if let Some(sub_cmd) = tokens.next() {
match sub_cmd {
"xous" => {
write!(ret, "Xous version: {}", env.ticktimer.get_version()).unwrap();
log::info!("VER.XOUS,{}", env.ticktimer.get_version());
}
_ => {
write!(ret, "{}", helpstring).unwrap();
}
}
} else {
write!(ret, "{}", helpstring).unwrap();
}
Ok(Some(ret))
}
}
fn process(&mut self, args: String, _env: &mut CommonEnv) -> Result<Option<String>, xous::Error> {
use core::fmt::Write;
let mut ret = String::new();
#[allow(unused_variables)]
let helpstring = "test [proc] [freemem] [interrupts] [panic] [env]";
let mut tokens = args.split(' ');
if let Some(sub_cmd) = tokens.next() {
match sub_cmd {
"blink" => {
log::info!("Add blinky code here");
}
vscode 拡張を使って:
[console]
[console] test blink
INFO:dabao_console::cmds::test: Add blinky code here (apps-dabao\dabao-console\src\cmds\test.rs:25)
"blink" => {
use std::time::Duration;
use bao1x_api::{IoGpio, IoxDir, IoxHal, IoxPort, IoxValue};
let iox = IoxHal::new();
iox.set_gpio_pin_dir(IoxPort::PB, 4, IoxDir::Output);
loop {
iox.set_gpio_pin_value(IoxPort::PB, 4, IoxValue::High);
std::thread::sleep(Duration::from_secs(1));
iox.set_gpio_pin_value(IoxPort::PB, 4, IoxValue::Low);
std::thread::sleep(Duration::from_secs(1));
}
}