{"id":11796,"date":"2026-07-22T11:00:59","date_gmt":"2026-07-22T02:00:59","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11796"},"modified":"2026-07-22T11:00:59","modified_gmt":"2026-07-22T02:00:59","slug":"zephyr-rtos-%ec%9c%a0%ec%84%a0-%ec%9d%b8%ed%84%b0%eb%84%b7ethernet-%eb%94%94%eb%b0%94%ec%9d%b4%ec%8a%a4-%eb%93%9c%eb%9d%bc%ec%9d%b4%eb%b2%84-%ec%9e%91%ec%84%b1-%ea%b0%80%ec%9d%b4%eb%93%9c","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11796","title":{"rendered":"Zephyr RTOS &#8211; \uc720\uc120 \uc778\ud130\ub137(Ethernet) \ub514\ubc14\uc774\uc2a4 \ub4dc\ub77c\uc774\ubc84 \uc791\uc131 \uac00\uc774\ub4dc"},"content":{"rendered":"<h1>Zephyr RTOS &#8211; \uc720\uc120 \uc778\ud130\ub137(Ethernet) \ub514\ubc14\uc774\uc2a4 \ub4dc\ub77c\uc774\ubc84 \uc791\uc131 \uac00\uc774\ub4dc<\/h1>\n<p>Zephyr RTOS\ub294 \uc784\ubca0\ub514\ub4dc \uc2dc\uc2a4\ud15c\uc758 \ub2e4\uc591\ud55c \ud558\ub4dc\uc6e8\uc5b4\ub97c \ucd94\uc0c1\ud654\ud558\uae30 \uc704\ud574 \uac15\ub825\ud55c \ub4dc\ub77c\uc774\ubc84 \ubaa8\ub378(Driver Model)\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubcf8 \uae00\uc5d0\uc11c\ub294 Zephyr \uba54\uc778\ub77c\uc778\uc5d0 \uc218\ub85d\ub41c \uc720\uc120 \uc778\ud130\ub137 \ucee8\ud2b8\ub864\ub7ec \ub4dc\ub77c\uc774\ubc84 <strong>Microchip ENC28J60<\/strong>(<code>drivers\/ethernet\/eth_enc28j60.c<\/code>) \uc0ac\ub840\ub97c \ubc14\ud0d5\uc73c\ub85c, \uc0c8\ub85c\uc6b4 \ub124\ud2b8\uc6cc\ud06c \ub4dc\ub77c\uc774\ubc84\ub97c \uc9c1\uc811 \uc124\uacc4\ud558\uace0 \uad6c\ud604\ud558\ub294 \uc804\uccb4 \ud504\ub85c\uc138\uc2a4\ub97c \ub2e8\uacc4\ubcc4\ub85c \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n<hr \/>\n<h2>1. Zephyr \ub4dc\ub77c\uc774\ubc84 \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694<\/h2>\n<p>Zephyr \ub4dc\ub77c\uc774\ubc84\ub294 \ud06c\uac8c 3\uac00\uc9c0 \ud30c\uc77c\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-text\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   Device Tree Binding  \u2502 (.yaml)  : \ud558\ub4dc\uc6e8\uc5b4 \uc18d\uc131(\ud540, \ud074\ub85d, IRQ \ub4f1) \uc815\uc758\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n            \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502     Kconfig System     \u2502 (Kconfig): \ube4c\ub4dc \uc635\uc158 \ubc0f \uae30\ub2a5 Enable\/Disable \uc81c\uc5b4\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n            \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  Driver Implementation \u2502 (.c)     : \uc2e4\uc81c C \uc5b8\uc5b4 \uae30\ubc18 \ub4dc\ub77c\uc774\ubc84 \ub85c\uc9c1 \uad6c\ud604\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<p>\ub124\ud2b8\uc6cc\ud06c \ub4dc\ub77c\uc774\ubc84\uc758 \uacbd\uc6b0, Zephyr\uc758 L2 Network Interface (Network Stack)\uc640 \uc5f0\uacb0\ub418\uc5b4 \uc0c1\uc704 IP \uc2a4\ud0dd(L3)\uacfc\uc758 \ub370\uc774\ud130 \uc1a1\uc218\uc2e0\uc744 \ub2f4\ub2f9\ud569\ub2c8\ub2e4.<\/p>\n<hr \/>\n<h2>2. 1\ub2e8\uacc4: Device Tree Binding \uc791\uc131<\/h2>\n<p>\ud558\ub4dc\uc6e8\uc5b4 \uc5f0\uacb0 \uc815\ubcf4(SPI \ubc84\uc2a4, CS \ud540, INT \ud540 \ub4f1)\ub97c \uc0c1\ud615\ubb38\uc790\ucc98\ub7fc \uc815\uc758\ud558\uae30 \uc704\ud574 DT Binding YAML \ud30c\uc77c\uc744 \uc791\uc131\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uacbd\ub85c \uc608\uc2dc<\/strong>: <code>dts\/bindings\/net\/microchip,enc28j60.yaml<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-yaml\"># microchip,enc28j60.yaml\ndescription: Microchip ENC28J60 Standalone Ethernet Controller with SPI Interface\n\ncompatible: &quot;microchip,enc28j60&quot;\n\ninclude: [ethernet-controller.yaml, spi-device.yaml]\n\nproperties:\n  int-gpios:\n    type: phandle-array\n    required: true\n    description: Interrupt pin specifier\n\n  local-mac-address:\n    type: uint8-array\n    description: Default MAC address setting\n<\/code><\/pre>\n<blockquote>\n<p><strong>Tip<\/strong>: <code>compatible<\/code> \ubb38\uc790\uc5f4\uc740 DTS \ud30c\uc77c\uc5d0\uc11c \ub4dc\ub77c\uc774\ubc84 \ub9e4\uce6d\uc744 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 \uace0\uc720 \ud0a4 \uac12\uc785\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>3. 2\ub2e8\uacc4: Kconfig \uad6c\uc131<\/h2>\n<p>\ub4dc\ub77c\uc774\ubc84\ub97c \ube4c\ub4dc \uc2dc\uc2a4\ud15c\uc5d0 \ud3ec\ud568\uc2dc\ud0a4\uace0, \uc2a4\ub808\ub4dc \uc6b0\uc120\uc21c\uc704 \ubc0f \ubc84\ud37c \ud06c\uae30 \ub4f1\uc744 \uc81c\uc5b4\ud558\uae30 \uc704\ud55c Kconfig \uc635\uc158\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uacbd\ub85c \uc608\uc2dc<\/strong>: <code>drivers\/ethernet\/Kconfig.enc28j60<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-kconfig\">config ETH_ENC28J60\n    bool &quot;Microchip ENC28J60 Ethernet controller driver&quot;\n    default y\n    depends on DT_HAS_MICROCHIP_ENC28J60_ENABLED\n    select SPI\n    help\n      Enable Microchip ENC28J60 Ethernet driver.\n\nif ETH_ENC28J60\n\nconfig ETH_ENC28J60_RX_THREAD_STACK_SIZE\n    int &quot;RX thread stack size&quot;\n    default 1024\n    help\n      Stack size for the Ethernet interrupt deferred processing thread.\n\nconfig ETH_ENC28J60_RX_THREAD_PRIO\n    int &quot;RX thread priority&quot;\n    default 2\n    help\n      Priority for the Ethernet RX thread.\n\nendif # ETH_ENC28J60\n<\/code><\/pre>\n<hr \/>\n<h2>4. 3\ub2e8\uacc4: \ub4dc\ub77c\uc774\ubc84 \uc18c\uc2a4 \ucf54\ub4dc \uad6c\ud604<\/h2>\n<p>\uc2e4\uc81c \ub4dc\ub77c\uc774\ubc84 \ub3d9\uc791 \ub85c\uc9c1\uc744 \uc791\uc131\ud558\ub294 \ub2e8\uacc4\uc785\ub2c8\ub2e4. Ethernet \ub4dc\ub77c\uc774\ubc84\ub294 Zephyr\uc758 <code>net_if<\/code> \ubc0f <code>ethernet_api<\/code> \uc778\ud130\ud398\uc774\uc2a4\ub97c \ubc18\ub4dc\uc2dc \uad6c\ud604\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uacbd\ub85c \uc608\uc2dc<\/strong>: <code>drivers\/ethernet\/eth_enc28j60.c<\/code><\/li>\n<\/ul>\n<h3>\u2460 \uc124\uc815 \ubc0f \ub7f0\ud0c0\uc784 \ub370\uc774\ud130 \uad6c\uc870\uccb4 \uc815\uc758<\/h3>\n<p>\ub4dc\ub77c\uc774\ubc84\uc758 ROM(Config) \uc601\uc5ed\uacfc RAM(Context Data) \uc601\uc5ed\uc744 \uad6c\ubd84\ud558\uc5ec \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-c\">#define DT_DRV_COMPAT microchip_enc28j60\n\n#include &lt;zephyr\/kernel.h&gt;\n#include &lt;zephyr\/drivers\/spi.h&gt;\n#include &lt;zephyr\/drivers\/gpio.h&gt;\n#include &lt;zephyr\/net\/net_if.h&gt;\n#include &lt;zephyr\/net\/ethernet.h&gt;\n\n\/* ROM \uc601\uc5ed: DTS\ub85c\ubd80\ud130 \uc77d\uc5b4\uc628 \ubd88\ubcc0 \uc815\ubcf4 *\/\nstruct eth_enc28j60_config {\n    struct spi_dt_spec spi;\n    struct gpio_dt_spec interrupt;\n};\n\n\/* RAM \uc601\uc5ed: \ub7f0\ud0c0\uc784 \uc0c1\ud0dc \ubc0f \ubc84\ud37c *\/\nstruct eth_enc28j60_runtime {\n    struct net_if *iface;\n    uint8_t mac_address[6];\n    struct k_thread thread;\n    K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_ETH_ENC28J60_RX_THREAD_STACK_SIZE);\n    struct k_sem lock;\n    struct gpio_callback gpio_cb;\n};\n<\/code><\/pre>\n<hr \/>\n<h3>\u2461 Ethernet API \ud568\uc218 \uc791\uc131<\/h3>\n<p>\uc0c1\uc704 \ub124\ud2b8\uc6cc\ud0b9 \uc2a4\ud0dd\uc5d0\uc11c \ud328\ud0b7\uc744 \ubcf4\ub0bc \ub54c \ud638\ucd9c\ud560 \ud568\uc218(<code>send<\/code>)\uc640 \ucd08\uae30\ud654 \ud568\uc218(<code>iface_api<\/code>)\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-c\">\/* \ub370\uc774\ud130 \ud328\ud0b7 \uc804\uc1a1 \ub85c\uc9c1 *\/\nstatic int eth_enc28j60_send(const struct device *dev, struct net_pkt *pkt)\n{\n    struct eth_enc28j60_runtime *context = dev-&gt;data;\n\n    k_sem_take(&amp;context-&gt;lock, K_FOREVER);\n\n    \/* 1. net_pkt\uc5d0\uc11c \uc774\ub354\ub137 \ud504\ub808\uc784 \ub370\uc774\ud130 \ucd94\ucd9c *\/\n    \/* 2. SPI \ud1b5\uc2e0\uc744 \uc774\uc6a9\ud574 \ud558\ub4dc\uc6e8\uc5b4 TX \ubc84\ud37c\ub85c \ud328\ud0b7 \uc804\uc1a1 \uba85\ub839 *\/\n    \/* 3. \ud558\ub4dc\uc6e8\uc5b4 \uc804\uc1a1 \uc2dc\uc791 \ube44\ud2b8 \ud65c\uc131\ud654 *\/\n\n    k_sem_give(&amp;context-&gt;lock);\n\n    return 0;\n}\n\n\/* \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4 \ucd08\uae30\ud654 \ucf5c\ubc31 *\/\nstatic void eth_enc28j60_iface_init(struct net_if *iface)\n{\n    const struct device *dev = net_if_get_device(iface);\n    struct eth_enc28j60_runtime *context = dev-&gt;data;\n\n    \/* Interface \ucd08\uae30\ud654 \ubc0f MAC \uc8fc\uc18c \uc124\uc815 *\/\n    net_if_set_link_addr(iface, context-&gt;mac_address, sizeof(context-&gt;mac_address),\n                 NET_LINK_ETHERNET);\n\n    context-&gt;iface = iface;\n    ethernet_init(iface);\n}\n\n\/* Ethernet API \uad6c\uc870\uccb4 \ubc14\uc778\ub529 *\/\nstatic const struct ethernet_api eth_enc28j60_api = {\n    .iface_api.init = eth_enc28j60_iface_init,\n    .send = eth_enc28j60_send,\n};\n<\/code><\/pre>\n<hr \/>\n<h3>\u2462 \uc778\ud130\ub7fd\ud2b8 \ubc0f \uc9c0\uc5f0 \ucc98\ub9ac \uc2a4\ub808\ub4dc (ISR &amp; Deferred Thread)<\/h3>\n<p>\ub124\ud2b8\uc6cc\ud06c \ud328\ud0b7 \uc218\uc2e0\uc740 \uc2dc\uac04 \ubbfc\uac10\ub3c4\uac00 \ub192\uc9c0\ub9cc, ISR \ub0b4\uc5d0\uc11c \uc9c1\uc811 SPI \ud1b5\uc2e0\uc744 \uc218\ud589\ud558\uba74 blocking\uc774 \ubc1c\uc0dd\ud558\ubbc0\ub85c \uc9c0\uc5f0 \ucc98\ub9ac \uc2a4\ub808\ub4dc(Deferred Work\/Thread)\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 Zephyr\uc758 \uad8c\uc7a5 \ud328\ud134\uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-c\">static void eth_enc28j60_rx_thread(void *arg1, void *arg2, void *arg3)\n{\n    const struct device *dev = arg1;\n    struct eth_enc28j60_runtime *context = dev-&gt;data;\n\n    while (1) {\n        \/* ISR \uc2e0\ud638\ub97c \ub300\uae30 *\/\n        k_sem_take(&amp;context-&gt;lock, K_FOREVER);\n\n        \/* SPI\ub97c \ud1b5\ud574 \ud558\ub4dc\uc6e8\uc5b4 \uc218\uc2e0 \ubc84\ud37c \uc77d\uae30 *\/\n        \/* net_pkt_rx_alloc()\uc744 \ud1b5\ud574 \ud328\ud0b7 \ud560\ub2f9 \ud6c4 net_recv_data()\ub85c \uc0c1\uc704 \uc2a4\ud0dd \uc804\ub2ec *\/\n    }\n}\n\n\/* GPIO \uc778\ud130\ub7fd\ud2b8 \ucf5c\ubc31 (ISR \ub9e5\ub77d) *\/\nstatic void eth_enc28j60_gpio_callback(const struct device *port,\n                       struct gpio_callback *cb,\n                       uint32_t pins)\n{\n    struct eth_enc28j60_runtime *context =\n        CONTAINER_OF(cb, struct eth_enc28j60_runtime, gpio_cb);\n\n    \/* \uc9c0\uc5f0 \uc2a4\ub808\ub4dc\ub97c \uae68\uc6b0\uae30 \uc704\ud55c \uc138\ub9c8\ud3ec\uc5b4 \uc2e0\ud638 *\/\n    k_sem_give(&amp;context-&gt;lock);\n}\n<\/code><\/pre>\n<hr \/>\n<h3>\u2463 \ub514\ubc14\uc774\uc2a4 \uc778\uc2a4\ud134\uc2a4\ud654 \ub9e4\ud06c\ub85c (Multi-Instance support)<\/h3>\n<p>Zephyr\uc758 \ub9e4\ud06c\ub85c \uc2dc\uc2a4\ud15c\uc744 \ud65c\uc6a9\ud558\uc5ec \ubcf4\ub4dc \ud30c\uc77c\uc5d0 \uc815\uc758\ub41c \uc5ec\ub7ec \uac1c\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-c\">static int eth_enc28j60_init(const struct device *dev)\n{\n    const struct eth_enc28j60_config *config = dev-&gt;config;\n    struct eth_enc28j60_runtime *context = dev-&gt;data;\n\n    \/* 1. SPI \ubc84\uc2a4 \uc0c1\ud0dc \ud655\uc778 *\/\n    if (!spi_is_ready_dt(&amp;config-&gt;spi)) {\n        return -ENODEV;\n    }\n\n    \/* 2. GPIO \uc778\ud130\ub7fd\ud2b8 \ud540 \uc124\uc815 *\/\n    gpio_pin_configure_dt(&amp;config-&gt;interrupt, GPIO_INPUT);\n    gpio_init_callback(&amp;context-&gt;gpio_cb, eth_enc28j60_gpio_callback, BIT(config-&gt;interrupt.pin));\n    gpio_add_callback(config-&gt;interrupt.port, &amp;context-&gt;gpio_cb);\n\n    \/* 3. RX \ucc98\ub9ac \uc804\uc6a9 \uc2a4\ub808\ub4dc \uc0dd\uc131 *\/\n    k_thread_create(&amp;context-&gt;thread, context-&gt;thread_stack,\n            CONFIG_ETH_ENC28J60_RX_THREAD_STACK_SIZE,\n            eth_enc28j60_rx_thread, (void *)dev, NULL, NULL,\n            K_PRIO_COOP(CONFIG_ETH_ENC28J60_RX_THREAD_PRIO),\n            0, K_NO_WAIT);\n\n    return 0;\n}\n\n\/* \ub9e4\ud06c\ub85c\ub97c \uc774\uc6a9\ud55c \uc778\uc2a4\ud134\uc2a4 \uc790\ub3d9 \ub4f1\ub85d *\/\n#define ETH_ENC28J60_INIT(inst)                                                \\\n    static const struct eth_enc28j60_config eth_enc28j60_config_##inst = { \\\n        .spi = SPI_DT_SPEC_INST_GET(inst, SPI_WORD_SET(8), 0),         \\\n        .interrupt = GPIO_DT_SPEC_INST_GET(inst, int_gpios),          \\\n    };                                                                     \\\n                                                                               \\\n    static struct eth_enc28j60_runtime eth_enc28j60_runtime_##inst;        \\\n                                                                               \\\n    ETH_NET_DEVICE_DT_INST_DEFINE(inst,                                    \\\n                      eth_enc28j60_init,                       \\\n                      NULL,                                    \\\n                      &amp;eth_enc28j60_runtime_##inst,            \\\n                      &amp;eth_enc28j60_config_##inst,             \\\n                      CONFIG_ETH_INIT_PRIORITY,                \\\n                      &amp;eth_enc28j60_api,                       \\\n                      NET_ETH_MTU);\n\n\/* DTS\uc5d0 \uc815\uc758\ub41c \ubaa8\ub4e0 active node\uc5d0 \ub300\ud574 \uc704 \ub9e4\ud06c\ub85c \uc2e4\ud589 *\/\nDT_INST_FOREACH_STATUS_OKAY(ETH_ENC28J60_INIT)\n<\/code><\/pre>\n<hr \/>\n<h2>5. \ud575\uc2ec \uccb4\ud06c\ud3ec\uc778\ud2b8 &amp; Best Practices<\/h2>\n<ol>\n<li><strong><code>ETH_NET_DEVICE_DT_INST_DEFINE<\/code> \ub9e4\ud06c\ub85c \ud65c\uc6a9<\/strong><br \/>\n\uc77c\ubc18 \ub514\ubc14\uc774\uc2a4 \ub4dc\ub77c\uc774\ubc84\ub294 <code>DEVICE_DT_INST_DEFINE<\/code>\uc744 \uc0ac\uc6a9\ud558\uc9c0\ub9cc, \uc774\ub354\ub137 \ub514\ubc14\uc774\uc2a4\ub294 L2 \uc778\ud130\ud398\uc774\uc2a4 \uc218\ub85d \ubc0f <code>net_if<\/code> \ub370\uc774\ud130 \ubc14\uc778\ub529\uc744 \uc790\ub3d9\ud654\ud574 \uc8fc\ub294 \ub124\ud2b8\uc6cc\ud06c \uc804\uc6a9 \ucd08\uae30\ud654 \ub9e4\ud06c\ub85c\uc778 <code>ETH_NET_DEVICE_DT_INST_DEFINE<\/code>\uc744 \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li><strong>ISR \ucd5c\uc18c\ud654 &amp; \uc2a4\ub808\ub4dc \ud65c\uc6a9<\/strong><br \/>\nSPI\/I2C \ubc84\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ucee8\ud2b8\ub864\ub7ec\ub294 \ud1b5\uc2e0 \uc2dc \ube14\ub85c\ud0b9(Blocking) \ub3d9\uc791\uc774 \ud3ec\ud568\ub418\ubbc0\ub85c \uc778\ud130\ub7fd\ud2b8 \ud578\ub4e4\ub7ec(ISR) \ub0b4\ubd80\uc5d0\uc11c \uc9c1\ub82c \ud1b5\uc2e0\uc744 \uc218\ud589\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \ubc18\ub4dc\uc2dc \uc138\ub9c8\ud3ec\uc5b4\ub098 \uc6cc\ud06c\ud050(<code>k_work<\/code>)\ub97c \ud1b5\ud574 \uc2a4\ub808\ub4dc\ub85c \ub118\uaca8 \ucc98\ub9ac\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li><strong>Memory Alignment &amp; Ring Buffer<\/strong><br \/>\n\uace0\uc18d \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0\uc758 \uacbd\uc6b0, DMA \uc811\uadfc\uc744 \uc704\ud574 \uc1a1\uc218\uc2e0 \ubc84\ud37c\uc758 \uba54\ubaa8\ub9ac \uc815\ub82c(Memory Alignment) \uaddc\uce59\uc744 \ubc18\ub4dc\uc2dc \uc900\uc218\ud574\uc57c \uc131\ub2a5 \ubcd1\ubaa9\uc774 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ol>\n<hr \/>\n<h2>\ud83d\udca1 \uc694\uc57d<\/h2>\n<p>Zephyr\uc758 \ub124\ud2b8\uc6cc\ud06c \ub4dc\ub77c\uc774\ubc84 \uc791\uc131 \uacfc\uc815\uc740 <strong>[DTS \uc815\uc758 \u2192 Kconfig \uc2a4\uc704\uce58 \uad6c\uc131 \u2192 <code>ethernet_api<\/code> \uad6c\ud604 \ubc0f <code>ETH_NET_DEVICE_DT_INST_DEFINE<\/code> \ub4f1\ub85d]<\/strong> \ud750\ub984\uc744 \ucda9\uc2e4\ud788 \ub530\ub985\ub2c8\ub2e4.<\/p>\n<p>\uba54\uc778\ub77c\uc778 \ub4dc\ub77c\uc774\ubc84 \ucf54\ub4dc\ub97c \ucee4\uc2a4\ud140 \ub4dc\ub77c\uc774\ubc84 \uac1c\ubc1c\uc758 \uc2a4\ud0c0\ud130 \ud0b7\uc73c\ub85c \ucc38\uace0\ud558\uba74 \ud45c\uc900\uc5d0 \ub9de\ub294 \uc548\uc815\uc801\uc778 \ub4dc\ub77c\uc774\ubc84\ub97c \uc2e0\uc18d\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zephyr RTOS &#8211; \uc720\uc120 \uc778\ud130\ub137(Ethernet) \ub514\ubc14\uc774\uc2a4 \ub4dc\ub77c\uc774\ubc84 \uc791\uc131 \uac00\uc774\ub4dc Zephyr RTOS\ub294 \uc784\ubca0\ub514\ub4dc \uc2dc\uc2a4\ud15c\uc758 \ub2e4\uc591\ud55c \ud558\ub4dc\uc6e8\uc5b4\ub97c \ucd94\uc0c1\ud654\ud558\uae30 \uc704\ud574 \uac15\ub825\ud55c \ub4dc\ub77c\uc774\ubc84 \ubaa8\ub378(Driver Model)\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf8 \uae00\uc5d0\uc11c\ub294 Zephyr \uba54\uc778\ub77c\uc778\uc5d0 \uc218\ub85d\ub41c \uc720\uc120 \uc778\ud130\ub137 \ucee8\ud2b8\ub864\ub7ec \ub4dc\ub77c\uc774\ubc84 Microchip ENC28J60(drivers\/ethernet\/eth_enc28j60.c) \uc0ac\ub840\ub97c \ubc14\ud0d5\uc73c\ub85c, \uc0c8\ub85c\uc6b4 \ub124\ud2b8\uc6cc\ud06c \ub4dc\ub77c\uc774\ubc84\ub97c \uc9c1\uc811 \uc124\uacc4\ud558\uace0 \uad6c\ud604\ud558\ub294 \uc804\uccb4 \ud504\ub85c\uc138\uc2a4\ub97c \ub2e8\uacc4\ubcc4\ub85c \uc124\uba85\ud569\ub2c8\ub2e4. 1. Zephyr \ub4dc\ub77c\uc774\ubc84 \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694 Zephyr \ub4dc\ub77c\uc774\ubc84\ub294 \ud06c\uac8c 3\uac00\uc9c0 \ud30c\uc77c\ub85c\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11796\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-11796","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11796"}],"version-history":[{"count":1,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11796\/revisions"}],"predecessor-version":[{"id":11797,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11796\/revisions\/11797"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}