Files
Docs/implementation_plan_complete.md
2025-12-31 16:18:28 +08:00

24 KiB
Raw Blame History

Avaota F1 <20><><EFBFBD><EFBFBD><E887AC><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>𧋦嚗鯝3.5
**<2A><EFBFBD>**嚗?025-12-17
撟喳蝱嚗鋫vaota F1 (<28><EFBFBD> V821 / 32-bit RISC-V)
憿寧𤌍餈𥕦漲嚗?00% - <EFBFBD><EFBFBD>隞餃𦛚皜<EFBFBD><EFBFBD>


<EFBFBD><EFBFBD> <20><>﹝霂湔<E99C82>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘜其<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𠗕<EFBFBD>寡圾<EFBFBD><EFBFBD>蝏誯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 憒<><E68692><EFBFBD><EFBFBD>嚗?- <20><> 隞餃𦛚餈𥕦漲<EFBFBD><EFBFBD><EFBFBD>蝔讠<EFBFBD><EFBFBD><EFBFBD>𧒄<EFBFBD>渡瑪 <20>?task_complete.md

  • <EFBFBD><EFBFBD> *<EFBFBD><EFBFBD>烐𠯫敹𡑒祕<EFBFBD>? <20>?Day1-8.md

<EFBFBD><20><><EFBFBD><EFBFBD><E88880><EFBFBD>

蝖砌辣憭𤥁挽

<EFBFBD> <EFBFBD>见噡/<2F>亙藁 摰䂿緵<EFBFBD><EFBFBD> <EFBFBD>喲睸<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>颲枏枂 MAX98357A (I2S) Device Tree + ALSA PD12/PD13/PD15, 16kHz
<EFBFBD><EFBFBD>颲枏<EFBFBD> <EFBFBD>輯蝸璅⊥<EFBFBD>暻血<EFBFBD>憌? Audio Codec ADC MIC Gain=25, 16kHz Mono
IMU ICM-42688-P GPIO 璅⊥<E79285> SPI 簣16g, 簣2000簞/s, ~500kHz
*<EFBFBD><EFBFBD><EFBFBD>憭? GC2083 (MIPI) MPP 獢<> 1280x720@20fps, JPEG Q80
蝵𤑳<EFBFBD> 隞亙云蝵?WiFi <EFBFBD>輯蝸 -

頧臭辣<EFBFBD><EFBFBD>

<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 霂湔<EFBFBD>
AudioCapture ALSA API 暻血<EFBFBD>憌𤾸<EFBFBD><EFBFBD><EFBFBD>S16_LE<EFBFBD><EFBFBD>
AudioPlayer ALSA API <EFBFBD>砍ㄟ<EFBFBD>冽偘<EFBFBD>?
ICM42688 GPIO + SPI<50>讛悅 <EFBFBD><EFBFBD><EFBFBD>訕PI撽勗𢆡
Camera MPP (VI/ISP/VENC) JPEG蝖砌辣蝻𣇉<EFBFBD>
UDPSender BSD Socket <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
WSClient <EFBFBD><EFBFBD><EFBFBD>?+ BSD Socket WebSocket摰<EFBFBD>蝡荔<EFBFBD><EFBFBD><EFBFBD>鈭諹<EFBFBD><EFBFBD>嗆㺭<EFBFBD><EFBFBD>
HTTPClient libcurl HTTP摰<EFBFBD>蝡?

蝻𤥁<EFBFBD>撌亙<EFBFBD><EFBFBD><EFBFBD><EFBFBD>湔鰵嚗帋蝙<EFBFBD>?musl嚗?

SDK_ROOT := ~/ProgramFiles/AvaotaF1/avaota_sdk/tina-v821-release

# <20>𩤃<EFBFBD> <20>喲睸靽格迤嚗帋蝙<E5B88B>?musl 撌亙<E6928C><E4BA99><EFBFBD>Day 9嚗?TOOLCHAIN_DIR := $(SDK_ROOT)/prebuilt/rootfsbuilt/riscv/nds32le-linux-musl-v5d/bin
CROSS_COMPILE := riscv32-linux-musl-

# <20><EFBFBD>蝵殷<E89DB5>銝滚<E98A9D>摰孵<E691B0><E5ADB5>烐踎嚗?# TOOLCHAIN_DIR := $(SDK_ROOT)/out/toolchain/nds32le-linux-glibc-v5d/bin
# CROSS_COMPILE := riscv32-unknown-linux-

CC := $(TOOLCHAIN_DIR)/$(CROSS_COMPILE)gcc
CXX := $(TOOLCHAIN_DIR)/$(CROSS_COMPILE)g++

**<2A>喲睸<E596B2>暹𦻖摨?*嚗?0+ <20><EFBFBD><E8B9B1><EFBFBD>嚗㚁<E59A97>

  • MPP獢<EFBFBD>沲嚗惨w_mpp, media_utils, awion
  • ISP憭<EFBFBD><EFBFBD>嚗?2銝杷SP摨?- 閫<><E996AB>蝻𤥁圾<F0A4A581><E59CBE><EFBFBD>vencoder, vdecoder, Cedar摨?- <20><EFBFBD><EFBFBD><E686AD>嚗惨decoder, aencoder, AGC, AEC
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗饢uxers, demuxer, parser

<EFBFBD><20><><EFBFBD>舫𠗕<E888AB><EFBFBD><EFBFBD><E996AB><EFBFBD><EFBFBD>

1. I2S <20><EFBFBD>颲枏枂<E69E8F>滨蔭

<EFBFBD><EFBFBD>

  • Device Tree <20><EFBFBD><E598A5>滨蔭<E6BBA8>躰秤
  • 撘閗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • simple-audio-card <20><EFBFBD><EFBFBD>虜撌乩<E6928C>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

// <20><><EFBFBD>?LVDS <20>𣂼<EFBFBD><F0A382BC>滨蔭嚗䔶蛹瘥譍葵撘閗<E69298><E99697>𥕦遣<F0A595A6><EFBFBD><E7A589><EFBFBD><EFBFBD>
&pio {
    sndcodec_pins_a: sndcodec@0 {
        pins = "PD12";
        function = "i2s0";
    };
    sndcodec_pins_b: sndcodec@1 {
        pins = "PD13";
        function = "i2s0";
    };
    sndcodec_pins_c: sndcodec@2 {
        pins = "PD15";
        function = "i2s0";
    };
};

**<2A>喲睸蝏誯<E89D8F>**嚗?- 雿輻鍂 pins + function <20><><EFBFBD>撅墧<E69285>?- <20><EFBFBD> allwinner,pins 蝑㕑䌊摰帋<E691B0>撅墧<E69285>?- 瘥譍葵撘閗<E69298><E99697><EFBFBD><E7A589><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B994>?

2. ICM-42688 <20>帋縑<E5B88B><EFBFBD><E5AF9E><EFBFBD>

I2C <20><EFBFBD>撠肽<E692A0><EFBFBD>仃韐伐<E99F90><E4BC90>?

**<2A><EFBFBD>**嚗?- PD1 鋡怠<E98BA1>隞硋<E99A9E><E7A18B><EFBFBD><E8B3A2>?- PL2/PL3 銝齿𣈲<E9BDBF>?TWI0

  • 霈曉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0x68) 雿<><E99BBF>蝏嘥<E89D8F>摮睃膥霂餃<E99C82>

