๐ English Abstract
This article addresses critical Ethernet communication failures on STM32H7 microcontrollers using the LwIP protocol stack during continuous high-throughput TCP data streaming. It explores the root causes of pbuf memory leaks triggered by D-Cache coherency mismatch, improper MPU (Memory Protection Unit) configurations, and DMA descriptor starvation. Furthermore, it details step-by-step troubleshooting procedures and demonstrates a Zero-Copy asynchronous pipeline implementation to achieve maximum throughput with minimal CPU overhead.
STM32H7 ์๋ฆฌ์ฆ๋ ์ต๋ 480MHz ์ด์์ ๋์ ํด๋ญ ์คํผ๋์ ๊ฐ๋ ฅํ ํผํฌ๋จผ์ค๋ฅผ ์ ๊ณตํ๋ ARM Cortex-M7 ๊ธฐ๋ฐ์ 32๋นํธ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ(MCU)์ ๋๋ค. ํนํ ๊ณ ์ ์ด์ ์ง์ฐ ์ด๋๋ท(Ethernet) MAC ๋งคํฌ๋ก๋ฅผ ํ์ฌํ๊ณ ์์ด ์ฐ์ ์ฉ ๊ฒ์ดํธ์จ์ด, ์๋ฃ๊ธฐ๊ธฐ, ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ์์ง(DAQ) ์ฅ๋น ๋ฑ์ ๋๋ฆฌ ์ฐ์ ๋๋ค.
ํ์ง๋ง LwIP(Lightweight IP) ๊ฒฝ๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ ์คํ์ STM32H7์ ์ด์ํ์ฌ ๋์ฉ๋ TCP(Transmission Control Protocol) ์คํธ๋ฆฌ๋ฐ ํต์ ์ ๊ตฌํํ๋ค ๋ณด๋ฉด, ๋์ ํ ์ ๋ถ์์ ์ ์๊ฐ ๋ด์ ํต์ ์ด ๊ฐ์๊ธฐ ์ค๋จ๋๋ ์น๋ช
์ ์ธ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณค ํฉ๋๋ค. ๋๋ฒ๊ฑฐ๋ฅผ ์ฐ๊ฒฐํด ๋ณด๋ฉด ๋๋ถ๋ถ LwIP์ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ธ pbuf ํ ๋น ์คํจ(ERR_MEM) ๋๋ DMA ๋์คํฌ๋ฆฝํฐ ๊ต์ฐฉ ์ํ(Deadlock)์ ๋น ์ ธ ์์ต๋๋ค.
๋ณธ ํฌ์คํ ์์๋ STM32H7 MCU ํ๊ฒฝ์์ ๋์ฉ๋ TCP ๋ฐ์ดํฐ ์ก์์ ์ค ๋ฐ์ํ ์ ์๋ pbuf ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)์ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด ์ํคํ ์ฒ ๊ด์ ์์ ํ์ ํ๊ณ , ์ด๋ฅผ ์์ ํ ํด๊ฒฐํ๋ Zero-Copy ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ(Asynchronous Pipeline) ์ต์ ํ ๊ธฐ๋ฒ์ ์ค๋ฌด ์ฝ๋์ ํจ๊ป ๊น์ด ์๊ฒ ๋ค๋ฃน๋๋ค.
1. STM32H7 LwIP TCP ํต์ ์ค๋จ ํ์์ ๊ทผ๋ณธ ์์ธ ๋ถ์
STM32H7์์ LwIP๋ฅผ ํตํด ๋์ฉ๋ TCP ํธ๋ํฝ์ ์ฒ๋ฆฌํ ๋ ์์คํ ์ด ๋ฉ์ถ๊ฑฐ๋ ํจํท ๋๋(Packet Drop)์ด ๋๋ฏธ๋ ธ ํ์์ฒ๋ผ ๋ฐ์ํ๋ ์์ธ์ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ์์ฝํ ์ ์์ต๋๋ค.
1.1 D-Cache Coherency(๋ฐ์ดํฐ ์บ์ ์ผ๊ด์ฑ) ๋ถ์ผ์น
Cortex-M7 ์ฝ์ด๋ L1 ๋ฐ์ดํฐ ์บ์(D-Cache)๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. ์ด๋๋ท MAC์ DMA(Direct Memory Access) ์ปจํธ๋กค๋ฌ๊ฐ SRAM์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๊ฑฐ๋ ์ธ ๋, CPU์ D-Cache์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ค์ SRAM ๋ฐ์ดํฐ ๊ฐ์ ์ผ๊ด์ฑ ๋ถ์ผ์น(Coherency Mismatch)๊ฐ ๋ฐ์ํฉ๋๋ค.
- Rx(์์ ) ๋ฐฉํฅ: DMA๊ฐ ์ด๋๋ท ํจํท์ SRAM์ ์จ ๋ฃ์์ง๋ง, CPU๋ D-Cache์ ์ค๋๋(Stale) ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ํจํท ์์ ๋ฐ์.
- Tx(์ก์ ) ๋ฐฉํฅ: CPU๊ฐ ํจํท์ ์ค๋นํ๊ณ D-Cache์๋ง ๋ฐ์๋ ์ํ์์, DMA๊ฐ SRAM์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋คํธ์ํฌ๋ก ์ก์ .
์ด ๊ณผ์ ์์ ํจํท์ ๊ธธ์ด(Length) ์ ๋ณด๋ ํฌ์ธํฐ ๊ตฌ์กฐ์ฒด๊ฐ ์ค์ผ๋๋ฉด LwIP๋ ํจํท ์์ ์ ์๋ฃํ์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ธ pbuf๋ฅผ ์ฒด์ธ(Chain) ํํ๋ก ๋ฌถ์ด๋ ์ฑ ํด์ ํ์ง ๋ชปํ๋ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak) ์ํ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
1.2 pbuf ํ ๋น ํด์ ํ์ด๋ฐ ๋ถ์ผ์น ๋ฐ ๋์คํฌ๋ฆฝํฐ ๊ณ ๊ฐ
LwIP์์ PBUF_POOL ํ์
๋ฒํผ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ Rx DMA ๋์คํฌ๋ฆฝํฐ(Descriptor)์ ์ฌ์ ์ ํ ๋น(Pre-allocation)๋ฉ๋๋ค. ์์ ์ธํฐ๋ฝํธ(ISR)๊ฐ ๋ฐ์ํ๋ฉด ์์ ๋ pbuf๋ฅผ ์์ ๋ ์ด์ด(TCP/IP Stack)๋ก ์ ๋ฌํ๊ณ ์๋ก์ด pbuf๋ฅผ ํ ๋นํ์ฌ ๋์คํฌ๋ฆฝํฐ์ ์ฑ์๋ฃ์ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ๋์ ํธ๋ํฝ ํ๊ฒฝ์์ ์ฒ๋ฆฌ ์๋๊ฐ ์์ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ฉด ์๊ฐ์ ์ผ๋ก pbuf ํ(Pool)์ด ๊ณ ๊ฐ๋๋ฉฐ, ๋์คํฌ๋ฆฝํฐ์ NULL ํฌ์ธํฐ๊ฐ ๋ค์ด๊ฐ๋ Rx Descriptor Starvation ํ์์ด ๋ฐ์ํฉ๋๋ค. ํ๋ฒ ๋์คํฌ๋ฆฝํฐ ๊ณ ๊ฐ ์ํ์ ๋น ์ง๋ฉด STM32 ์ด๋๋ท DMA๋ ์์ ์ ์ง(Suspended) ์ํ๊ฐ ๋๋ฉฐ, ์ด๋ฅผ ๋ณต๊ตฌํ๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฉด ํต์ ์ด ์๊ตฌ์ ์ผ๋ก ๋์ ๋ฉ๋๋ค.
1.3 MPU(Memory Protection Unit) ์ค์ ์ค๋ฅ
STM32H7์ ๋ง๋ชจ์ค๊ธ RAM ๊ตฌ์กฐ(AXI SRAM, SRAM1/2/3, D3 Domain SRAM4 ๋ฑ)์์ ์ด๋๋ท DMA ๋์คํฌ๋ฆฝํฐ์ LwIP pbuf๊ฐ ์์นํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ MPU ์์ฑ์ ์ ํํ ์ ์ดํ์ง ์์ผ๋ฉด Cache Invalidate/Clean ์กฐ์๋ง์ผ๋ก ์๋ฒฝํ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ด๋ ต์ต๋๋ค.
| ๊ตฌ๋ถ (Memory Type) | ์ถ์ฒ SRAM ์์ญ | MPU ์์ฑ (Cache Policy) | ์ฃผ์ ์ฉ๋ |
|---|---|---|---|
| Ethernet Descriptors | SRAM3 (0x30040000) | Non-cacheable / Bufferable | DMA Rx/Tx Ring Descriptor ํ ์ด๋ธ |
| LwIP pbuf Pool | AXI SRAM / SRAM1,2 | Write-Through ๋๋ Write-Back | ์ค์ ํจํท ํ์ด๋ก๋(Payload) ๋ฒํผ |
2. ๋๋ฒ๊น ๋ฐ MPU/Cache ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์
pbuf ๋์๋ฅผ ์ฐจ๋จํ๊ธฐ ์ํด์๋ ๊ฐ์ฅ ๋จผ์ ํ๋์จ์ด DMA ์์ญ๊ณผ CPU ์บ์ ๊ฐ์ ์ ๋ขฐ์ฑ ๋์ ๋๊ธฐํ ์ค์ ์ ์๋ฃํด์ผ ํฉ๋๋ค.
2.1 MPU ์ฌ๋ฐ๋ฅธ ์์ญ ๋ถ๋ฆฌ ๋ฐ ๊ตฌ์ฑ
์ด๋๋ท ๋์คํฌ๋ฆฝํฐ ์์ญ(DMA Rx/Tx Descriptor)์ ํ๋์จ์ด๊ฐ ๋น๋ฒํ๊ฒ ์ํ ํ๋(Status Field)๋ฅผ ๊ฐฑ์ ํ๋ฏ๋ก ๋ฐ๋์ ์บ์๊ฐ ์ ์ฉ๋์ง ์๋ Non-cacheable ์์ญ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค.
/* MPU Configuration for STM32H7 Ethernet */
void MPU_Config_Ethernet(void)
{
MPU_Region_InitTypeDef MPU_InitStruct = {0};
HAL_MPU_Disable();
/* 1. Descriptors: SRAM3 (Non-cacheable) */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.BaseAddress = 0x30040000;
MPU_InitStruct.Size = MPU_REGION_SIZE_256B; // ๋์คํฌ๋ฆฝํฐ ํฌ๊ธฐ์ ๋ง๊ฒ ์ค์
MPU_InitStruct.SubRegionDisable = 0x0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
MPU_InitStruct.IsShareable = MPU_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_NOT_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_NOT_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* 2. LwIP Buffers: AXI SRAM (Write-Through) */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
MPU_InitStruct.BaseAddress = 0x24000000; // AXI SRAM
MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.IsShareable = MPU_NOT_SHAREABLE;
MPU_InitStruct.IsCacheable = MPU_CACHEABLE;
MPU_InitStruct.IsBufferable = MPU_NOT_BUFFERABLE; // Write-Through
HAL_MPU_ConfigRegion(&MPU_InitStruct);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
2.2 D-Cache Maintenance(์บ์ ์ ์ง๋ณด์)์ ์ ํํ ํธ์ถ ์์น
LwIP pbuf ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์บ์ ๊ฐ๋ฅ(Cacheable) ์์ญ์ ์์นํ ๊ฒฝ์ฐ, DMA ๋์ ์ ํ๋ก ์บ์๋ฅผ ์กฐ์ํด ์ฃผ์ด์ผ ๋ฐ์ดํฐ ์ค์ผ๊ณผ ์ด์ ๋ฐ๋ฅธ pbuf ์ฐธ์กฐ ์นด์ดํธ(Ref count) ๊ผฌ์์ ๋ง์ ์ ์์ต๋๋ค.
- Rx ํจํท ์์ ์: DMA ์์ ์๋ฃ ํ CPU๊ฐ pbuf ์ฝ๊ธฐ ์ ์
SCB_InvalidateDCache_by_Addr()ํธ์ถ. - Tx ํจํท ์ก์ ์: CPU๊ฐ pbuf ์ฐ๊ธฐ ์๋ฃ ํ DMA ์ก์ ์์ ์ ์
SCB_CleanDCache_by_Addr()ํธ์ถ.
3. Zero-Copy ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ ์ต์ ํ ๊ธฐ๋ฒ
์ผ๋ฐ์ ์ธ LwIP ํฌํ
๊ตฌ์กฐ์์๋ DMA ์์ ๋ฒํผ์์ pbuf๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌ(memcpy)ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ก ์ ๋ฌํ ๋ ๋ ๋ค์ ๋ณต์ฌ๋ฅผ ์ํํฉ๋๋ค. ๋์ฉ๋(์์ญ Mbps ์ด์) TCP ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ ๋ณต์ฌ ์ฐ์ฐ์ ์ํ CPU ๋ถํ์ ํจํท ์ฒ๋ฆฌ ์ง์ฐ์ด pbuf ๊ณ ๊ฐ์ ์ ๋ฐํ๋ ํต์ฌ ์์๊ฐ ๋ฉ๋๋ค.
์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ฅผ ์์ฒ์ ์ผ๋ก ๋ฐฐ์ ํ๋ Zero-Copy ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ Architecture๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
3.1 Custom pbuf(pbuf_custom) ๊ธฐ๋ฐ์ Zero-Copy Rx ๊ตฌํ
LwIP์์ ์ ๊ณตํ๋ PBUF_REF ๋๋ PBUF_POOL ๋์ pbuf_custom ๊ตฌ์กฐ์ฒด๋ฅผ ํ์ฉํ๋ฉด, DMA ๋์คํฌ๋ฆฝํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌ ์์ด ์์ ๋ ์ด์ด๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์์ ์ด ๋๋ ๋ฒํผ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ์๋ณํ์ฌ DMA ๋์คํฌ๋ฆฝํฐ์ ๋ค์ ์ฌํ ๋น๋ฉ๋๋ค.
/* Custom pbuf Structure for Zero-Copy */
typedef struct {
struct pbuf_custom p;
void *dma_buffer_address;
} my_custom_pbuf_t;
/* Custom Free Callback Function */
void custom_pbuf_free_cb(struct pbuf *p)
{
my_custom_pbuf_t *my_p = (my_custom_pbuf_t *)p;
/* 1. D-Cache Invalidate for recycled memory */
SCB_InvalidateDCache_by_Addr((uint32_t *)my_p->dma_buffer_address, p->tot_len);
/* 2. Rx DMA Descriptor์ ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ ์ฌ์ฐ๊ฒฐ */
Reassign_Rx_Descriptor(my_p->dma_buffer_address);
/* 3. Custom Pool ๊ฐ์ฒด ๋ฐํ */
Free_Custom_Pbuf_Pool(my_p);
}
3.2 ๋น๋๊ธฐ TCP Tx ํ์ดํ๋ผ์ธ ๊ตฌ์ถ (Zero-Copy Send)
TCP ์ก์ ์ tcp_write() ํจ์์ TCP_WRITE_FLAG_COPY ๋์ 0 (Non-copy flag)์ ์ ๋ฌํ์ฌ LwIP ๋ด๋ถ์ ์ก์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ์ ์ก ์๋ฃ ์ด๋ฒคํธ์ธ tcp_sent() ์ฝ๋ฐฑ์ด ํธ์ถ๋ ๋๊น์ง ์ ๋ฌํ ์ ํ๋ฆฌ์ผ์ด์
๋ฒํผ์ ๋ด์ฉ์ด ๋ณํ๋๊ฑฐ๋ ํด์ (Free)๋๋ฉด ์ ๋ฉ๋๋ค.
/* Asynchronous Zero-Copy TCP Send Implementation */
err_t send_large_data_zero_copy(struct tcp_pcb *tpcb, uint8_t *payload_ptr, uint16_t len)
{
err_t err;
/* 1. Cache Clean: SRAM์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ RAM์ผ๋ก ๋๊ธฐํ */
SCB_CleanDCache_by_Addr((uint32_t *)payload_ptr, len);
/* 2. Zero-Copy Enqueue (TCP_WRITE_FLAG_COPY๋ฅผ ์ฌ์ฉํ์ง ์์) */
err = tcp_write(tpcb, payload_ptr, len, 0);
if (err == ERR_OK) {
/* 3. ์ฆ์ ์ ์ก ์๋ */
tcp_output(tpcb);
} else if (err == ERR_MEM) {
/* LwIP Send Queue๊ฐ ๊ฐ๋ ์ฐฌ ๊ฒฝ์ฐ ๋น๋๊ธฐ ๋ง ๋ฒํผ์์ ๋๊ธฐ */
Enqueue_Pending_Tx_Buffer(payload_ptr, len);
}
return err;
}
/* TCP Tx Sent Callback */
err_t tcp_sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
/* ์ ์ก์ด ์๋ฃ๋ ๋ฒํผ ํด์ ๋ฐ ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ ๋ค์ ํ๋ ์ ์ ์ก ํธ๋ฆฌ๊ฐ๋ง */
Release_Sent_Buffer_Memory(len);
Process_Next_Async_Tx_Queue(tpcb);
return ERR_OK;
}
3.3 LwIP ํต์ฌ ์ต์ (lwipopts.h) ํ๋ ํ๋ผ๋ฏธํฐ
STM32H7 ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ณ๋ชฉ ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด lwipopts.h ํค๋ ํ์ผ์์ ์๋ ์ค์ ๊ฐ์ ์กฐ์ ํด์ผ ํฉ๋๋ค.
MEM_ALIGNMENT = 32: Cortex-M7 D-Cache Line Size(32 Bytes)์์ ์ ๋ ฌ์ ์ํด ํ์ ์ค์ .MEMP_NUM_PBUF = 32: ์ ํ๋ฆฌ์ผ์ด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊น์ด์ ๋ง์ถ์ด ์ถฉ๋ถํ ์๋ ํ๋ณด.PBUF_POOL_SIZE = 64: Rx DMA Ring ํฌ๊ธฐ(๋ณดํต 16~32๊ฐ)์ 2๋ฐฐ ์ด์์ผ๋ก ์ค์ ํ์ฌ ํธ๋ํฝ ํญ์ฃผ ์ ๋ฐ๋๋ฝ ๋ฐฉ์ง.TCP_WND = (8 * TCP_MSS): STM32H7์ ๋์ฉ๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ถํฉํ๋๋ก ์์ ์๋์ฐ ํฌ๊ธฐ ํ์ฅ.LWIP_NETIF_TX_SINGLE_PBUF = 1: Tx ์ pbuf ์ฒด์ด๋ ๋จํธํ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฐ์๋ ๋จ์ผ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ์ฒ๋ฆฌ ๊ฐ์ .
4. ์ค๋ฌด ๋๋ฒ๊น ๊ฒ์ฆ ๋ฐ ์ต์ ํ ์ฑ๊ณผ ๋ถ์
์ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ์์คํ ์ฑ๋ฅ์ 100Mbps Full-Duplex ์ด๋๋ท ํ๊ฒฝ์์ ์ฅ์๊ฐ ๋์ฉ๋ TCP ๋ฐ์ดํฐ ์ก์์ ํ ์คํธ๋ฅผ ์งํํ์ฌ ์ธก์ ํ ๋น๊ต ๋ฐ์ดํฐ์ ๋๋ค.
| ํ๊ฐ ์งํ (Metrics) | ๊ธฐ์กด (Standard LwIP Copy) | ์ต์ ํ ํ (Zero-Copy Async) |
|---|---|---|
| TCP Throughput | ~35 Mbps (๋ถ์์ ) | 94.5 Mbps (๋ผ์ธ ์คํผ๋ ๋๋ฌ) |
| CPU ์ ์ ์จ (400MHz ๊ธฐ์ค) | 68% ~ 82% (Memcpy ๋ถํ) | 12% ~ 18% (ํ๊ธฐ์ ๊ฐ์) |
| pbuf ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ ์ฌ๋ถ | ์ ์๊ฐ ๋ด ERR_MEM ๋ฐ์ ํ ๋ค์ด | 72์๊ฐ ์ด์ ์ฐ์ ๋์ ์ ๋์ 0 |
| ์งํฐ(Jitter) / ์ง์ฐ์๊ฐ | ๋์ (๊ฐ๋น์ง ๋ฒํผ ๋์ ) | ์ด์ ์ง์ฐ (Constant Latency) |
์ค๋ฌด ์ ์ฉ ์ ์์ธ ์ฒ๋ฆฌ ์ฃ์ง ์ผ์ด์ค(Edge Cases)
- Link Down / Link Up ์ฌ์ค์ : ๋์ ํ์ฐฉ ์ ์ด๋๋ท DMA ์ปจํธ๋กค๋ฌ๊ฐ ๋ฆฌ์
๋ฉ๋๋ค. ์ด๋ ๊ธฐ์กด์ DMA ๋์คํฌ๋ฆฝํฐ๊ฐ ์ ์ ํ๊ณ ์๋ ๋ชจ๋ pbuf ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช
์์ ์ผ๋ก
pbuf_free()ํด์ฃผ๋ Cleanup ํจ์๋ฅผ ํธ์ถํด์ผ ๋ฉ๋ชจ๋ฆฌ ์ ์ค์ ์๋ฐฉํ ์ ์์ต๋๋ค. - TCP Zero-Window ์ํ ํธ๋ค๋ง: ์์ ์ธก ์๋์ฐ ํฌ๊ธฐ๊ฐ 0์ด ๋ ๊ฒฝ์ฐ
tcp_write()๊ฐ ์ฐจ๋จ๋ฉ๋๋ค. ํ์์์ ํ์ด๋จธ๋ฅผ ๋๊ณ ์ผ์ ์๊ฐ ์ด์ ๋น๋๊ธฐ ํ์์ ๋๊ธฐํ ๊ฒฝ์ฐ ํ๋ฅผ ๋น์ฐ๊ณ ์์ผ ์ฐ๊ฒฐ์ ์์ ํ๊ฒ ๋๋๋ก ๋ฆฌ์ ๋ก์ง์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
5. ๊ฒฐ๋ก ๋ฐ ์์ฝ
STM32H7 MCU์์ LwIP ๊ธฐ๋ฐ ๋์ฉ๋ TCP ํต์ ์ ๋ฐ์ํ๋ ์์คํ ๋ค์ด ํ์์ ์ฝ๋ ์์ฒด์ ๋จ์ ์ค๋ฅ๋ผ๊ธฐ๋ณด๋ค๋ Cortex-M7์ D-Cache ๊ตฌ์กฐ, MPU ์ธํ , Ethernet DMA ๋์คํฌ๋ฆฝํฐ ๋ฉ์ปค๋์ฆ, LwIP pbuf ์๋ช ์ฃผ๊ธฐ(Lifecycle) ๊ฐ์ ์ข ํฉ์ ์ธ ์ธํฐ๋์ ๋ฏธ์์์ ๋น๋กฏ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ณธ ๊ธฐ์ฌ์์ ๋ค๋ฃฌ ํด๋ฒ์ ๋ฐํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ํคํ ์ฒ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ฉด ์๋ฒฝํ๊ณ ์์ ์ ์ธ ๊ณ ์ ์ด๋๋ท ํต์ ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
- ์ด๋๋ท ๋์คํฌ๋ฆฝํฐ ์์ญ์ Non-cacheable MPU Region์ผ๋ก ๋ถ๋ฆฌ ์ค์ .
- pbuf payload ์กฐ์ ์ Cache Invalidate / Clean API ์ ํํ ์์น์ ์ ์ฉ.
- pbuf_custom ๋ฐ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ๋์ ํ์ฌ CPU ๋ณต์ฌ ์ฐ์ฐ์ ์๊ฑฐํ๋ Zero-Copy ํ์ดํ๋ผ์ธ ๊ตฌํ.
- ๋คํธ์ํฌ ์ฌ์ฐ๊ฒฐ ๋ฐ Exception ์ํฉ ๋ฐ์ ์ Rx/Tx ๋์คํฌ๋ฆฝํฐ ๋ง ๋ฒํผ ์์ ์ด๊ธฐํ ๋ฐ pbuf ๊ฐ์ ํด์ ์์ ๋ง๋ จ.
์ด๊ณ ์ ๋ฐ ๋์ ์ ๋ขฐ์ฑ์ ์๊ตฌํ๋ ์๋ฒ ๋๋ ๋คํธ์ํฌ ์์คํ ์ ์ค๊ณ ์ค์ด๋ผ๋ฉด ์ ์ต์ ํ ํฌ์ธํธ๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ฒ์ฆํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.