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

694 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Avaota F1 <20><><EFBFBD><EFBFBD><E887AC><EFBFBD><EFBFBD>
**<EFBFBD><EFBFBD>𧋦**嚗鯝3.5
**<EFBFBD><EFBFBD>**嚗?025-12-17
**撟喳蝱**嚗鋫vaota F1 (<28><EFBFBD> V821 / 32-bit RISC-V)
**憿寧𤌍餈𥕦漲**嚗?00% - [<EFBFBD><EFBFBD>隞餃𦛚皜<EFBFBD><EFBFBD>](task_complete.md)
---
## <20><> <20><>﹝霂湔<E99C82>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘜其<EFBFBD>**<2A><><EFBFBD><EFBFBD><E887AC><EFBFBD><E59581><EFBFBD><EFBFBD><EFBFBD>𠗕<EFBFBD>寡圾<E5AFA1><EFBFBD>蝏誯<E89D8F><E8AAAF><EFBFBD>**<2A>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?- <20><> **隞餃𦛚餈𥕦漲<F0A595A6><E6BCB2><EFBFBD>蝔讠<E89D94><E8AEA0><EFBFBD>𧒄<EFBFBD>渡瑪** <20>?`task_complete.md`
- <20><> **撘<><E69298>烐𠯫敹𡑒祕<F0A19192>?* <20>?`Day1-8.md`
---
## <20><20><><EFBFBD><EFBFBD><E88880><EFBFBD>
### 蝖砌辣憭𤥁挽
| 璅<E79285> | <20>见噡/<2F>亙藁 | 摰䂿緵<E482BF><EFBFBD> | <20>喲睸<E596B2><E79DB8>㺭 |
|------|-----------|---------|----------|
| **<EFBFBD><EFBFBD>颲枏枂** | MAX98357A (I2S) | Device Tree + ALSA | PD12/PD13/PD15, 16kHz |
| **<EFBFBD><EFBFBD>颲枏<EFBFBD>** | <20>輯蝸璅⊥<E79285>暻血<E69ABB>憌?| 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 |
| **蝵𤑳<E89DB5>** | 隞亙云蝵?WiFi | <20>輯蝸 | - |
### 頧臭辣<E887AD><EFBFBD>
| 蝏<>辣 | <20><><EFBFBD><EFBFBD> | 霂湔<E99C82> |
|------|--------|------|
| **AudioCapture** | ALSA API | 暻血<E69ABB>憌𤾸<E6868C><F0A4BEB8><EFBFBD>S16_LE<4C><EFBFBD> |
| **AudioPlayer** | ALSA API | <20>砍ㄟ<E7A08D>冽偘<E586BD>?|
| **ICM42688** | GPIO + SPI<50>讛悅 | <20><EFBFBD><E88AB8>訕PI撽勗𢆡 |
| **Camera** | MPP (VI/ISP/VENC) | JPEG蝖砌辣蝻𣇉<E89DBB> |
| **UDPSender** | BSD Socket | <20><EFBFBD><E8B9B1><EFBFBD>?|
| **WSClient** | <20><EFBFBD><E88AB8>?+ BSD Socket | WebSocket摰<E691B0>蝡荔<E89DA1><E88D94><EFBFBD>鈭諹<E988AD><E8ABB9>嗆㺭<E59786><EFBFBD> |
| **HTTPClient** | libcurl | HTTP摰<E691B0>蝡?|
### 蝻𤥁<E89DBB>撌亙<E6928C><E4BA99><EFBFBD><E6A998>湔鰵嚗帋蝙<E5B88B>?musl嚗?
```makefile
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++
```
**<EFBFBD>喲睸<EFBFBD>暹𦻖摨?*嚗?0+ <20><EFBFBD><E8B9B1><EFBFBD>嚗㚁<E59A97>
- MPP獢<50>沲嚗惨w_mpp, media_utils, awion
- ISP憭<50><E686AD>嚗?2銝杷SP摨?- 閫<><E996AB>蝻𤥁圾<F0A4A581><E59CBE><EFBFBD>vencoder, vdecoder, Cedar摨?- <20><EFBFBD><EFBFBD><E686AD>嚗惨decoder, aencoder, AGC, AEC
- <20><><EFBFBD><EFBFBD>嚗饢uxers, demuxer, parser
---
## <20><20><><EFBFBD>舫𠗕<E888AB><EFBFBD><EFBFBD><E996AB><EFBFBD><EFBFBD>
### 1. I2S <20><EFBFBD>颲枏枂<E69E8F>滨蔭
#### <20><EFBFBD>
- Device Tree <20><EFBFBD><E598A5>滨蔭<E6BBA8>躰秤
- 撘閗<E69298><E99697><EFBFBD><E8A098><EFBFBD>
- `simple-audio-card` <20><EFBFBD><EFBFBD>虜撌乩<E6928C>
#### 閫<><E996AB><EFBFBD><EFBFBD>
```dts
// <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";
};
};
```
**<EFBFBD>喲睸蝏誯<EFBFBD>**嚗?- 雿輻鍂 `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
- 霈曉<E99C88><E69B89><EFBFBD><E6BB9A><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>?
**蝏栞捏**嚗𡁜虾<F0A1819C><EFBFBD><EFBFBD>鸌畾𠰴<E795BE>憪见<E686AA>摨誩<E691A8>嚗峕𦆮撘<F0A686AE>2C<32><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>
#### 蝻枏<E89DBB><E69E8F><EFBFBD>蝵桐<E89DB5><E6A190>?
**<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)
#### <20><EFBFBD>
```
undefined reference to `CDC_LOG_LEVEL_NAME'
undefined reference to `CDC_GLOBAL_LOG_LEVEL'
```
#### <20><EFBFBD>
銝餌<EFBFBD>摨?Makefile 蝻箏<E89DBB>摰峕㟲<E5B395>?Cedar 憭𡁜<E686AD>雿枏<E99BBF><E69E8F>暹𦻖
#### 閫<><E996AB><EFBFBD><EFBFBD>
瘛餃<EFBFBD> 60+ 銝芷<E98A9D><E88AB7><EFBFBD><EFBFBD>嚗?```makefile
# Cedar <20><EFBFBD>摨橒<E691A8><E6A992>喲睸嚗<E79DB8><E59A97>
LDFLAGS += -lcdc_base -lcdx_base
# <20><EFBFBD><EFBFBD><E686AD>
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
# 閫<><E996AB>蝻𤥁圾<F0A4A581>?LDFLAGS += -lvencoder -lvdecoder -lvideoengine -lawmjpegplus
# <20>滨蔭閫<E894AD><E996AB>
LDFLAGS += -lPluginMpp -lIniParserMpp -lsample_confparser
# <20>曄內摨?LDFLAGS += -lcedarxrender -lhwdisplay
```
---
### 7. musl/glibc 撌亙<E6928C><E4BA99><EFBFBD>摰寞<E691B0>?(Day 9) <20>?
#### <20><EFBFBD>
<EFBFBD><EFBFBD>烐踎餈鞱<EFBFBD> `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
# 璉<><E79289>亙𢆡<E4BA99><F0A286A1><EFBFBD>亙膥
readelf -l avaota_client | grep interpreter
# 摨磰<E691A8><E7A3B0><EFBFBD>/lib32/ld.so.1
# 撘<><E69298>烐踎銝𠰴<E98A9D>撱箇泵<E7AE87>琿曎<E790BF>?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>
蝔见<EFBFBD>餈鞱<EFBFBD>蝥?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>
蝔见<EFBFBD><EFBFBD>?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>?`join()` <20><EFBFBD><E6BBA9>?`shutdown()`
- 雿輻鍂 `joinable()` 璉<><E79289>亦瑪蝔𧢲糓<F0A7A2B2>血虾 join
---
### 10. <20><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD>帋縑摰䂿緵 (Day 11) <20>?
#### <20><>瘙?- <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>唳旿
#### 閫<><E996AB><EFBFBD><EFBFBD>
**甇仿炊 1: <20><EFBFBD> WSClient <20><EFBFBD>鈭諹<E988AD><E8ABB9>嗆㺭<E59786><EFBFBD><E6A185>?*
```cpp
// 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>?*
```cpp
// 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>
- 鈭諹<E988AD><E8ABB9>嗆㺭<E59786><EFBFBD><EFBFBD><E69C9E><EFBFBD>隡𣳇<E99AA1><EFBFBD>銝餌瑪蝔?- 雿輻鍂 `hw:1,0`嚗㇆2S嚗㕑<E59A97><EFBFBD> `hw:0,0`嚗㇁udio Codec嚗?- <20><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?6kHz, mono, S16_LE
#### 撉諹<E69289>蝏𤘪<E89D8F>
- <20>?<3F>砍ㄟ<E7A08D><EFBFBD>憪见<E686AA><E8A781>𣂼<EFBFBD>嚗áw:1,0嚗?- <20>?<3F><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD>虜嚗<E8999C><EFBFBD><EFBFBD>?2000+ <20>唳旿<E594B3><E697BF><EFBFBD>
- <20>?TTS <20><EFBFBD><E596B2>剜𦆮撌脣<E6928C><E884A3><EFBFBD>Day 13 靽桀<E99DBD>嚗?
---
### 11. TTS 鈭衤辣敺芰㴓<E88AB0><EFBFBD>靽桀<E99DBD> (Day 13) <20>?
#### <20><EFBFBD>
TTS <20><EFBFBD><E596B2>剜𦆮<E5899C>剜鱏蝏剔賒嚗峕<E59A97><E5B395>?5-15 蝘埝<E89D98><E59F9D>剜𦆮<E5899C>牐葵摮梹<E691AE>
- 摰<E691B0>蝡舀𠯫敹梹<E695B9>`[AudioPlayer] Underrun occurred, recovering...`
- <20>滚𦛚<E6BB9A>冽𠯫敹梹<E695B9>TTS <20>烾𡢿<E783BE>?5-15 蝘?
#### <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD>
`omni_client.py` 銝凋蝙<E5878B><EFBFBD>甇亥翮隞<E7BFAE>膥憭<E886A5><E686AD> Omni API <20><EFBFBD>嚗屸獈憛硺<E6869B><E7A1BA>港葵 asyncio 鈭衤辣敺芰㴓嚗?```python
# <20><EFBFBD><EFBFBD><E99A9E>
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>?*
```cpp
// 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>箔耨憭?*
```python
# 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()
```
#### 撉諹<E69289>蝏𤘪<E89D8F>
| <20><><EFBFBD> | 靽桀<E99DBD><E6A180>?| 靽桀<E99DBD><E6A180>?|
|------|--------|--------|
| TTS <20>烾𡢿<E783BE>?| 5-15 蝘?| ~2 蝘?|
| 擐𡝗活<F0A19D97>剜𦆮撱嗉<E692B1> | 蝡见朖 | ~1 蝘𡜐<E89D98><EFBFBD><E686B8><EFBFBD><EFBFBD> |
| Underrun 憸𤑳<E686B8> | 瘥誩<E798A5><EFBFBD>甈?| <20><EFBFBD> |
| <20>滚𦛚<E6BB9A><EFBFBD><E588B8><EFBFBD>?| <20><>絲 | 甇<>虜餈𥪜<E9A488> |
#### <20><EFBFBD><E39B96><EFBFBD>
- TTS 隞齿<E99A9E>頧餃凝<E9A483>剔賒嚗㇉mni API <20><EFBFBD><E6BB9A><EFBFBD>
- 撱箄悅<E7AE84><E68285><EFBFBD>?HTTP `/stream.wav` 璅<E79285><EFBFBD><E59A97><EFBFBD>?ESP32S3 摰䂿緵嚗?
---
## <20><> <20>喲睸<E596B2>𣂼停
### <20><><EFBFBD><EFBFBD><E88890>?1. <20>?隞𡡞妟摰䂿緵 GPIO 璅⊥<E79285> SPI 撽勗𢆡
2. <20>?閫<><E996AB> I2S Device Tree <20>滨蔭<E6BBA8><EFBFBD>
3. <20>?ICM-42688 SPI 撽勗𢆡摰峕㟲摰䂿緵
4. <20>?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>
8. <20>?3.9MB 銝餌<E98A9D>摨讐<E691A8>霂烐<E99C82><E78390>?9. <20>?<3F><EFBFBD><E596B2>躰秤<E8BAB0>芸𢆡<E88AB8><EFBFBD><EFBCB7><EFBFBD>
10. <20>?**WebSocket 撏拇<E6928F><E68B87><EFBFBD>靽桀<E99DBD>**
11. <20>?**<2A><EFBFBD><E596B2><EFBFBD><EFBFBD><EFBFBD>帋縑摰䂿緵**
12. <20>?**TTS 鈭衤辣敺芰㴓<E88AB0><EFBFBD>靽桀<E99DBD>**嚗㇉mni 摰<E691B0>蝡臬<E89DA1>甇亙<E79487>嚗?13. <20>?**摰<E691B0>蝡?TTS 憸<><E686B8><EFBFBD>脫㦤<E884AB>?*
14. <20>?**憿寧𤌍隞<F0A48C8D><E99A9E><EFBFBD>西澈** (蝘駁膄 19 銝芸<E98A9D>雿蹱<E99BBF>隞?
15. <20>?**<2A>鮋獈憛噼歲撣扳㦤<E689B3>?* (撖潸⏛ FPS 0.5 -> 10.0)
### <20><EFBFBD><E689AF><EFBFBD><EFBFBD>
- <20><EFBFBD><E596B2><EFBFBD><EFBFBD><E79485><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>?- **<2A><EFBFBD>餈鞱<E9A488>撉諹<E69289>嚗𡁏<E59A97><F0A1818F>㗇芋<E39787>?00%<25><EFBFBD>** <20>?- **TTS <20>烾𡢿<E783BE><EFBFBD>~2 蝘?*嚗<>耨憭滚<E686AD> 5-15 蝘𡜐<E89D98><F0A19C90>?
---
## <20><> 蝏誯<E89D8F>蝘舐敞
### Device Tree <20>滨蔭
- `pinctrl` <20><EFBFBD>嚗𡁏<E59A97>銝芸<E98A9D><E88AB8>𡁶𡠺蝡贝<E89DA1><E8B49D>?- `function` vs `allwinner,function`嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD><EFBFBD><E586BD><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
- <20><EFBFBD>嚗鐝OSI<53><49><EFBFBD> <20>?SCLK銝𠰴<E98A9D>瘝?<3F>?MISO<53><4F>
- ICM-42688 霂餃<E99C82>嚗𡁻<E59A97>摮𡑒<E691AE> 0x80|撖<><E69296><EFBFBD>典𧑐<E585B8><F0A79190>
### ALSA <20><EFBFBD>
- 餈鞱<E9A488><E99EB1><EFBFBD>蝵?vs 蝻𤥁<E89DBB><F0A4A581><EFBFBD>蝵?- `amixer`<><E99D9A><EFBFBD><EFBFBD>撌?- MIC Gain 靚<><E99D9A><EFBFBD><EFBFBD>
### MPP 獢<>
- <20><EFBFBD><E598A5>㚚◇摨𧶏<E691A8>VI <20>?ISP <20>?VENC
- 蝻枏<E89DBB><E69E8F><EFBFBD><E7AE94>𣇉<EFBFBD><F0A38789>?- JPEG 蝻𣇉<E89DBB>韐券<E99F90>銝擧<E98A9D>隞嗅之撠𤩺<E692A0>銵?
### 鈭文<E988AD>蝻𤥁<E89DBB>
- <20><EFBFBD><E8B9B1><EFBFBD><EFBFBD>暹𦻖憿箏<E686BF><EFBFBD><E996AB>
- Cedar 摨㮖<E691A8>韏硋<E99F8F>蝟?- 撌亙<E6928C><E4BA99>曇楝敺<E6A59D><E695BA><EFBFBD>䲮瘜?
---
## <20>𩤃<EFBFBD> <20><EFBFBD><E39B96><EFBFBD>銝𦒘<E98A9D><F0A69298>𡝗䲮<F0A19D97>?
### <20><><EFBFBD>舀䔝蝝<EFBCB8>?1. **蝖砌辣 SPI**
- 敶枏<E695B6>嚗鎭PIO 璅⊥<E79285> (~500kHz)
- <20><EFBFBD><E887AD><EFBFBD>雿輻鍂蝖砌辣 SPI (<28>衽Hz)
- <20><EFBFBD>嚗𡁻<E59A97>雿?CPU <20>删鍂
2. **I2C <20><EFBFBD>**
- 敶枏<E695B6>嚗𡁜歇<F0A1819C><EFBFBD>
- <20>舀䔝蝝<E89D9D><EFBD87><EFBFBD><E5AF9E><EFBFBD><E598A5><EFBFBD><E7A18B>? - <20><EFBFBD>嚗𡁏凒<F0A1818F><E58792><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
3. **musl 撌亙<E6928C><E4BA99>?*
- 敶枏<E695B6>嚗帋蝙<E5B88B>?glibc
- <20><EFBFBD>蝘鳴<E89D98><EFBFBD><E996AB> musl 撌亙<E6928C><E4BA99>? - <20><EFBFBD>嚗𡁜<E59A97>撠誩虾<E8AAA9><EFBFBD><E689AF><EFBFBD>辣雿梶妖
### <20><EFBFBD>隡睃<E99AA1>
- GPIO 璅⊥<E79285> SPI <20>笔漲隡睃<E99AA1><EFBFBD>𤌍<EFBFBD>?1-2MHz嚗?- <20><><EFBFBD>雿輻鍂隡睃<E99AA1>
- 憭𡁶瑪蝔贝<E89D94>頧賢<E9A0A7>銵?
### 隞<><E99A9E>韐券<E99F90>
- 蝏煺<E89D8F>瘜券<E7989C>憌擧聢
- 瘛餃<E7989B><E9A483><EFBFBD>瘚贝<E7989A>
- <20>躰秤憭<E7A7A4><E686AD><EFBFBD><E691B0>
---
---
### 12. 憿寧𤌍皜<F0A48C8D><E79A9C>銝?TTS 瘚<><E7989A> (Day 14) <20>?
#### 隡睃<E99AA1><E79D83><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()`<60>?2. **憿寧𤌍<E5AFA7>西澈**嚗𡁶宏<F0A181B6>?HTTP TTS <20><EFBFBD><EFBFBD><E99A9E><EFBFBD>𦠜<EFBFBD>霂閗<E99C82><E99697>穿<EFBFBD><E7A9BF><EFBFBD><EFBFBD><EFBFBD> 19 銝芥<E98A9D>?3. **<EFBFBD><EFBFBD><EFBFBD>**嚗関TS <20>剜𦆮摰<F0A686AE><E691B0><EFBFBD><E7989A>嚗峕<E59A97><E5B395>剔賒<E58994>?
### 13. 撖潸⏛璅<E79285><E288AA>⊿▼靽桀<E99DBD> (Day 15) <20>?
#### <20><EFBFBD><E6A185>啗情
撖潸⏛璅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𤅎PS 隞?10.0 <20><EFBFBD><E6B8B2>?0.5-1.5嚗𣬚𤫇<EFBFBD>㨃憿踴<EFBFBD>?
#### <20><><EFBFBD>舀䲮獢<E4B2AE><E78DA2><EFBFBD>鮋獈憛噼歲撣扳㦤<E689B3>?**<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`<60>?2. **<EFBFBD><EFBFBD><EFBFBD>啣葷隡睃<EFBFBD>**嚗𡁜<E59A97><F0A1819C>𨀣<EFBFBD><F0A880A3>啣葷銝𥪯<E98A9D><EFBFBD>撣扳𧊋憭<F0A78A8B><E686AD>摰䕘<E691B0><E49598><EFBFBD><E8BAB0>?Pending 撣改<E692A3>蝖桐<E89D96><EFBFBD><E686AD><EFBFBD><EFBFBD><EFBFBD>唳㺭<E594B3><EFBFBD>?3. **蝏𤘪<E89D8F>憭滨鍂**嚗𡁜銁<F0A1819C>𤾸蝱憭<E89DB1><E686AD>摰峕<E691B0><E5B395><EFBFBD>撟踵偘銝𠹺<E98A9D>撣抒<E692A3><EFBFBD>瘚讠<E7989A><E8AEA0><EFBFBD>靽脲<E99DBD> UI <20>瑟鰵<E7919F><E9B0B5>蛹 10FPS<50>?
**<EFBFBD><EFBFBD><EFBFBD>**嚗?- 摰<E691B0>蝡舫<E89DA1><E888AB><EFBFBD><EFBFBD>10 FPS (1280x720)
---
### 14. <20>箔辣<E7AE94><EFBFBD>銝舘䌊<E88898>臬𢆡<E887AC>滨蔭 (Day 16) <20>?
#### <20><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`嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砌葉<EFBFBD>滨蔭
- **<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>𤑳緵
<EFBFBD>滚𦛚<EFBFBD><EFBFBD>霂閧𤩅<EFBFBD>枏紡<EFBFBD>芣𧒄<EFBFBD>𤑳緵<EFBFBD><EFBFBD><EFBFBD><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>?
#### 閫<><E996AB><EFBFBD><EFBFBD>
雿輻鍂 **PyNvJpeg** 撠?JPEG 蝻𤥁圾<F0A4A581><E59CBE><EFBFBD>?GPU嚗?
```bash
pip install pynvjpeg
```
```python
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)
```
**<EFBFBD><EFBFBD>?*嚗尠<E59A97> <20><EFBFBD><E88AB8><EFBFBD><EFBFBD><E695BA><EFBFBD><EFBFBD><E4BA99>?
---
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?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>