**撠肽<E692A0><EFBFBD><E9A488><EFBFBD><EFBFBD>**嚗?1. GPIO 璅⊥<E79285> I2C 2. <20>湔揢<E6B994><EFBFBD>撘閗<E69298> (0x69) 3. 靚<><EFBFBD><EFBFBD>撱嗉<E692B1> 4. Bank 撖<><E69296><EFBFBD><EFBFBD><E585B8>? 蝏栞捏嚗𡁜虾<EFBFBD><EFBFBD><EFBFBD>鸌畾𠰴<EFBFBD>憪见<EFBFBD>摨誩<EFBFBD>嚗峕𦆮撘<EFBFBD>2C<EFBFBD><EFBFBD>

SPI <20><EFBFBD>摰䂿緵嚗<E7B7B5><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?

**摰䂿緵蝏<E7B7B5><E89D8F>**嚗?```cpp // GPIO 璅⊥<E79285> SPI Mode 0 (CPOL=0, CPHA=0) void spiTransfer(uint8_t data) { for (int i = 7; i >= 0; i--) { gpio_set_value(MOSI, (data >> i) & 0x01); usleep(1); // ~500kHz gpio_set_value(SCLK, 1); // 銝𠰴<E98A9D>瘝? usleep(1); gpio_set_value(SCLK, 0); } }


**撘閗<E69298><E99697>滨蔭**嚗?- SCLK: PD3 (GPIO 99)
- MOSI: PD2 (GPIO 98)
- MISO: PD4 (GPIO 100)
- CS: PD5 (GPIO 101)

**<2A><EFBFBD>**嚗?- <20>笔漲嚗鰺500kHz
- WHO_AM_I 霂<><E99C82>嚗?x47 <20>?- <20>唳旿蝔喳<E89D94><E596B3><EFBFBD>隡条<E99AA1>

---

### 3. <20><EFBFBD><E8B9B1><EFBFBD>霂煾曎<E785BE>仿◇摨?
#### <20><EFBFBD>

undefined reference to pthread_create


#### 閫<><E996AB><EFBFBD><EFBFBD>
```makefile
# <20>躰秤憿箏<E686BF>
LDFLAGS += -lpthread -lssl -lcrypto

# 甇<>憿箏<E686BF>
LDFLAGS += -lssl -lcrypto -lpthread -lm -lstdc++

**閫<><E996AB>**嚗?1. 銝𡁜𦛚摨枏銁<E69E8F>?2. 蝟餌<E89D9F>摨枏銁<E69E8F>?3. -lpthread -lm -lstdc++ <20><EFBFBD><E69AB9>?

4. MPP 獢<><EFBFBD><E6B2B2><EFBFBD>

蝻枏<EFBFBD><EFBFBD><EFBFBD>蝵桐<EFBFBD><EFBFBD>?

**<2A><EFBFBD>**嚗间BV 蝻枏<E89DBB><E69E8F>箸滯<E7AEB8>箏紡<E7AE8F>游葷銝

**閫<><E996AB><EFBFBD><EFBFBD>**嚗?```cpp // VI 蝻枏<E89DBB><E69E8F><EFBFBD>蝵?vipp_attr.nbufs = 5; // 5銝杼I蝻枏<E89DBB><E69E8F>?vipp_attr.nplanes = 1;

// VBV <20>滨蔭 aw_enc_attr.VeAttr.mMaxKeyInterval = 30; aw_enc_attr.VeAttr.mVbvBufferSize = 4 * 1024 * 1024; // 4MB


**<2A>喲睸蝏誯<E89D8F>**嚗?- VI蝻枏<E89DBB><E69E8F><EFBFBD>摰𡏭<E691B0>憭改<E686AD><E694B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?- VBV<42><56><EFBFBD>寞旿<E5AF9E><E697BF><EFBFBD><EFBFBD>㟲
- JPEG蝻𣇉<E89DBB>韐券<E99F90>80銝箸<E98A9D>雿喳像銵∠<E98AB5>

---

### 5. 撌亙<E6928C><E4BA99><EFBFBD>蝵格𤣰<E6A0BC>?(Day 7-8)

#### <20><EFBFBD>
- README.md <20>𣂼<EFBFBD> `riscv32-linux-musl` 撌亙<E6928C><E4BA99><EFBFBD>摮睃銁
- 憭帋葵Makefile<6C>滨蔭銝滢<E98A9D><E6BBA2>?- <20><><EFBFBD>𡁏𧋦頝臬<E9A09D>瘛瑚僚

#### 閫<><E996AB><EFBFBD><E9A488>
1. <20>亥砭 `tina_files_clean.csv` <20><>辣蝝<E89D9D>
2. <20><EFBFBD><E586BD>膥銝𢠃<E98A9D><EFBFBD><E99C82><EFBFBD><EFBFBD>楝敺?3. <20>𤑳緵 musl 撌亙<E6928C><E4BA99>曆蛹<E69B86>讠憬<E8AEA0><E686AC><EFBFBD><EFBFBD>芾圾<E88ABE><EFBFBD>
4. 蝖株恕雿輻鍂 glibc 撌亙<E6928C><E4BA99><EFBFBD>撌脰圾<E884B0>见虾<E8A781><EFBFBD>

#### <20><><EFBFBD><E89D8F>蝵?```bash
# 摰鮋<E691B0>撌亙<E6928C><E4BA99>曇楝敺?out/toolchain/nds32le-linux-glibc-v5d/bin/

# 蝻𤥁<E89DBB><F0A4A581><EFBFBD>蝚血噡<E8A180>暹𦻖嚗?riscv32-unknown-linux-g++ -> riscv32-linux-g++

# C摨?glibc (<28>?musl)

6. Cedar 摨㯄曎<E3AF84>仿䔮憸?(Day 8)

<EFBFBD><EFBFBD>

undefined reference to `CDC_LOG_LEVEL_NAME'
undefined reference to `CDC_GLOBAL_LOG_LEVEL'

<EFBFBD><EFBFBD>

銝餌<EFBFBD>摨?Makefile 蝻箏<E89DBB>摰峕㟲<E5B395>?Cedar 憭𡁜<E686AD>雿枏<E99BBF><E69E8F>暹𦻖

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

瘛餃<EFBFBD> 60+ 銝芷<E98A9D><E88AB7><EFBFBD><EFBFBD>嚗?```makefile

Cedar <20><EFBFBD>摨橒<E691A8><E6A992>喲睸嚗<E79DB8><E59A97>

LDFLAGS += -lcdc_base -lcdx_base

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

LDFLAGS += -ladecoder -lResample -lAudioVps -laac -lwav LDFLAGS += -lcedarx_aencoder -laacenc -lAgc -lAec -lAns

Muxer/Demuxer

LDFLAGS += -lmuxers -lcedarxdemuxer -lcdx_parser LDFLAGS += -lmp4_muxer -lraw_muxer -lmpeg2ts_muxer

<EFBFBD><EFBFBD>蝻𤥁圾<EFBFBD>?LDFLAGS += -lvencoder -lvdecoder -lvideoengine -lawmjpegplus

<EFBFBD>滨蔭閫<EFBFBD><EFBFBD>

LDFLAGS += -lPluginMpp -lIniParserMpp -lsample_confparser

<EFBFBD>曄內摨?LDFLAGS += -lcedarxrender -lhwdisplay


---

### 7. musl/glibc 撌亙<E6928C><E4BA99><EFBFBD>摰寞<E691B0>?(Day 9) <20>?
#### <20><EFBFBD><><E69298>烐踎餈鞱<E9A488> `musl libc 1.2.4`嚗䔶<E59A97>蝔见<E89D94>雿輻鍂 `glibc` 蝻𤥁<E89DBB><EFBFBD><EFBFBD><EFBFBD>
- <20><EFBFBD><E586BD><EFBFBD>亙膥銝滚龪<E6BB9A>?- 蝚血噡銝滚<E98A9D>摰?(`__register_atfork` 蝑?
- 蝔见<E89D94><E8A781><EFBFBD>餈鞱<E9A488>

#### 閫<><E996AB><EFBFBD><EFBFBD>
```makefile
# 靽格迤撌亙<E6928C><E4BA99>曇楝敺<E6A59D><E695BA><EFBFBD>喲睸<E596B2>𤑳緵嚗饢usl <20>?prebuilt <20><EFBFBD> out/toolchain嚗?USE_MUSL := 1

ifeq ($(USE_MUSL),1)
    TOOLCHAIN_DIR := $(SDK_ROOT)/prebuilt/rootfsbuilt/riscv/nds32le-linux-musl-v5d/bin
    CROSS_COMPILE := riscv32-linux-musl-
endif

**撉諹<E69289><E8ABB9><EFBFBD>**嚗?```bash

<EFBFBD><EFBFBD>亙𢆡<EFBFBD><EFBFBD><EFBFBD>亙膥

readelf -l avaota_client | grep interpreter

摨磰<EFBFBD><EFBFBD><EFBFBD>/lib32/ld.so.1

<EFBFBD><EFBFBD>烐踎銝𠰴<EFBFBD>撱箇泵<EFBFBD>琿曎<EFBFBD>?ln -s /lib32/ilp32d/libc.so /lib32/ld.so.1


**蝏𤘪<E89D8F>**嚗尠<E59A97> 蝔见<E89D94><E8A781>𣂼<EFBFBD>餈鞱<E9A488>嚗峕<E59A97><E5B395>隞嗆芋<E59786><EFBFBD>霂閖<E99C82><EFBFBD>

---

### 8. <20><EFBFBD> I/O <20>躰秤憭<E7A7A4><E686AD> (Day 10) <20>?
#### <20><EFBFBD>
蝔见<E89D94>餈鞱<E9A488>蝥?10 蝘鍦<E89D98>撏拇<E6928F>嚗?- ALSA 餈𥪜<E9A488> I/O error
- `snd_pcm_recover()` <20><EFBFBD>憭梯揖
- 蝐餃<E89D90>頧祆揢<E7A586>躰秤嚗Ǒsize_t` vs `snd_pcm_sframes_t`嚗?- 蝻箏<E89DBB><E7AE8F>躰秤璉<E7A7A4><E79289>亙紡<E4BA99>?Segmentation fault

#### 閫<><E996AB><EFBFBD><EFBFBD>

**audio_capture.cpp - 霈曉<E99C88><E69B89>齿鰵<E9BDBF><EFBFBD><E598A5>?*嚗?```cpp
int err = snd_pcm_recover(m_pcm_handle, frames_read, 0);
if (err < 0) {
    LOG_ERROR("[AudioCapture] Cannot recover: %s, attempting to reinitialize...", 
              snd_strerror(err));
    
    // <20>喲𡡒霈曉<E99C88>
    snd_pcm_close(m_pcm_handle);
    m_pcm_handle = nullptr;
    
    // 蝑匧<E89D91>撟園<E6929F><E59C92><EFBFBD>憪见<E686AA>
    usleep(500000);  // 500ms
    if (!init()) {
        LOG_ERROR("[AudioCapture] Failed to reinitialize device");
        return -1;  // 敶餃<E695B6>憭梯揖
    }
    
    LOG_INFO("[AudioCapture] Device reinitialized successfully");
    return 0;  // <20>祆活霂餃<E99C82>憭梯揖嚗䔶<E59A97>霈曉<E99C88>撌脫<E6928C>憭?}

**main.cpp - 蝐餃<E89D90>摰匧<E691B0><E58CA7><EFBFBD>霂舀<E99C82><E88880>?*嚗?```cpp // 靽桀<E99DBD>蝐餃<E89D90><E9A483>躰秤 snd_pcm_sframes_t frames_read = mic.read(buffer, 160); // 雿輻鍂<E8BCBB>厩泵<E58EA9>瑞掩<E7919E>? // 瘛餃<E7989B><E9A483>躰秤璉<E7A7A4><E79289>?if (frames_read < 0) { LOG_ERROR("[AUD-CAP] Fatal error, exiting thread"); break; // 摰匧<E691B0><E58CA7><EFBFBD><EFBFBD>箇瑪蝔页<E89D94>銝滚蔣<E6BB9A><EFBFBD>隞𡝗芋<F0A19D97>?}

if (frames_read > 0) { ws_aud.send_binary((uint8_t*)buffer, frames_read * 2); }


#### 撉諹<E69289>蝏𤘪<E89D8F>
- <20>?蝔见<E89D94>蝔喳<E89D94>餈鞱<E9A488> 36+ 蝘𡜐<E89D98>靽桀<E99DBD><E6A180><EFBFBD>10 蝘鍦援皞<E68FB4><E79A9E>
- <20>?<3F>芸𢆡<E88AB8><EFBFBD><EFBCB7><EFBFBD><E7AE8F><EFBFBD><EFBFBD><EFBFBD><E59A97>霂蓥葉<E893A5>𣂼<EFBFBD><F0A382BC><EFBFBD> 3 甈?I/O <20>躰秤嚗?- <20>?<3F><EFBFBD>蝥輻<E89DA5>憭梯揖銝滚蔣<E6BB9A>?IMU <20><EFBFBD><E5B395>誩仍蝥輻<E89DA5>

---

### 9. WebSocket 撏拇<E6928F>靽桀<E99DBD> (Day 11) <20>?
#### <20><EFBFBD>
蝔见<E89D94><E8A781>?WebSocket 餈墧𦻖憭梯揖嚗?03 Forbidden嚗匧<E59A97>撏拇<E6928F>嚗?- <20>躰秤靽⊥<E99DBD>嚗䫤terminate called without an active exception`
- <20><EFBFBD> 1嚗䫤perform_handshake()` 憭梯揖<E6A2AF>?`m_recv_thread` <20>芸鍳<E88AB8>?- <20><EFBFBD> 2嚗䫤disconnect()` 隞滚<E99A9E>霂?`join()` <20>芸鍳<E88AB8><EFBFBD>蝥輻<E89DA5>
- <20><EFBFBD> 3嚗𡁏𦻖<F0A1818F>嗥瑪蝔钅獈憛𧼮銁 `recv()` <20>?`disconnect()` <20>湔𦻖<E6B994>喲𡡒 socket

#### 閫<><E996AB><EFBFBD><EFBFBD>

**ws_client.cpp - 甇<><EFBFBD><EFBC86>鱏撘<E9B18F>餈墧𦻖瘚<F0A6BB96><E7989A>**嚗?```cpp
void WSClient::disconnect() {
    // 1. 霈曄蔭<E69B84><E894AD><EFBFBD>雿?    m_running = false;
    m_connected = false;
    
    // 2. <20><EFBFBD><E785BE><EFBFBD><EFBFBD>剖葷
    if (m_sockfd >= 0) {
        uint8_t close_frame[] = {0x88, 0x00};
        send(m_sockfd, close_frame, sizeof(close_frame), 0);
        
        // 潃?<3F>喲睸靽桀<E99DBD>嚗𡁜<E59A97> shutdown 銝剜鱏<E5899C><EFBFBD><E9A483>?recv()
        shutdown(m_sockfd, SHUT_RDWR);
    }
    
    // 3. <20>?join 摰鮋<E691B0>餈鞱<E9A488><E99EB1><EFBFBD>瑪蝔?    if (m_recv_thread.joinable()) {
        m_recv_thread.join();
    }
    
    // 4. <20>喲𡡒 socket
    if (m_sockfd >= 0) {
        close(m_sockfd);
        m_sockfd = -1;
    }
}

**<2A>喲睸蝏誯<E89D8F>**嚗?- shutdown() <20>臭誑銝剜鱏<E5899C><EFBFBD><E9A483>?recv()<>

  • <EFBFBD><EFBFBD>?join() <20><EFBFBD><E6BBA9>?shutdown()
  • 雿輻鍂 joinable()<><E79289>亦瑪蝔𧢲糓<F0A7A2B2>血虾 join

10. <20><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD>帋縑摰䂿緵 (Day 11) <20>?

<EFBFBD><EFBFBD>瘙?- <20><EFBFBD>蝟餌<E89D9F><E9A48C>芣𣈲<E88AA3><F0A388B2>𨺗憸煾<E686B8><E785BE><EFBFBD><EFBFBD>銝𠹺<E98A9D>嚗?- <20><><EFBFBD><E996AC><EFBFBD>圈𨺗憸烐偘<E78390><EFBFBD>TTS 霂剝𨺗<E5899D><F0A8BA97><EFBFBD>嚗?- <20>滚𦛚<E6BB9A><EFBFBD><EFBFBD> WebSocket 餈𥪜<E9A488>鈭諹<E988AD><E8ABB9>?PCM <20><EFBFBD><E596B2>唳旿

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

*甇仿炊 1: <20><EFBFBD> WSClient <20><EFBFBD>鈭諹<E988AD><E8ABB9>嗆㺭<E59786><EFBFBD><E6A185>?

// ws_client.h - 瘛餃<E7989B>鈭諹<E988AD><E8ABB9>嗆㺭<E59786><EFBFBD><E6A185>?class WSClient {
public:
    void poll_binary_messages(std::function<void(const uint8_t*, size_t)> callback);
    
private:
    std::queue<std::vector<uint8_t>> m_binary_queue;
    std::mutex m_binary_mutex;
};

// ws_client.cpp - recv_loop 靽嘥<E99DBD>鈭諹<E988AD><E8ABB9>嗆㺭<E59786>?if (opcode == OP_BINARY) {
    std::lock_guard<std::mutex> lock(m_binary_mutex);
    m_binary_queue.push(payload);
    LOG_DEBUG("[WS] Received binary: %zu bytes", payload.size());
}

*甇仿炊 2: 銝餃儐<E9A483><EFBFBD><E888AB>鞾𨺗憸烐偘<E78390>?

// main.cpp - <20><EFBFBD><E598A5>𡝗碸憯啣膥嚗áw:1,0 - I2S <20>亙藁嚗?AudioPlayer speaker("hw:1,0", 16000, 1);  // 16kHz, mono
bool speaker_enabled = speaker.init();

// 銝餃儐<E9A483>臭葉<E887AD>交𤣰撟嗆偘<E59786>暸𨺗憸?if (speaker_enabled) {
    ws_aud.poll_binary_messages([&](const uint8_t* data, size_t size) {
        if (size % 2 == 0) {  // S16_LE <20>唳旿
            size_t frames = size / 2;
            speaker.write((const int16_t*)data, frames);
        }
    });
}

**<2A>喲睸蝏誯<E89D8F>**嚗?- WebSocket <20>?recv_loop 撌脩<E6928C><E884A9>函𡠺蝡讠瑪蝔衤葉餈鞱<E9A488>

  • 鈭諹<EFBFBD><EFBFBD>嗆㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隡𣳇<EFBFBD><EFBFBD>銝餌瑪蝔?- 雿輻鍂 hw:1,0嚗㇆2S嚗㕑<EFBFBD><EFBFBD> hw:0,0嚗㇁udio Codec嚗?- <20><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?6kHz, mono, S16_LE

撉諹<EFBFBD>蝏𤘪<EFBFBD>

  • <EFBFBD>?<3F>砍ㄟ<E7A08D><EFBFBD>憪见<E686AA><E8A781>𣂼<EFBFBD>嚗áw:1,0嚗?- <20>?<3F><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD>虜嚗<E8999C><EFBFBD><EFBFBD>?2000+ <20>唳旿<E594B3><E697BF><EFBFBD>
  • <EFBFBD>?TTS <20><EFBFBD><E596B2>剜𦆮撌脣<E6928C><E884A3><EFBFBD>Day 13 靽桀<E99DBD>嚗?

11. TTS 鈭衤辣敺芰㴓<E88AB0><EFBFBD>靽桀<E99DBD> (Day 13) <20>?

<EFBFBD><EFBFBD>

TTS <20><EFBFBD><E596B2>剜𦆮<E5899C>剜鱏蝏剔賒嚗峕<E59A97><E5B395>?5-15 蝘埝<E89D98><E59F9D>剜𦆮<E5899C>牐葵摮梹<E691AE>

  • <EFBFBD>蝡舀𠯫敹梹<EFBFBD>[AudioPlayer] Underrun occurred, recovering...
  • <EFBFBD>滚𦛚<EFBFBD>冽𠯫敹梹<EFBFBD>TTS <20>烾𡢿<E783BE>?5-15 蝘?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

omni_client.py 銝凋蝙<E5878B><EFBFBD>甇亥翮隞<E7BFAE>膥憭<E886A5><E686AD> Omni API <20><EFBFBD>嚗屸獈憛硺<E6869B><E7A1BA>港葵 asyncio 鈭衤辣敺芰㴓嚗?```python

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

async def stream_chat(...): completion = client.chat.completions.create(stream=True, ...) for chunk in completion: # <20>?<3F>峕郊餈凋誨嚗屸獈憛硺<E6869B>隞嗅儐<E59785><EFBFBD> yield OmniStreamPiece(...)


#### 閫<><E996AB><EFBFBD><EFBFBD>

**甇仿炊 1: Omni 摰<E691B0>蝡臬<E89DA1>甇亙<E79487>**

雿輻鍂 `threading.Thread` + `asyncio.Queue` 閫<><E996AB><EFBFBD>甇?API 靚<>鍂嚗?
```python
async def stream_chat(...):
    queue = asyncio.Queue()
    loop = asyncio.get_running_loop()
    
    def _sync_stream():
        """<22>函𡠺蝡讠瑪蝔衤葉餈鞱<E9A488><E99EB1>峕郊 API 靚<>鍂"""
        completion = client.chat.completions.create(stream=True, ...)
        for chunk in completion:
            piece = OmniStreamPiece(...)
            loop.call_soon_threadsafe(queue.put_nowait, piece)
        loop.call_soon_threadsafe(queue.put_nowait, None)  # 蝏𤘪<E89D8F><F0A498AA><EFBFBD>扇
    
    thread = threading.Thread(target=_sync_stream, daemon=True)
    thread.start()
    
    while True:
        item = await queue.get()  # <20>鮋獈憛䂿<E6869B>敺?        if item is None:
            break
        yield item

*甇仿炊 2: 摰<E691B0>蝡?TTS 憸<><E686B8><EFBFBD>脫㦤<E884AB>?

// main.cpp - TTS 憸<><E686B8><EFBFBD><EFBFBD><E884A3>?static std::vector<int16_t> tts_buffer;
static const size_t PRE_BUFFER_FRAMES = 16000;  // 1蝘㘾<E89D98>蝻枏<E89DBB>
static const size_t MIN_PLAY_FRAMES = 8000;     // 0.5蝘埝<EFBFBD>撠𤩺偘<EFBFBD><EFBFBD><EFBFBD>?static bool is_buffering = true;

// <20>交𤣰<E4BAA4>嗉蕭<E59789><EFBFBD>蝻枏<E89DBB><E69E8F>?ws_aud.poll_binary_messages([&](const uint8_t* data, size_t size) {
    const int16_t* samples = (const int16_t*)data;
    size_t frames = size / 2;
    tts_buffer.insert(tts_buffer.end(), samples, samples + frames);
    
    // 蝘舐敞頞喳<E9A09E><E596B3><EFBFBD>憪𧢲偘<F0A7A2B2>?    if (is_buffering && tts_buffer.size() >= PRE_BUFFER_FRAMES) {
        is_buffering = false;
    }
});

// <20>剜𦆮<E5899C>嗡蝙<E597A1><EFBFBD>撠𤩺鸌甈? if (!is_buffering && tts_buffer.size() >= MIN_PLAY_FRAMES) {
    size_t play_frames = std::min(tts_buffer.size(), (size_t)1600);  // 100ms
    speaker.write(tts_buffer.data(), play_frames);
    tts_buffer.erase(tts_buffer.begin(), tts_buffer.begin() + play_frames);
}

*甇仿炊 3: <20>滚𦛚<E6BB9A><EFBFBD><E588B8><EFBFBD>箔耨憭?

# app_main.py - lifespan <20>閗繮 CancelledError
@asynccontextmanager
async def lifespan(app):
    # ... <20>臬𢆡<E887AC><EFBFBD> ...
    try:
        yield
    except asyncio.CancelledError:
        pass  # Ctrl+C 甇<>虜銵䔶蛹
    finally:
        print("[LIFESPAN] 摨𠉛鍂<F0A0899B>喲𡡒摰峕<E691B0>")
        # 撘箏<E69298><E7AE8F><EFBFBD><EFBFBD>箇瑪蝔?        def _force_exit():
            time.sleep(0.5)
            os._exit(0)
        threading.Thread(target=_force_exit, daemon=True).start()

撉諹<EFBFBD>蝏𤘪<EFBFBD>

<EFBFBD><EFBFBD><EFBFBD> 靽桀<EFBFBD><EFBFBD>? 靽桀<EFBFBD><EFBFBD>?
TTS <20>烾𡢿<E783BE>? 5-15 蝘? ~2 蝘?
擐𡝗活<EFBFBD>剜𦆮撱嗉<EFBFBD> 蝡见朖 ~1 蝘𡜐<E89D98><EFBFBD><E686B8><EFBFBD><EFBFBD>
Underrun 憸𤑳<E686B8> 瘥誩<EFBFBD><EFBFBD>甈? <EFBFBD><EFBFBD>
<EFBFBD>滚𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD><EFBFBD> <EFBFBD>虜餈𥪜<EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • TTS 隞齿<E99A9E>頧餃凝<E9A483>剔賒嚗㇉mni API <20><EFBFBD><E6BB9A><EFBFBD>
  • 撱箄悅<EFBFBD><EFBFBD><EFBFBD>?HTTP /stream.wav<E79285><EFBFBD><E59A97><EFBFBD>?ESP32S3 摰䂿緵嚗?

<EFBFBD><EFBFBD> <20>喲睸<E596B2>𣂼停

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?1. <20>?隞𡡞妟摰䂿緵 GPIO 璅⊥<E79285> SPI 撽勗𢆡

  1. <EFBFBD>?閫<><E996AB> I2S Device Tree <20>滨蔭<E6BBA8><EFBFBD>
  2. <EFBFBD>?ICM-42688 SPI 撽勗𢆡摰峕㟲摰䂿緵
  3. <EFBFBD>?MPP 獢<>沲摰峕㟲<E5B395><E39FB2><EFBFBD>嚗ĀI<C480>𥕜SP<53>栐ENC嚗?5. <20>?GC2083 100% <20>閗繮<E99697>𣂼<EFBFBD><F0A382BC>?6. <20>?<3F><EFBFBD><E8B9B1><EFBFBD>?60+ 摨㮖<E691A8>韏𡝗<E99F8F><F0A19D97>?7. <20>?撌亙<E6928C><E4BA99><EFBFBD>蝵桃<E89DB5><EFBFBD><E98A9D><EFBFBD>
  4. <EFBFBD>?3.9MB 銝餌<E98A9D>摨讐<E691A8>霂烐<E99C82><E78390>?9. <20>?<3F><EFBFBD><E596B2>躰秤<E8BAB0>芸𢆡<E88AB8><EFBFBD><EFBCB7><EFBFBD>
  5. <EFBFBD>?WebSocket 撏拇<E6928F><E68B87><EFBFBD>靽桀<E99DBD>
  6. <EFBFBD>?<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>帋縑摰䂿緵
  7. <EFBFBD>?**TTS 鈭衤辣敺芰㴓<E88AB0><EFBFBD>靽桀<E99DBD>**嚗㇉mni 摰<E691B0>蝡臬<E89DA1>甇亙<E79487>嚗?13. <20>?*<EFBFBD>蝡?TTS 憸<><E686B8><EFBFBD>脫㦤<E884AB>?
  8. <EFBFBD>?憿寧𤌍隞<EFBFBD><EFBFBD><EFBFBD>西澈 (蝘駁膄 19 銝芸<E98A9D>雿蹱<E99BBF>隞?
  9. <EFBFBD>?**<2A>鮋獈憛噼歲撣扳㦤<E689B3>?* (撖潸⏛ FPS 0.5 -> 10.0)

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16kHz <20>?- <20><><EFBFBD>憭游葷<E6B8B8><E891B7><EFBFBD>20fps <20>?- JPEG <20>讠憬韐券<E99F90>嚗?0 <20>?- SPI <20>帋縑<E5B88B>笔漲嚗鰺500kHz <20>?- IMU <20>唳旿<E594B3><E697BF><EFBFBD>1kHz <20>?- 蝻𤥁<E89DBB>鈭抒<E988AD>憭批<E686AD>嚗?.9MB <20>?- <EFBFBD><EFBFBD>餈鞱<EFBFBD>撉諹<EFBFBD>嚗𡁏<EFBFBD><EFBFBD>㗇芋<EFBFBD>?00%<25><EFBFBD> <20>?- **TTS <20>烾𡢿<E783BE><EFBFBD>~2 蝘?*嚗<>耨憭滚<E686AD> 5-15 蝘𡜐<E89D98><F0A19C90>?

<EFBFBD><EFBFBD> 蝏誯<E89D8F>蝘舐敞

Device Tree <20>滨蔭

  • pinctrl <20><EFBFBD>嚗𡁏<E59A97>銝芸<E98A9D><E88AB8>𡁶𡠺蝡贝<E89DA1><E8B49D>?- function vs allwinner,function嚗帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?- 撘閗<E69298>憭滨鍂<E6BBA8><EFBFBD>嚗𡁻<E59A97><EFBFBD> /sys/kernel/debug/pinctrl <20>埝䰻

GPIO <20><EFBFBD>

  • /sys/class/gpio <20>亙藁雿輻鍂
  • 撖澆枂 <20>?霈曄蔭<E69B84><EFBFBD> <20>?霂餃<E99C82><E9A483>?- GPIO 蝻硋噡霈∠<E99C88>嚗䫤(bank - 'A') * 32 + offset`

SPI <20>讛悅

  • Mode 0嚗鋴POL=0, CPHA=0
  • <EFBFBD><EFBFBD>嚗鐝OSI<EFBFBD><EFBFBD><EFBFBD> <20>?SCLK銝𠰴<E98A9D>瘝?<3F>?MISO<53><4F>
  • ICM-42688 霂餃<E99C82>嚗𡁻<E59A97>摮𡑒<E691AE> 0x80|撖<><E69296><EFBFBD>典𧑐<E585B8><F0A79190>

ALSA <20><EFBFBD>

  • 餈鞱<EFBFBD><EFBFBD><EFBFBD>蝵?vs 蝻𤥁<E89DBB><F0A4A581><EFBFBD>蝵?- amixer<><E99D9A><EFBFBD><EFBFBD>撌?- MIC Gain 靚<><E99D9A><EFBFBD><EFBFBD>

MPP 獢<>

  • <EFBFBD><EFBFBD><EFBFBD>㚚◇摨𧶏<EFBFBD>VI <20>?ISP <20>?VENC
  • 蝻枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣇉<EFBFBD><EFBFBD>?- JPEG 蝻𣇉<E89DBB>韐券<E99F90>銝擧<E98A9D>隞嗅之撠𤩺<E692A0>銵?

鈭文<EFBFBD>蝻𤥁<EFBFBD>

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>暹𦻖憿箏<EFBFBD><EFBFBD><EFBFBD>
  • Cedar 摨㮖<E691A8>韏硋<E99F8F>蝟?- 撌亙<E6928C><E4BA99>曇楝敺<E6A59D><E695BA><EFBFBD>䲮瘜?

<EFBFBD>𩤃<EFBFBD> <20><EFBFBD><E39B96><EFBFBD>銝𦒘<E98A9D><F0A69298>𡝗䲮<F0A19D97>?

<EFBFBD><EFBFBD><EFBFBD>舀䔝蝝<EFBFBD>?1. 蝖砌辣 SPI

  • 敶枏<EFBFBD>嚗鎭PIO 璅⊥<E79285> (~500kHz)
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿輻鍂蝖砌辣 SPI (<28>衽Hz)
  • <EFBFBD><EFBFBD>嚗𡁻<EFBFBD>雿?CPU <20>删鍂
  1. I2C <20><EFBFBD>
    • 敶枏<EFBFBD>嚗𡁜歇<EFBFBD><EFBFBD>
    • <EFBFBD>舀䔝蝝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? - <20><EFBFBD>嚗𡁏凒<F0A1818F><E58792><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
  2. *musl 撌亙<E6928C><E4BA99>?
    • 敶枏<EFBFBD>嚗帋蝙<EFBFBD>?glibc
    • <EFBFBD><EFBFBD>蝘鳴<EFBFBD><EFBFBD><EFBFBD> musl 撌亙<E6928C><E4BA99>? - <20><EFBFBD>嚗𡁜<E59A97>撠誩虾<E8AAA9><EFBFBD><E689AF><EFBFBD>辣雿梶妖

<EFBFBD><EFBFBD>隡睃<EFBFBD>

  • GPIO 璅⊥<E79285> SPI <20>笔漲隡睃<E99AA1><EFBFBD>𤌍<EFBFBD>?1-2MHz嚗?- <20><><EFBFBD>雿輻鍂隡睃<E99AA1>
  • 憭𡁶瑪蝔贝<EFBFBD>頧賢<EFBFBD>銵?

<EFBFBD><EFBFBD>韐券<EFBFBD>

  • 蝏煺<EFBFBD>瘜券<EFBFBD>憌擧聢
  • 瘛餃<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD>
  • <EFBFBD>躰秤憭<EFBFBD><EFBFBD><EFBFBD><EFBFBD>


12. 憿寧𤌍皜<F0A48C8D><E79A9C>銝?TTS 瘚<><E7989A> (Day 14) <20>?

隡睃<EFBFBD><EFBFBD><EFBFBD>

  1. **HTTP <20><><EFBFBD><EFBFBD><EFBFBD>靽桀<E99DBD>**嚗𡁜<E59A97><F0A1819C>?HTTP 20ms pacing 敺芰㴓<E88AB0><EFBFBD>鈭?WebSocket <20><EFBFBD><E785BE><EFBFBD>撖潸稲 TTS <20>⊿▼<E28ABF><E296BC>耨憭齿䲮獢<E4B2AE><E78DA2>撠?HTTP 撟踵偘蝘餉秐<E9A489>𤾸蝱隞餃𦛚 asyncio.create_task()<EFBFBD>?2. 憿寧𤌍<EFBFBD>西澈嚗𡁶宏<EFBFBD>?HTTP TTS <20><EFBFBD><EFBFBD><E99A9E><EFBFBD>𦠜<EFBFBD>霂閗<E99C82><E99697>穿<EFBFBD><E7A9BF><EFBFBD><EFBFBD><EFBFBD> 19 銝芥<E98A9D>?3. **<2A><><EFBFBD>**嚗関TS <20>剜𦆮摰<F0A686AE><E691B0><EFBFBD><E7989A>嚗峕<E59A97><E5B395>剔賒<E58994>?

13. 撖潸⏛璅<E79285><E288AA>⊿▼靽桀<E99DBD> (Day 15) <20>?

<EFBFBD><EFBFBD><EFBFBD>啗情

撖潸⏛璅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𤅎PS 隞?10.0 <20><EFBFBD><E6B8B2>?0.5-1.5嚗𣬚𤫇<EFBFBD>㨃憿踴<EFBFBD>?

<EFBFBD><EFBFBD><EFBFBD>舀䲮獢<EFBFBD><EFBFBD><EFBFBD>鮋獈憛噼歲撣扳㦤<EFBFBD>?**<2A>煺誨<E785BA><E8AAA8>䔮憸?*嚗䫤await loop.run_in_executor` <20><EFBFBD><E8B39C>函瑪蝔𧢲<E89D94><F0A7A2B2><EFBFBD>嚗䔶<E59A97>銝餃儐<E9A483><EFBFBD>蝑匧<E89D91>蝏𤘪<E89D8F>餈𥪜<E9A488><EFBFBD><EFBFBD>港葡銵屸獈憛𠺶<E6869B>?

**靽桀<E99DBD><E6A180><EFBFBD>**嚗?1. **Fire-and-Forget 璅<E79285>**嚗帋蜓敺芰㴓<E88AB0>𣂷漱隞餃𦛚<E9A483>𡒊<EFBFBD><F0A1928A>喟誧蝏哨<E89D8F>銝滨<E98A9D>敺?await<EFBFBD>?2. **<2A><><EFBFBD>啣葷隡睃<E99AA1>**嚗𡁜<E59A97><F0A1819C>𨀣<EFBFBD><F0A880A3>啣葷銝𥪯<E98A9D><EFBFBD>撣扳𧊋憭<F0A78A8B><E686AD>摰䕘<E691B0><E49598><EFBFBD><E8BAB0>?Pending 撣改<E692A3>蝖桐<E89D96><EFBFBD><E686AD><EFBFBD><EFBFBD><EFBFBD>唳㺭<E594B3><EFBFBD>?3. 蝏𤘪<EFBFBD>憭滨鍂嚗𡁜銁<EFBFBD>𤾸蝱憭<EFBFBD><EFBFBD>摰峕<EFBFBD><EFBFBD><EFBFBD>撟踵偘銝𠹺<EFBFBD>撣抒<EFBFBD><EFBFBD>瘚讠<EFBFBD><EFBFBD><EFBFBD>靽脲<EFBFBD> UI <20>瑟鰵<E7919F><E9B0B5>蛹 10FPS<50>? **<2A><><EFBFBD>**嚗?- 摰<E691B0>蝡舫<E89DA1><E888AB><EFBFBD><EFBFBD>10 FPS (1280x720)


14. <20>箔辣<E7AE94><EFBFBD>銝舘䌊<E88898>臬𢆡<E887AC>滨蔭 (Day 16) <20>?

<EFBFBD><EFBFBD> 1嚗𡁜𢆡<F0A1819C><F0A286A1><EFBFBD>亙膥頝臬<E9A09D>

蝔见<EFBFBD>蝻𤥁<EFBFBD><EFBFBD>嗡蝙<EFBFBD>?/lib32/ld.so.1嚗䔶<EFBFBD><EFBFBD><EFBFBD>烐踎摰鮋<EFBFBD>頝臬<EFBFBD>銝?/lib/ld-musl-riscv32.so.1<EFBFBD><EFBFBD>?not found <20>躰秤<E8BAB0>? **閫<><E996AB><EFBFBD><EFBFBD>**嚗?```makefile

src/Makefile 瘛餃<E7989B>

LDFLAGS += -Wl,--dynamic-linker=/lib/ld-musl-riscv32.so.1


#### <20><EFBFBD> 2嚗朞䌊<E69C9E>臬𢆡<E887AC><EFBFBD><E5AF9E>㗇𥋘

| <20><EFBFBD> | 蝏𤘪<E89D8F> | <20><EFBFBD> |
|------|------|------|
| `/etc/init.d/rc.final` | <20>?憭梯揖 | 撖潸稲 SD <20><EFBFBD>瘚见仃韐伐<E99F90><E4BC90><EFBFBD><EFBFBD><EFBFBD><E6BB9A>箔辣 |
| `crontab @reboot` | <20>?憭梯揖 | BusyBox crond 銝齿𣈲<E9BDBF><F0A388B2>迨霂剜<E99C82> |
| `/etc/init.d/avaota` + `load_script.conf` | <20>?<3F>𣂼<EFBFBD> | 蝔喳<E89D94><E596B3><EFBFBD> |

#### <20>𣂼<EFBFBD><F0A382BC><EFBFBD>霂西圾

**1. <20>𥕦遣 init <20>𡁏𧋦**嚗?```bash
cat > /etc/init.d/avaota << 'EOF'
#!/bin/sh /etc/rc.common
START=99
start() {
    sleep 15
    ulimit -c 0
    /mnt/UDISK/app/avaota_client > /tmp/avaota.log 2>&1 &
}
stop() {
    killall avaota_client
}
EOF
chmod +x /etc/init.d/avaota

**2. 瘛餃<E7989B><E9A483>啣鍳<E595A3><EFBFBD>銵?*嚗?```bash echo "avaota" >> /etc/init.d/load_script.conf


#### <20>喲睸蝏誯<E89D8F>
- **<2A>臬𢆡撱嗉<E692B1>**嚗𡁻<E59A97>閬?15 蝘垍<E89D98><EFBFBD>𨺗憸𤑳頂蝏笔<E89D8F>憪见<E686AA>嚗? 蝘雴<E89D98><EFBFBD><E686AD>
- **蝳<>鍂 core dump**嚗䫤ulimit -c 0` <20>脫迫蝔见<E89D94>撏拇<E6928F><E68B87>烐說 overlay <20><>躹
- **WiFi <20>芸𢆡餈墧𦻖**嚗𡁶頂蝏煺<E89D8F>靽嘥<E99DBD><E598A5>滨蔭<E6BBA8>?`/etc/wifi/wifimg.config`嚗峕<E59A97><E5B395><EFBFBD><EFBFBD><EFBFBD><E588BB>砌葉<E7A08C>滨蔭
- **<2A><EFBFBD> rc.final**嚗帋<E59A97>撟脫贋 SD <20>?mdev <20><EFBFBD><E598A5>𡝗<EFBFBD>蝔?
#### <20><EFBFBD><E7A589>滚𦛚<E6BB9A><EFBFBD>蝵?
靽格㺿 `main.cpp` <20><EFBFBD> frp <20><><EFBFBD>蝛輸<E89D9B>𧶏<EFBFBD>
```cpp
// 靽格㺿<E6A0BC>?const char* SERVER_HOST = "192.168.110.188";
// 靽格㺿<E6A0BC>?const char* SERVER_HOST = "8.148.25.142";

frpc.toml <20>滨蔭嚗?```toml serverAddr = "8.148.25.142" serverPort = 7000 auth.token = "your_token"

proxies name = "avaota_server" type = "tcp" localIP = "127.0.0.1" localPort = 8081 remotePort = 8081

proxies name = "avaota_imu_udp" type = "udp" localIP = "127.0.0.1" localPort = 12345 remotePort = 12345


> **Day 17 銵亙<E98AB5>**嚗𡁜<E59A97>憿餅溶<E9A485>?UDP 12345 隞<><E99A9E><EFBFBD><EFBFBD>?IMU <20>唳旿<E594B3><EFBFBD><E4ADBE><EFBFBD><E69C9E><EFBFBD>隡㰘<E99AA1><E3B098><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E59C92><EFBFBD>蝵烐<E89DB5><E78390><E288AA><EFBFBD>憓坔<E68693><E59D94>?UDP 12345 蝡臬藁<E887AC>?- <20>滚𦛚<E6BB9A><EFBFBD><E585B8><EFBFBD><EFBFBD>~15 FPS (<28><EFBFBD><E39787>拍鍂)
- 撖潸⏛雿㯄<E99BBF>嚗𡁏<E59A97><F0A1818F><EFBFBD><EFBFBD><EFBFBD>⊿▼

---

## <20><> <20><><EFBFBD><EFBFBD><EFBFBD>皞?
### 蝖砌辣<E7A08C><E8BEA3>﹝
- [<5B><EFBFBD> V821 Datasheet](https://www.aw-ol.com)
- [ICM-42688 Datasheet](https://invensense.tdk.com)
- [MAX98357A Datasheet](https://www.maximintegrated.com)
- [GC2083 Datasheet](http://www.galaxycore.com.cn)

### 頧臭辣<E887AD><E8BEA3>﹝
- [ALSA Documentation](https://www.alsa-project.org)
- [MPP Framework Guide](https://github.com/allwinner)
- [Linux GPIO Subsystem](https://www.kernel.org/doc/html/latest/driver-api/gpio/)

### 撘<><E69298>烐𠯫敹?- [x] [Day1.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day1.md) - SDK蝻𤥁<E89DBB><F0A4A581><EFBFBD><E887AC>剖遣
- [x] [Day2.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day2.md) - 蝵𤑳<E89DB5>摨梶<E691A8>霂?- [x] [Day3.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day3.md) - I2S<32><EFBFBD>颲枏枂
- [x] [Day4.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day4.md) - 暻血<E69ABB>憌?IMU
- [x] [Day5.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day5.md) - GC2083<38><33><EFBFBD>憭?- [x] [Day6.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day6.md) - 蝖砌辣撉諹<E69289>
- [x] [Day7.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day7.md) - 撌亙<E6928C><E4BA99><EFBFBD>蝵?- [x] [Day8.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day8.md) - <20><EFBFBD>蝻𤥁<E89DBB><F0A4A581>𣂼<EFBFBD>
- [x] [Day9.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day9.md) - **musl 撌亙<E6928C><E4BA99>曆耨憭?+ <20><EFBFBD>瘚贝<E7989A><E8B49D><EFBFBD>** <20>?- [x] [Day10.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day10.md) - **<2A><EFBFBD> I/O <20>躰秤靽桀<E99DBD> + 蝔见<E89D94>蝔喳<E89D94><E596B3><EFBFBD><E689B3>?* <20>?- [x] [Day11.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day11.md) - **WebSocket 撏拇<E6928F>靽桀<E99DBD> + <20><EFBFBD><E596B2>剜𦆮摰䂿緵** <20>?- [x] [Day12.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day12.md) - **<2A><EFBFBD><E596B2>䂿㴓<E482BF><E3B493><EFBFBD> + <20>砍ㄟ<E7A08D>冽毽<E586BD>喳膥靽桀<E99DBD>** <20>?- [x] [Day13.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day13.md) - **TTS 鈭衤辣敺芰㴓<E88AB0><EFBFBD>靽桀<E99DBD> + 摰<E691B0>蝡舫<E89DA1>蝻枏<E89DBB>** <20>?- [x] [Day14.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day14.md) - **憿寧𤌍皜<F0A48C8D><E79A9C> + TTS 瘚<><E7989A><EFBFBD>剜𦆮** <20>?- [x] [Day15.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day15.md) - **撖潸⏛璅<E79285><E288AA><EFBFBD>隡睃<E99AA1> (頝喳葷<E596B3><EFBFBD>)** <20>?- [x] [Day16.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day16.md) - **<2A>箔辣<E7AE94><EFBFBD>銝舘䌊<E88898>臬𢆡<E887AC>滨蔭** <20>?- [x] [Day17.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day17.md) - **摰文<E691B0>瘚贝<E7989A>+<2B><EFBFBD>霂剝𨺗靽桀<E99DBD>+IMU UDP隞<50><E99A9E>** <20>?- [ ] [Day19.md](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/DevLogs/Day19.md) - **隡㰘<E99AA1>隡睃<E99AA1> + Python GIL <20><EFBFBD>霂𦠜鱏** <20>𩤃<EFBFBD>

---

### 15. Python GIL <20><EFBFBD><E689AF><EFBFBD>霂𦠜鱏 (Day 19) <20>𩤃<EFBFBD>

#### <20><EFBFBD><E6A185>𤑳緵

<0A>滚𦛚<E6BB9A><EFBFBD>霂閧𤩅<E996A7>枏紡<E69E8F>芣𧒄<E88AA3>𤑳緵<F0A491B3><EFBFBD><E689AF><EFBFBD>嚗?- **GPU <20>拍鍂<E68B8D><E98D82><EFBFBD> 7%** - 餈靝<E9A488>鈭𡡞<E988AD><F0A1A19E>?- **Python 餈𤤿<E9A488><F0A4A4BF>删鍂 120% CPU** - 雿<><E99BBF><EFBFBD><E288AA>?CPU 隞?3%嚗?6 <20>詨⏚<E8A9A8><EFBFBD><E587BD><EFBFBD><EFBFBD>嚗?- **撣批<E692A3><E689B9>?FPS 隞?3-4 撣?* - <20>駁𢒰<E9A781>⊿▼銝仿<E98A9D>

#### <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD>

```python
# app_main.py 蝚?237 銵?frame_processing_executor = ThreadPoolExecutor(max_workers=3, ...)

ThreadPoolExecutor <20>?Python GIL (<28><EFBFBD><EFBFBD><E996AB><EFBFBD><EFBFBD>) <20>𣂼<EFBFBD>嚗峕<E59A97>瘜閧<E7989C><EFBFBD>僎銵<E5838E><E98AB5> CPU 撖<><E69296><EFBFBD>衤遙<E8A1A4><EFBFBD>JPEG 蝻𤥁圾<F0A4A581><E59CBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>暹葡<E69AB9><EFBFBD><E6A992>?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

雿輻鍂 PyNvJpeg 撠?JPEG 蝻𤥁圾<F0A4A581><E59CBE><EFBFBD>?GPU嚗?

pip install pynvjpeg
import pynvjpeg as nj
_nvjpeg = nj.NvJpeg()

def gpu_decode(jpeg_bytes):
    return _nvjpeg.decode(jpeg_bytes)

def gpu_encode(image, quality=85):
    return _nvjpeg.encode(image, quality)

**<2A><EFBFBD>?*嚗尠<E59A97> <20><EFBFBD><E88AB8><EFBFBD><EFBFBD><E695BA><EFBFBD><EFBFBD><E4BA99>?

**<2A><><EFBFBD>擧凒<E693A7>?*嚗?025-12-23 (Day 19 - 隡㰘<E99AA1>隡睃<E99AA1> + GIL <20><EFBFBD>霂𦠜鱏)
**憿寧𤌍<E5AFA7><EFBFBD>?*嚗尠<E59A97>儭?99% 摰峕<E691B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E695BA><EFBFBD>?(Python GIL <20><EFBFBD>)
Day 19 <20>湔鰵嚗関urboJPEG 隡睃<E99AA1><E79D83><EFBFBD><EFBFBD><E89189><EFBFBD>雿㮖耨憭溻<E686AD><E6BABB>IL <20><EFBFBD>霂𦠜鱏
**敺<><E695BA><EFBFBD>?*嚗䥪yNvJpeg GPU JPEG <20>𣳇<EFBFBD><EFBFBD><E9BA84>TS <20><EFBFBD>靽桀<E99DBD>