<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Peter's hardware &amp;amp; software</title>
    <link>https://engschool.tistory.com/</link>
    <description>회로 설계부터 임베디드 소프트웨어,
React, Flutter,
클라우드 서버까지 다하는 
본격 종합 기술 정체성 혼돈 블로그

이멜 주소
bangbh@gmail.com</description>
    <language>ko</language>
    <pubDate>Mon, 25 May 2026 19:36:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>방피터</managingEditor>
    <image>
      <title>Peter's hardware &amp;amp; software</title>
      <url>https://tistory1.daumcdn.net/tistory/1083293/attach/b3d1b066cd914e3b938b31e52a6525d5</url>
      <link>https://engschool.tistory.com</link>
    </image>
    <item>
      <title>[kubernetes] Cert manager + Let's encrypt</title>
      <link>https://engschool.tistory.com/229</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;네이버 클라우드에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes로 시스템을 구축했단말이지..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 왠일인지...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로드 발란서에 SSL을 사서 붙여야 하더라구&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스타트업이 인증서 살 돈이 어딨어?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 let's encrypt랑 cert-manager로 구축했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 이야기를 하려고 했는데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지금 살펴보니  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-01 오후 9.00.28.png&quot; data-origin-width=&quot;2430&quot; data-origin-height=&quot;1568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u41m8/btsBioYECXj/IspMjqSQo0G1sM8zbIZYNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u41m8/btsBioYECXj/IspMjqSQo0G1sM8zbIZYNK/img.png&quot; data-alt=&quot;Certificate manger&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u41m8/btsBioYECXj/IspMjqSQo0G1sM8zbIZYNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu41m8%2FbtsBioYECXj%2FIspMjqSQo0G1sM8zbIZYNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2430&quot; height=&quot;1568&quot; data-filename=&quot;스크린샷 2023-12-01 오후 9.00.28.png&quot; data-origin-width=&quot;2430&quot; data-origin-height=&quot;1568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Certificate manger&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Certificate manager 뭔데!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왜 로드 발란서에 붙이기 쉬운건데?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8GHpL/btsBgaGX8kb/Hdob4r1fJZFuUvkDRxAzpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8GHpL/btsBgaGX8kb/Hdob4r1fJZFuUvkDRxAzpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8GHpL/btsBgaGX8kb/Hdob4r1fJZFuUvkDRxAzpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8GHpL%2FbtsBgaGX8kb%2FHdob4r1fJZFuUvkDRxAzpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2660&quot; height=&quot;1404&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Certificate manager에서 발급받고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로드 발란서에 붙이면 끝이네;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공짜고 갱신도 필요없고..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;좋긴한데 나는 뻘찟했네 ㅠㅠ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아니 분명 없었던거 같은데...... &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 kubernetes에 &lt;b&gt;cert-manager&lt;/b&gt;를 설치하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Let's encrypt&lt;/b&gt;에서 발급받아 했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 그 과정이 꽤~~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;너저분(?)했다고나 할까?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체적으로 간단하게 설명하면 이래.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. cert-manager가 let's encrypt에 인증서를 요청햇!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. let's encrypt는 도메인의 소유주를 확인하기 위한 키를 발급햇!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 그 키를 cert-manager가 dns 서버에 등록햇!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4.&amp;nbsp; let's encrypt에 도메인이 확인되면 인증서를 발급햇!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5. cert-manager가 인증서를 잘 저장햇!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;6. cert-manager가 동일한 방법으로 3개월마다 자동 갱신햇!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-01 오후 9.16.32.png&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EIxtn/btsBjReAQxR/fjsLMGQ9qov7dyLxrGbNG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EIxtn/btsBjReAQxR/fjsLMGQ9qov7dyLxrGbNG0/img.png&quot; data-alt=&quot;쿠버네티스에서 let's encrypt와 cert-manager로 뻘짓하는 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EIxtn/btsBjReAQxR/fjsLMGQ9qov7dyLxrGbNG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEIxtn%2FbtsBjReAQxR%2FfjsLMGQ9qov7dyLxrGbNG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;1084&quot; data-filename=&quot;스크린샷 2023-12-01 오후 9.16.32.png&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1084&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠버네티스에서 let's encrypt와 cert-manager로 뻘짓하는 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 때 DNS에 접근할 수 있는 권한을 Cert-manager에 줘야 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 방식을 DNS01이라고 하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래가 Cert-manager에서 DNS01 이 가능한 아이들 목록이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 현실적으로 가능한 게 Google DNS 뿐이 없더라구..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v0Eje/btsBjdCmAGn/u3PwE57pVt9ufnYO3KHwH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v0Eje/btsBjdCmAGn/u3PwE57pVt9ufnYO3KHwH0/img.png&quot; data-alt=&quot;dns01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v0Eje/btsBjdCmAGn/u3PwE57pVt9ufnYO3KHwH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv0Eje%2FbtsBjdCmAGn%2Fu3PwE57pVt9ufnYO3KHwH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;315&quot; height=&quot;652&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dns01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(참고로 HTTP01 방식이 훨씬 쉽게 동작하지만 와일드 카드가 안됨)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 후이즈에 있는 도메인의 dns를 gcp dns로 설정하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;gcp iam에서 Cert-manager가 사용할 dns01-solver라는 이름의 롤도 하나 만들어 줬어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSqz2b/btsBisGD6r8/YY3KBqKmpCsnNwX89DGsR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSqz2b/btsBisGD6r8/YY3KBqKmpCsnNwX89DGsR1/img.png&quot; data-alt=&quot;iam dns administrator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSqz2b/btsBisGD6r8/YY3KBqKmpCsnNwX89DGsR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSqz2b%2FbtsBisGD6r8%2FYY3KBqKmpCsnNwX89DGsR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2434&quot; height=&quot;958&quot; data-origin-width=&quot;2434&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;iam dns administrator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 다음에는 아래의 명령으로 key 파일을 생성하고&lt;/p&gt;
&lt;pre id=&quot;code_1701434711713&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gcloud iam service-accounts keys create key.json \
   --iam-account dns01-solver@$PROJECT_ID.iam.gserviceaccount.com&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그걸로 다시 kubernetes에 secret을 만들지.&lt;/p&gt;
&lt;pre id=&quot;code_1701434823998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create secret generic clouddns-dns01-solver-svc-acct \
   --from-file=key.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음에는 인증서가 저장될 secret을 하나 더 만들고~&lt;/p&gt;
&lt;pre id=&quot;code_1701434100854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: istio-tls
  namespace: istio-system
type: kubernetes.io/tls
stringData:
  tls.key: &quot;&quot;
  tls.crt: &quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이젠 issuer를 만들고&lt;/p&gt;
&lt;pre id=&quot;code_1701434223173&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod-dns01
  namespace: istio-system
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: &quot;너의 이메일!&quot;
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod-dns01
    # Enable the HTTP-01 challenge provider
    solvers:
    - dns01:
        cloudDNS:
          # The ID of the GCP project
          project: &quot;너의 프로젝트&quot;
          # This is the secret used to access the service account
          serviceAccountSecretRef:
            name: clouddns-dns01-solver-svc-acct
            key: key.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Issuer가 정상적으로 생성되고 나면 Certificate를 만들어 마무으리!&lt;/p&gt;
&lt;pre id=&quot;code_1701434288150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: test-domain-certificate
  namespace: istio-system
spec:
  dnsNames:
    - &quot;*.test.domain&quot;
    - &quot;test.domain&quot;
  secretName: istio-tls
  issuerRef:
    name: letsencrypt-prod-dns01
    kind: ClusterIssuer&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보통 1-2분? 정도 안에 인증서 발급이 마무리 되는 것 같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 보면 심플해보이는데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여러가지 문제들 때문에 꽤 애를 먹었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. kubernetes DNS 문제&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;cert-manager가  acme 셀프 체크를 하다가 실패하는 경우가 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;cert-manager에 기본적으로 등록된 네임서버가 도메인을 못찾아서 그렇데.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 아래처럼 설치할 때 도메인 서버를 지정하면 해결돼.&lt;/p&gt;
&lt;pre id=&quot;code_1701435466824&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm install cert-manager jetstack/cert-manager  --namespace cert-manager --create-namespace --version v1.12.0  --set installCRDs=true --set 'extraArgs={--dns01-recursive-nameservers-only,--dns01-recursive-nameservers=8.8.8.8:53\,1.1.1.1:53}'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. CRDs&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음.. 잘 기억이 안나는데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;resource type 에러? 비슷한게 나오면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 Cert-manager의 CRDs를 설치해주면 해결돼.&lt;/p&gt;
&lt;pre id=&quot;code_1701436082104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.crds.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 외에는 딱히 큰 오류가 없었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인증서가 잘 발급되어지지 않는다면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 명령들로 어디서 오류가 났는지 확인할 수 있어.&lt;/p&gt;
&lt;pre id=&quot;code_1701435261564&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k get certificate -n istio-system #인증서 보기

k get clusterissuer -n istio-system #이슈어 보기

k describe clusterissuer letsencrypt-prod-dns01 #이슈어 자세히 보기

k get certificaterequest -n istio-system #인증서 요청 보기

k describe certificaterequest -n istio-system #인증서 요청 자세히 보기

k get order -n istio-system #order

k describe order testx-main-certificate-jn6hn-115670144 -n istio-system #order 자세히

k describe challenge #challenge 자세히 보기&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 뭐가 진짜 잘 안된다 그러면!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 링크를 참고해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;생각보다 트러블 슈팅이 자세하게 잘 나와 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cert-manager.io/docs/troubleshooting/acme/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cert-manager.io/docs/troubleshooting/acme/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701436284289&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Troubleshooting Problems with ACME / Let's Encrypt Certificates&quot; data-og-description=&quot;Learn how to diagnose problems if cert-manager fails to renew ACME / Let's Encrypt Certificates.&quot; data-og-host=&quot;cert-manager.io&quot; data-og-source-url=&quot;https://cert-manager.io/docs/troubleshooting/acme/&quot; data-og-url=&quot;https://cert-manager.io/docs/troubleshooting/acme/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oAy2F/hyUFaNFmc8/3w0rgufStKLOBTn2KbUQB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://cert-manager.io/docs/troubleshooting/acme/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cert-manager.io/docs/troubleshooting/acme/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oAy2F/hyUFaNFmc8/3w0rgufStKLOBTn2KbUQB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Troubleshooting Problems with ACME / Let's Encrypt Certificates&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to diagnose problems if cert-manager fails to renew ACME / Let's Encrypt Certificates.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cert-manager.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 한가지 주의할 점은!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;lets encrypt에 요청할 수 있는 인증서, 오더, 챌린지 수에 제한이 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러니까 너무 많이 인증서를 요청하면 같은 도메인으로 인증서 발급이 제한될 수 있는거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 보통 staging 환경에서 인증서를 테스트해보고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음에 production 인증서를 발급받는게 정석임.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐 별다른 건 없고 issuer 만들 때 staging 서버에 요청하면 돼.&lt;/p&gt;
&lt;pre id=&quot;code_1701437605939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging-dns01
  namespace: istio-system
spec:
  acme:
    # The ACME server URL 여기여기여기여기여기여기여기여기가 Staging 서버 주소~!!!!!!!
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: &quot;제발 너의 이메일~~~~~&quot;
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging-dns01
    # Enable the HTTP-01 challenge provider

    solvers:
    - dns01:
        cloudDNS:
          # The ID of the GCP project
          project: &quot;프로젝트 id&quot;
          # This is the secret used to access the service account
          serviceAccountSecretRef:
            name: clouddns-dns01-solver-svc-acct
            key: key.json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 링크를 참고해!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://letsencrypt.org/docs/staging-environment/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://letsencrypt.org/docs/staging-environment/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701437530982&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Staging Environment -  Let's Encrypt&quot; data-og-description=&quot;&quot; data-og-host=&quot;letsencrypt.org&quot; data-og-source-url=&quot;https://letsencrypt.org/docs/staging-environment/&quot; data-og-url=&quot;https://letsencrypt.org/docs/staging-environment/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://letsencrypt.org/docs/staging-environment/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://letsencrypt.org/docs/staging-environment/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Staging Environment - Let's Encrypt&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;letsencrypt.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아이고 길다~~~&lt;br /&gt;걍 네이버 인증서 쓰자!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Server services/kubernetes</category>
      <category>cert-manager</category>
      <category>certficate manager</category>
      <category>clusterissuer</category>
      <category>dns01</category>
      <category>google dns</category>
      <category>Let's Encrypt</category>
      <category>ncloud</category>
      <category>네이버 클라우드</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/229</guid>
      <comments>https://engschool.tistory.com/229#entry229comment</comments>
      <pubDate>Fri, 1 Dec 2023 22:40:30 +0900</pubDate>
    </item>
    <item>
      <title>[kubernetes] MSA와 쿠버네티스는 한몸!</title>
      <link>https://engschool.tistory.com/228</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전글&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/210&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.13 - [Server services/MSA 설계] - MSA 설계&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701346226162&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MSA 설계&quot; data-og-description=&quot;거창하게 MSA 설계 라고 적어놨지만 난 MSA 실무에 투입되어 본 적도 없고 컴공 출신도 아니야 ㅋ 그런데 하게 되었으니 해야지 ㅋ 쫄지만 마 ㅋㅋㅋ Micro  Service Architecture 라더라 처음 들어봄 ㅋ &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/210&quot; data-og-url=&quot;https://engschool.tistory.com/210&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/esivgu/hyUE4fisLD/dzBhzkFo67kzMxEe8mDnTk/img.jpg?width=270&amp;amp;height=186&amp;amp;face=0_0_270_186,https://scrap.kakaocdn.net/dn/bBr9A7/hyUFehUl3l/FnvJv6zmzuM5QYbAAkKrr0/img.jpg?width=270&amp;amp;height=186&amp;amp;face=0_0_270_186,https://scrap.kakaocdn.net/dn/PpGYm/hyUE2ht7Ef/X2De1WqJIL9BU3cuJs1aKK/img.png?width=4010&amp;amp;height=1748&amp;amp;face=0_0_4010_1748&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/210&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/210&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/esivgu/hyUE4fisLD/dzBhzkFo67kzMxEe8mDnTk/img.jpg?width=270&amp;amp;height=186&amp;amp;face=0_0_270_186,https://scrap.kakaocdn.net/dn/bBr9A7/hyUFehUl3l/FnvJv6zmzuM5QYbAAkKrr0/img.jpg?width=270&amp;amp;height=186&amp;amp;face=0_0_270_186,https://scrap.kakaocdn.net/dn/PpGYm/hyUE2ht7Ef/X2De1WqJIL9BU3cuJs1aKK/img.png?width=4010&amp;amp;height=1748&amp;amp;face=0_0_4010_1748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MSA 설계&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;거창하게 MSA 설계 라고 적어놨지만 난 MSA 실무에 투입되어 본 적도 없고 컴공 출신도 아니야 ㅋ 그런데 하게 되었으니 해야지 ㅋ 쫄지만 마 ㅋㅋㅋ Micro  Service Architecture 라더라 처음 들어봄 ㅋ&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/216&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.08.02 - [Server services/kubernetes] - [Kubernetes] 네이버 클라우드에다가 시작!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701351322618&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Kubernetes] 네이버 클라우드에다가 시작!&quot; data-og-description=&quot;도커를 하다보니 도커 컴포즈가 튀어나오고 도커 컴포즈를 하다보니 결국은 쿠버네티스까지 오는구만.. 오늘은 kubernetes에다가 msa 구축, 내일은 회로 그리고 PCB 아트웍을 할건데..   이건&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/216&quot; data-og-url=&quot;https://engschool.tistory.com/216&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/L1pjy/hyUE9VdCvG/m7Tdhw2AL0B4AryJtakkSK/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/cidQkN/hyUFc5tObp/qMsBYCeJq9K5gum1HlnA7k/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/F8dLT/hyUE8aW4bb/60YdC0FuIJiDPB9OkUxxb0/img.png?width=1984&amp;amp;height=1050&amp;amp;face=0_0_1984_1050&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/216&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/216&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/L1pjy/hyUE9VdCvG/m7Tdhw2AL0B4AryJtakkSK/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/cidQkN/hyUFc5tObp/qMsBYCeJq9K5gum1HlnA7k/img.png?width=800&amp;amp;height=454&amp;amp;face=0_0_800_454,https://scrap.kakaocdn.net/dn/F8dLT/hyUE8aW4bb/60YdC0FuIJiDPB9OkUxxb0/img.png?width=1984&amp;amp;height=1050&amp;amp;face=0_0_1984_1050');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Kubernetes] 네이버 클라우드에다가 시작!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;도커를 하다보니 도커 컴포즈가 튀어나오고 도커 컴포즈를 하다보니 결국은 쿠버네티스까지 오는구만.. 오늘은 kubernetes에다가 msa 구축, 내일은 회로 그리고 PCB 아트웍을 할건데..   이건&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 위에 쓴 글처럼 대애애강&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MSA랑 쿠버네티스를 나눠서 시작했는데 음~~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;027&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/027.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/027.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진행이 따로 되질 안더라고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MSA 구성하기에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스처럼 좋은 환경이 없기도 하고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 MSA를 설계하면서 kubernetes를 동시에 공부하게 되었어 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이해하려고 막 그림도 그리고 말이지 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-30 오후 9.15.50.png&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eczB8k/btsBc2H2VlK/21qVKzdg9yUJD3GsuWz4yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eczB8k/btsBc2H2VlK/21qVKzdg9yUJD3GsuWz4yk/img.png&quot; data-alt=&quot;쿠버네티스를 나름 이해해보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eczB8k/btsBc2H2VlK/21qVKzdg9yUJD3GsuWz4yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeczB8k%2FbtsBc2H2VlK%2F21qVKzdg9yUJD3GsuWz4yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2452&quot; height=&quot;1934&quot; data-filename=&quot;스크린샷 2023-11-30 오후 9.15.50.png&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1934&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠버네티스를 나름 이해해보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아마도!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스가 MSA을 구축하려고 만들어진 것일지도 몰라!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;017&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 당연히 쿠버네티스가 많이 사용될 거고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 어느 정도 고정된 틀이 있는 것도 사실이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실제 비싼 MSA로 컨설팅을 받아보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;꼭 쿠버네티스 구성도를 보여주는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다 거기서 거기더라구 ㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;047&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/047.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/047.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 그걸 그대로 다 사용할 수 있느냐?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;절대 아님!!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구축하려는 시스템마다 다르고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용하려는 백엔드 기술 스택에 따라서도 달라지지&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 컨설팅을 받는다고 해서 구축을 도와주는 것도 아니고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결국은 다~~ 알아서 해야한다는 사실!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 나도 맨땅에 헤딩해가면서 구축했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-30 오후 9.53.53.png&quot; data-origin-width=&quot;3094&quot; data-origin-height=&quot;1940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmIqTF/btsBb8PyuVp/lCF109ZccnAmXiNJXmKIC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmIqTF/btsBb8PyuVp/lCF109ZccnAmXiNJXmKIC0/img.png&quot; data-alt=&quot;쿠버네티스 위에 MSA!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmIqTF/btsBb8PyuVp/lCF109ZccnAmXiNJXmKIC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmIqTF%2FbtsBb8PyuVp%2FlCF109ZccnAmXiNJXmKIC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3094&quot; height=&quot;1940&quot; data-filename=&quot;스크린샷 2023-11-30 오후 9.53.53.png&quot; data-origin-width=&quot;3094&quot; data-origin-height=&quot;1940&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쿠버네티스 위에 MSA!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보기에는 간단해 보이는데 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하나하나 붙일 때마다 봐야할 문서가 산더미야 ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이거 구축하다가 진짜 번아웃 옴!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MSA를 위한 kubernetes를 구성은 사실 몇 가지 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 kubernetes 환경,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;API gateway,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Monitoring 시스템,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CI/CD 시스템,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NAS,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;domain 및 SSL, 로드 밸런서 같은 네트워크 설정,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 베이스,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;loging 시스템,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data pipeline,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;캐시 서버&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;... 많네? ㅋㅋㅋㅋㅋㅋㅋ&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 정도가 구성되고 나면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마이크로 서비스들을 구현해서 하나씩 쿠버네티스에 올리는 거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 이 중에 &lt;b&gt;기본 kubernetes 환경&lt;/b&gt;을 포함 &lt;b&gt;Monitoring&lt;/b&gt;, &lt;b&gt;NAS&lt;/b&gt;, &lt;b&gt;데이터 베이스&lt;/b&gt; 그리고 &lt;b&gt;로드 밸런서&lt;/b&gt;같은 것들은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 서비스에서 메뉴얼을 잘 제공하고 있어서 메뉴얼만 잘 읽으면 어렵지 않게 구성할 수 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;적어도 네이버 클라우드 환경에서는 괜찮았음!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 남은 것들도 사실 제품은 골라서 설치하는게 거의 대부분이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물론 설정/설치가 지옥이지만 ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 중에 한 가지만 이야기 해주자면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시중에 사용되는 API gateway는 몇가지 선택지가 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Kong, KrakenD, tyk 등이 많이 언급되더라구&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 처음에는 가장 유명해보이는 kong을 고려했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데.... openid connect가 유료야..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-11-30 오후 10.19.17.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzju7/btsBfb5Oyix/4cj16mmikkdew4JjMzKLCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzju7/btsBfb5Oyix/4cj16mmikkdew4JjMzKLCk/img.png&quot; data-alt=&quot;OpenID Connect가 유료다..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzju7/btsBfb5Oyix/4cj16mmikkdew4JjMzKLCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnzju7%2FbtsBfb5Oyix%2F4cj16mmikkdew4JjMzKLCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;347&quot; data-filename=&quot;edited_스크린샷 2023-11-30 오후 10.19.17.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenID Connect가 유료다..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아니 씨발 치사하게 이걸 유료로 박아놔?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이걸 유료로 박아놓으면... 우린 AWS cognito 쓸건데!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;OIDC 써야 하는데~~~~~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 맘 상할때는 &lt;b&gt;베타 근성&lt;/b&gt;이지 ㅋㅋㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;040&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/040.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/040.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 전혀 안유명하고 오픈소스인&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;APISIX로 선택했어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5F6Nz/btsA8Lm4HgB/iUSKJZ8EBeaodSWuXzsOKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5F6Nz/btsA8Lm4HgB/iUSKJZ8EBeaodSWuXzsOKK/img.png&quot; data-alt=&quot;APISIX&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5F6Nz/btsA8Lm4HgB/iUSKJZ8EBeaodSWuXzsOKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5F6Nz%2FbtsA8Lm4HgB%2FiUSKJZ8EBeaodSWuXzsOKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;224&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;APISIX&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유료 옵션이 아예 없어 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;게다가 잘 동작하지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(중국 향기가 좀 나긴 함..)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 이런식으로 개발하려는 시스템 컨셉에 맞는 제품을 선정했으면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메뉴얼보고 설치/사용하면 되겠지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;말은 이렇게 쉽게 했지만... 설정이 참...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 yaml 지옥이여~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;야근이 좀 잦아들면 내가 담당했던 구성을 조금씩 올려볼게~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;yaml도 같이!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server services/kubernetes</category>
      <category>API Gateway</category>
      <category>apisix</category>
      <category>kong oidc</category>
      <category>Kubernetes</category>
      <category>ncloud</category>
      <category>yaml 지옥</category>
      <category>네이버 클라우드</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/228</guid>
      <comments>https://engschool.tistory.com/228#entry228comment</comments>
      <pubDate>Thu, 30 Nov 2023 23:10:36 +0900</pubDate>
    </item>
    <item>
      <title>[사기꾼 프로젝트] Reference schematic</title>
      <link>https://engschool.tistory.com/226</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전글&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/225&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.11.08 - [프로젝트] - [사기꾼 프로젝트] 하드웨어 주요 부품 선정&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700051318741&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[사기꾼 프로젝트] 하드웨어 주요 부품 선정&quot; data-og-description=&quot;2023.11.03 - [프로젝트] - [사기꾼 프로젝트] 하드웨어 컨셉 [사기꾼 프로젝트] 하드웨어 컨셉 지난 글 2023.11.02 - [프로젝트] - [Project] 프로젝트 구조 [Project] 프로젝트 구조 2023.10.27 - [프로젝트] - [Proj&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/225&quot; data-og-url=&quot;https://engschool.tistory.com/225&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qtyFp/hyUuSNJTbH/qAp3yOBkNZsX0cOqbBJ30k/img.png?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/gLGUU/hyUu39ywg8/LKC460bXKccnK9XqjkH4dK/img.png?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/bzkIJP/hyUuRuyaB7/FSD1ExUl0urK7DK41JXNKk/img.png?width=1240&amp;amp;height=506&amp;amp;face=0_0_1240_506&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/225&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/225&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qtyFp/hyUuSNJTbH/qAp3yOBkNZsX0cOqbBJ30k/img.png?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/gLGUU/hyUu39ywg8/LKC460bXKccnK9XqjkH4dK/img.png?width=800&amp;amp;height=503&amp;amp;face=0_0_800_503,https://scrap.kakaocdn.net/dn/bzkIJP/hyUuRuyaB7/FSD1ExUl0urK7DK41JXNKk/img.png?width=1240&amp;amp;height=506&amp;amp;face=0_0_1240_506');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[사기꾼 프로젝트] 하드웨어 주요 부품 선정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023.11.03 - [프로젝트] - [사기꾼 프로젝트] 하드웨어 컨셉 [사기꾼 프로젝트] 하드웨어 컨셉 지난 글 2023.11.02 - [프로젝트] - [Project] 프로젝트 구조 [Project] 프로젝트 구조 2023.10.27 - [프로젝트] - [Proj&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 시간에는 주요 부품을 모두 선정했으니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 회로를 그리도록 하자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;KICAD를 열고 바로 막 그려?&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;037&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/037.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/037.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓츠노노!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;누군가 잘 그려놓은 레퍼런스 회로가 있으니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반드시 그걸 먼저 참고해야 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 rpi-pico EVB를 좀 볼까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.32.47.png&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYkEx/btsAp0YzhVf/iCDw9HZEyfKmqjtLsxk4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYkEx/btsAp0YzhVf/iCDw9HZEyfKmqjtLsxk4Kk/img.png&quot; data-alt=&quot;rpi-pico evb&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYkEx/btsAp0YzhVf/iCDw9HZEyfKmqjtLsxk4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYkEx%2FbtsAp0YzhVf%2FiCDw9HZEyfKmqjtLsxk4Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;474&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.32.47.png&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rpi-pico evb&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보시는 바와 같이 간단!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;회로도는 아래 링크된 페이지에서 다운로드 받을 수 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#pinout-and-design-files&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#pinout-and-design-files&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700051729076&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Raspberry Pi Documentation - Raspberry Pi Pico and Pico W&quot; data-og-description=&quot;The official documentation for Raspberry Pi computers and microcontrollers&quot; data-og-host=&quot;www.raspberrypi.com&quot; data-og-source-url=&quot;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#pinout-and-design-files&quot; data-og-url=&quot;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ciEAHG/hyUyyfMoYm/q5hwQ9SWKZt5kBcdKOeaVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#pinout-and-design-files&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#pinout-and-design-files&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ciEAHG/hyUyyfMoYm/q5hwQ9SWKZt5kBcdKOeaVK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Raspberry Pi Documentation - Raspberry Pi Pico and Pico W&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The official documentation for Raspberry Pi computers and microcontrollers&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.raspberrypi.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 캡쳐 참고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGSxv/btsAms2Q2CR/rLMrLEzBFOshlaWXn0ZLsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGSxv/btsAms2Q2CR/rLMrLEzBFOshlaWXn0ZLsk/img.png&quot; data-alt=&quot;RPI design files download link&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGSxv/btsAms2Q2CR/rLMrLEzBFOshlaWXn0ZLsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGSxv%2FbtsAms2Q2CR%2FrLMrLEzBFOshlaWXn0ZLsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1894&quot; height=&quot;1806&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1806&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RPI design files download link&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파일을 다운받고 압축을 풀면 아래와 같이 PDF로 된 파일을 볼 수 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;완전 기본적인 구동만 가능한 최소한의 회로라 볼 수 있겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우리는 여기에 W5500, EEPROM, RS232 IC 그리고 커넥터 등을 넣을 거고.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;USB도 type C로 변경하고 말이지 ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.37.55.png&quot; data-origin-width=&quot;3452&quot; data-origin-height=&quot;2428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KAKXw/btsAs8H1Gzm/Sk2XbcW4jN7DUV4PPKescK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KAKXw/btsAs8H1Gzm/Sk2XbcW4jN7DUV4PPKescK/img.png&quot; data-alt=&quot;rpi-pico 회로도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KAKXw/btsAs8H1Gzm/Sk2XbcW4jN7DUV4PPKescK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKAKXw%2FbtsAs8H1Gzm%2FSk2XbcW4jN7DUV4PPKescK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3452&quot; height=&quot;2428&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.37.55.png&quot; data-origin-width=&quot;3452&quot; data-origin-height=&quot;2428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rpi-pico 회로도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; 이걸 이용해 바로 그려도 되지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;레퍼런스 될만한 걸 하나 더 찾아보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 Wiznet에서 만든&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;W5100S-EVB-Pico와&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;W5500-EVB-Pico인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우리는 W5500-EVB-Pico를 사용하면 되겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다시 말하지만 우린 제퍼라는 OS를 사용할거고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;W5500만 지원하기 때문이야.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.44.32.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;2070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YQLSb/btsAkriCE4l/mdbemSWfzsLK3MefQMTQ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YQLSb/btsAkriCE4l/mdbemSWfzsLK3MefQMTQ4k/img.png&quot; data-alt=&quot;Wiznet rpi evb&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YQLSb/btsAkriCE4l/mdbemSWfzsLK3MefQMTQ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYQLSb%2FbtsAkriCE4l%2FmdbemSWfzsLK3MefQMTQ4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;2070&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.44.32.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;2070&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wiznet rpi evb&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 제품도 당연히 디자인 파일을 제공하고 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 링크에서 확인 가능함.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700052444912&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;W5500-EVB-Pico | WIZnet Document System&quot; data-og-description=&quot;W5500-EVB-Pico made for prototyping and testing Ethernet capabilities on Pico&quot; data-og-host=&quot;docs.wiznet.io&quot; data-og-source-url=&quot;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&quot; data-og-url=&quot;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtjuVz/hyUuUrgUS9/mEAAXmmG06xKGgUsOI9VAk/img.png?width=634&amp;amp;height=634&amp;amp;face=0_0_634_634,https://scrap.kakaocdn.net/dn/di1KPv/hyUyvQTBEj/zAi6Xz2juHfHHYpiUKyM90/img.png?width=634&amp;amp;height=634&amp;amp;face=0_0_634_634,https://scrap.kakaocdn.net/dn/G48H7/hyUykV77LX/wkwHbqISuD1S9ByIMordX1/img.png?width=2339&amp;amp;height=1653&amp;amp;face=0_0_2339_1653&quot;&gt;&lt;a href=&quot;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.wiznet.io/Product/iEthernet/W5500/w5500-evb-pico&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtjuVz/hyUuUrgUS9/mEAAXmmG06xKGgUsOI9VAk/img.png?width=634&amp;amp;height=634&amp;amp;face=0_0_634_634,https://scrap.kakaocdn.net/dn/di1KPv/hyUyvQTBEj/zAi6Xz2juHfHHYpiUKyM90/img.png?width=634&amp;amp;height=634&amp;amp;face=0_0_634_634,https://scrap.kakaocdn.net/dn/G48H7/hyUykV77LX/wkwHbqISuD1S9ByIMordX1/img.png?width=2339&amp;amp;height=1653&amp;amp;face=0_0_2339_1653');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;W5500-EVB-Pico | WIZnet Document System&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;W5500-EVB-Pico made for prototyping and testing Ethernet capabilities on Pico&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.wiznet.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;회로도를 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;rpi-pico의 레퍼런스를 참고해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;필요없는 거 걷어내고 W5500만 넣은거 같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우리도 비슷한 느낌으로 진행할거야.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.48.23.png&quot; data-origin-width=&quot;3256&quot; data-origin-height=&quot;2330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diO8PH/btsAriEoGXL/StkuOytK6NLDyuZNkyq2YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diO8PH/btsAriEoGXL/StkuOytK6NLDyuZNkyq2YK/img.png&quot; data-alt=&quot;W5500 pico evb&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diO8PH/btsAriEoGXL/StkuOytK6NLDyuZNkyq2YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiO8PH%2FbtsAriEoGXL%2FStkuOytK6NLDyuZNkyq2YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3256&quot; height=&quot;2330&quot; data-filename=&quot;스크린샷 2023-11-15 오후 9.48.23.png&quot; data-origin-width=&quot;3256&quot; data-origin-height=&quot;2330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;W5500 pico evb&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 이제 드디어 회로 그릴 준비가 되었네.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 kicad를 이용해 회로를 그릴건데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;블로그에서 그리는 모습을 보여줄 수 없으니..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음...&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;동영상을 찍어야 하나?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 회로도나 아트웍 모두 github에 공유해가며 작업하도록 할게.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 다음 시간에 보자구~ 안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>프로젝트</category>
      <category>reference schematic</category>
      <category>RP2040</category>
      <category>rpi-pico</category>
      <category>Serial device</category>
      <category>w5500</category>
      <category>사기꾼 프로젝트</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/226</guid>
      <comments>https://engschool.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 15 Nov 2023 22:02:03 +0900</pubDate>
    </item>
    <item>
      <title>[사기꾼 프로젝트] 하드웨어 주요 부품 선정</title>
      <link>https://engschool.tistory.com/225</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.11.03 - [프로젝트] - [사기꾼 프로젝트] 하드웨어 컨셉&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699446296516&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[사기꾼 프로젝트] 하드웨어 컨셉&quot; data-og-description=&quot;지난 글 2023.11.02 - [프로젝트] - [Project] 프로젝트 구조 [Project] 프로젝트 구조 2023.10.27 - [프로젝트] - [Project] 신규 프로젝트 기획! New Project!! [Project] 신규 프로젝트 기획! New Project!! 위즈네트에서 &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/224&quot; data-og-url=&quot;https://engschool.tistory.com/224&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbc3lM/hyUu28O03M/Vkhv5VFpsDL8NNHhP42SV0/img.png?width=800&amp;amp;height=549&amp;amp;face=0_0_800_549,https://scrap.kakaocdn.net/dn/uUqaP/hyUrvdMjuN/GkDkHihFFg7IVuGOJFtmJ0/img.png?width=800&amp;amp;height=549&amp;amp;face=0_0_800_549,https://scrap.kakaocdn.net/dn/f0mZh/hyUu2OvfOR/bJ2iGGzxgTz5jvpw8T6aek/img.png?width=1782&amp;amp;height=1448&amp;amp;face=0_0_1782_1448&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/224&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/224&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbc3lM/hyUu28O03M/Vkhv5VFpsDL8NNHhP42SV0/img.png?width=800&amp;amp;height=549&amp;amp;face=0_0_800_549,https://scrap.kakaocdn.net/dn/uUqaP/hyUrvdMjuN/GkDkHihFFg7IVuGOJFtmJ0/img.png?width=800&amp;amp;height=549&amp;amp;face=0_0_800_549,https://scrap.kakaocdn.net/dn/f0mZh/hyUu2OvfOR/bJ2iGGzxgTz5jvpw8T6aek/img.png?width=1782&amp;amp;height=1448&amp;amp;face=0_0_1782_1448');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[사기꾼 프로젝트] 하드웨어 컨셉&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 글 2023.11.02 - [프로젝트] - [Project] 프로젝트 구조 [Project] 프로젝트 구조 2023.10.27 - [프로젝트] - [Project] 신규 프로젝트 기획! New Project!! [Project] 신규 프로젝트 기획! New Project!! 위즈네트에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음.. 일단은 기본은 Serial to Ethernet이잖아?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 필요한 건 uart 와 ethernet이지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;uart가 없는 mcu는 없으니까 패스.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Ethernet의 경우는 몇 가지 경우가 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;첫번째&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MCU에서 ethernet mac 을 가진 경우에는 외부에 ethernet phy를 추가해 사용.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우는 software tcp/ip stack을 사용하게 됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 10.43.36.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3N3rt/btsz2Y678L6/3gR1BVn4OImPANDCh56r0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3N3rt/btsz2Y678L6/3gR1BVn4OImPANDCh56r0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3N3rt/btsz2Y678L6/3gR1BVn4OImPANDCh56r0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3N3rt%2Fbtsz2Y678L6%2F3gR1BVn4OImPANDCh56r0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;296&quot; data-filename=&quot;스크린샷 2023-11-08 오후 10.43.36.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;두번째&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위즈네트 TCP/IP IC를 사용. MCU에서는 SPI 인터페이스로 위즈네트 IC를 컨트롤.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;hardware tcp/ip stack을 사용하지만!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;BSD 소켓을 지원하지 않아 다른 네트워크 라이브러리들과 호환성이 없음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 10.45.41.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btyMmI/btszXISx2h0/wd21lHOEOWQwZXNPrMXGkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btyMmI/btszXISx2h0/wd21lHOEOWQwZXNPrMXGkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btyMmI/btszXISx2h0/wd21lHOEOWQwZXNPrMXGkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtyMmI%2FbtszXISx2h0%2Fwd21lHOEOWQwZXNPrMXGkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;280&quot; data-filename=&quot;스크린샷 2023-11-08 오후 10.45.41.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;세번째&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Mac + Phy IC를 사용. Microchip 제품만 보이네~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;software tcp/ip stack을 사용하기 때문에 위의 호환성 문제는 없음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.02.17.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coonxU/btsz11XlvbS/Kd1nn6O4Lrx0j3RKoRDHKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coonxU/btsz11XlvbS/Kd1nn6O4Lrx0j3RKoRDHKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coonxU/btsz11XlvbS/Kd1nn6O4Lrx0j3RKoRDHKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoonxU%2Fbtsz11XlvbS%2FKd1nn6O4Lrx0j3RKoRDHKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.02.17.png&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 문제는!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;RTOS를 무지하게 쓰고 싶거든!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FreeRTOS 말고~&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Zephyr~~~ !!!!&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.10.49.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEX2QN/btsz3fnnWtT/zhryp0L2F0w4f65ijFUG20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEX2QN/btsz3fnnWtT/zhryp0L2F0w4f65ijFUG20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEX2QN/btsz3fnnWtT/zhryp0L2F0w4f65ijFUG20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEX2QN%2Fbtsz3fnnWtT%2Fzhryp0L2F0w4f65ijFUG20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;255&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.10.49.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제퍼 os&lt;/b&gt;를 사용하려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;첫 번째&lt;/b&gt;가 가장 이상적이긴한데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MCU 가격이 조금 부담스럽고 ㅠㅠ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;021&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;세번째&lt;/b&gt;는 가격이 싼것도 아니고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;성능이 좋은 것도 아니고 세상 애매~&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: center;&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/033.gif&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-name=&quot;033&quot; data-emoticon-type=&quot;friends1&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;emoticon&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/033.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그나마 &lt;b&gt;두 번째&lt;/b&gt;가 가격이 가장 저렴하긴 한데...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼 OS에서는 하드웨어 TCP/IP를 사용하지 못해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용하려면 W5500을 mac raw 모드로 사용해야 하지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(그냥 mac phy로 쓰는거)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐 동영상같은 거 보낼 거 아니니까~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;성능은 조금 포기하고 가격을 싸게 하는 것으로 결정!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결국은 아래와 같은 구조로 확정했어 ㅠㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.39.58.png&quot; data-origin-width=&quot;2042&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6kaxv/btsz2VP7OwP/6KEEnDIktkbyObYOQZaVP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6kaxv/btsz2VP7OwP/6KEEnDIktkbyObYOQZaVP1/img.png&quot; data-alt=&quot;주요 부품 선정 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6kaxv/btsz2VP7OwP/6KEEnDIktkbyObYOQZaVP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6kaxv%2Fbtsz2VP7OwP%2F6KEEnDIktkbyObYOQZaVP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2042&quot; height=&quot;1286&quot; data-filename=&quot;스크린샷 2023-11-08 오후 11.39.58.png&quot; data-origin-width=&quot;2042&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주요 부품 선정 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위즈네트 떠난지가 언젠데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;벗어날 수가 없구만...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 프로젝트는 그냥 아예 다른 걸 해야겠어..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FPGA로 AI 칩을 설계해보던지 하는...&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;027&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/027.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/027.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 대강 가늠해 보니 부품 가격이 8-9천원 정도 나오겠어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;PCB, SMT 제외하고 말야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음~ 만족스러워~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 시간에는 진짜 회로를 그려봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>프로젝트</category>
      <category>ethernet</category>
      <category>RP2040</category>
      <category>W5100S</category>
      <category>w5500</category>
      <category>Zephyr</category>
      <category>제퍼 OS</category>
      <category>하드웨어</category>
      <category>회로 부품 선정</category>
      <category>회로설계</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/225</guid>
      <comments>https://engschool.tistory.com/225#entry225comment</comments>
      <pubDate>Wed, 8 Nov 2023 23:55:30 +0900</pubDate>
    </item>
    <item>
      <title>[사기꾼 프로젝트] 하드웨어 컨셉</title>
      <link>https://engschool.tistory.com/224</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 글&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/223&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.11.02 - [프로젝트] - [Project] 프로젝트 구조&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699011617088&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Project] 프로젝트 구조&quot; data-og-description=&quot;2023.10.27 - [프로젝트] - [Project] 신규 프로젝트 기획! New Project!! [Project] 신규 프로젝트 기획! New Project!! 위즈네트에서 근무할 때 S2E라는 말을 처음들어봤어. Serial to Ethernet을 줄여서 표현한건데 Ethe&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/223&quot; data-og-url=&quot;https://engschool.tistory.com/223&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iYNFa/hyUrzZXiF2/xBN0EHGCBhDtBWKTfeFFZ0/img.png?width=800&amp;amp;height=339&amp;amp;face=0_0_800_339,https://scrap.kakaocdn.net/dn/bQVc5C/hyUrBXLOpq/K66KUrJKqWIOMmZLq6KpM0/img.png?width=800&amp;amp;height=339&amp;amp;face=0_0_800_339,https://scrap.kakaocdn.net/dn/cvr2CC/hyUnJXtrE8/tuDKX16By9nkHyoWUtff50/img.png?width=3468&amp;amp;height=1472&amp;amp;face=0_0_3468_1472&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/223&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/223&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iYNFa/hyUrzZXiF2/xBN0EHGCBhDtBWKTfeFFZ0/img.png?width=800&amp;amp;height=339&amp;amp;face=0_0_800_339,https://scrap.kakaocdn.net/dn/bQVc5C/hyUrBXLOpq/K66KUrJKqWIOMmZLq6KpM0/img.png?width=800&amp;amp;height=339&amp;amp;face=0_0_800_339,https://scrap.kakaocdn.net/dn/cvr2CC/hyUnJXtrE8/tuDKX16By9nkHyoWUtff50/img.png?width=3468&amp;amp;height=1472&amp;amp;face=0_0_3468_1472');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Project] 프로젝트 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023.10.27 - [프로젝트] - [Project] 신규 프로젝트 기획! New Project!! [Project] 신규 프로젝트 기획! New Project!! 위즈네트에서 근무할 때 S2E라는 말을 처음들어봤어. Serial to Ethernet을 줄여서 표현한건데 Ethe&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 대략적인 프로젝트 구조를 정했으니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하나하나 구현해볼건데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하드웨어 / 펌웨어 / 서버를 넘나들 예정이니 관심없는 부분은 스킵하고 가시도록!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자! 하드웨어부터 가보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 회로와 아트웍은 kicad로 진행할 예정이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(무료지만 유료만큼 훌륭해.)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하드웨어를 설계할 때에도 명확한 컨셉이 필요해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기존 제품부터 살펴볼까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b268z3/btszLqQqgBf/LJtbcywx1Es19SJI5pKGxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b268z3/btszLqQqgBf/LJtbcywx1Es19SJI5pKGxk/img.png&quot; data-alt=&quot;구글 검색 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b268z3/btszLqQqgBf/LJtbcywx1Es19SJI5pKGxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb268z3%2FbtszLqQqgBf%2FLJtbcywx1Es19SJI5pKGxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1448&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구글 검색 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 반제품은 별로 하기 싫어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;단단해 보이고 촌스럽지 않게 만들고 싶어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Brainboxes?라는 회사 제품이 좀 괜찮아 보이는 구만!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 그럼 나름 컨셉을 잡아봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 케이스 있음(Brainboxes 제품 참고)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. USB-C 전원 사용&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. Dsub9 안씀&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. 녹색 터미널블럭 안씀&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5. LED 제발 이쁜거 ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(가이드 파이프라도 써야지)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;6. 메인 보드와 확장 보드로 이루어짐.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;7. 가능한 싸게!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;외형은 대강 이정도면 된 것 같고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제는 내부를 그려보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 Serial to ethernet에 들어가는 소자들은 특별할 게 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MCU, 설정 저장용 EEPROM, Ethernet phy 정도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 처음에는 아래와 같이 컨셉을 잡았어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 9.44.55.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SndqD/btszKFUU745/rsT6fDByR35KwcoqhZQrkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SndqD/btszKFUU745/rsT6fDByR35KwcoqhZQrkk/img.png&quot; data-alt=&quot;1차 컨셉&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SndqD/btszKFUU745/rsT6fDByR35KwcoqhZQrkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSndqD%2FbtszKFUU745%2FrsT6fDByR35KwcoqhZQrkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;830&quot; data-filename=&quot;스크린샷 2023-11-03 오후 9.44.55.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 컨셉&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데;;; 위처럼 하면 반드시 확장 보드를 만들어야 하잖아...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읔.. 싫어.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 10초 만에 아래처럼 변경했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 9.41.54.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccdyIq/btszKfhRGQu/lXRQY7wuLtSnPkyZBTyKk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccdyIq/btszKfhRGQu/lXRQY7wuLtSnPkyZBTyKk0/img.png&quot; data-alt=&quot;2차 컨셉&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccdyIq/btszKfhRGQu/lXRQY7wuLtSnPkyZBTyKk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccdyIq%2FbtszKfhRGQu%2FlXRQY7wuLtSnPkyZBTyKk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;493&quot; data-filename=&quot;스크린샷 2023-11-03 오후 9.41.54.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차 컨셉&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메인 보드만으로도 기능을 하도록 회로와 PCB를 구성했고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확장 보드도 추가하여 여러가지 제품이 나올 수 있도록 만들었지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이놈에 잔대가리 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 시간에는 회로를 그리기 앞서서 소자를 선정할거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;생각이 많아지는 부분이지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주말 동안에 고민해봐야겠네&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 다들 즐거운 주말!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>프로젝트</category>
      <category>S2E</category>
      <category>serial to ethernet</category>
      <category>사기꾼 프로젝트</category>
      <category>하드웨어 컨셉 작업</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/224</guid>
      <comments>https://engschool.tistory.com/224#entry224comment</comments>
      <pubDate>Fri, 3 Nov 2023 22:01:04 +0900</pubDate>
    </item>
    <item>
      <title>[사기꾼 프로젝트] 프로젝트 구조</title>
      <link>https://engschool.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/222&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.10.27 - [프로젝트] - [Project] 신규 프로젝트 기획! New Project!!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698929324786&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Project] 신규 프로젝트 기획! New Project!!&quot; data-og-description=&quot;위즈네트에서 근무할 때 S2E라는 말을 처음들어봤어. Serial to Ethernet을 줄여서 표현한건데 Ethernet 통신을 Serial로 변환시키는 디바이스들이라고 보면 쉬워. 디바이스 서버라고 부르기도 하고 시리&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/222&quot; data-og-url=&quot;https://engschool.tistory.com/222&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MJR98/hyUnPJUqYO/qCqLYzKXfSpBEJhmS9QV4K/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/cyy58Q/hyUnR11Jc8/N4WPlkKCt148Z1AYTeLK9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/dYBDYL/hyUnR11Jii/acxUm0HE25QEbHK7UvotPk/img.png?width=1370&amp;amp;height=822&amp;amp;face=0_0_1370_822&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/222&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/222&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MJR98/hyUnPJUqYO/qCqLYzKXfSpBEJhmS9QV4K/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/cyy58Q/hyUnR11Jc8/N4WPlkKCt148Z1AYTeLK9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/dYBDYL/hyUnR11Jii/acxUm0HE25QEbHK7UvotPk/img.png?width=1370&amp;amp;height=822&amp;amp;face=0_0_1370_822');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Project] 신규 프로젝트 기획! New Project!!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;위즈네트에서 근무할 때 S2E라는 말을 처음들어봤어. Serial to Ethernet을 줄여서 표현한건데 Ethernet 통신을 Serial로 변환시키는 디바이스들이라고 보면 쉬워. 디바이스 서버라고 부르기도 하고 시리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 목표를 유저 설정이 최소화된 SSL S2E 시스템으로 정했는데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭔가 더럽고 재수없는 느낌을 지울 수가 없어 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 &lt;b&gt;역사상 가장 쉬운 S2E&lt;/b&gt;로 가자 ㅋㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;043&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/043.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/043.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기존의 S2E는 사용하려면 해야 할 설정이 엄청 많아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;따로 공부를 해야 할 정도지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 엔지니어한테야 간단하겠지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;현장에서 비전공자가 설치해서 사용하려면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쉽지 않아.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;045&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/045.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/045.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 이젠 SSL 설정까지 더해져서 거의 고문 수준이지 ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 10.39.23.png&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;1626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJEUbP/btszCKJSof9/KjfeoD8OHb8hVZSO4PGFcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJEUbP/btszCKJSof9/KjfeoD8OHb8hVZSO4PGFcK/img.png&quot; data-alt=&quot;고작 S2E에 뭔놈에 설정이... 어휴...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJEUbP/btszCKJSof9/KjfeoD8OHb8hVZSO4PGFcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJEUbP%2FbtszCKJSof9%2FKjfeoD8OHb8hVZSO4PGFcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1872&quot; height=&quot;1626&quot; data-filename=&quot;스크린샷 2023-11-02 오후 10.39.23.png&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;1626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고작 S2E에 뭔놈에 설정이... 어휴...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이거 설정하는 사람도 힘들지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기술지원하는 사람도 죽어나겠어~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이거 팔아서 기술 지원하다보면 뭐 남겠나? ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 10.50.24.png&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulyri/btszCp0cm5y/J1X7WQauOZmlXOQHQO57R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulyri/btszCp0cm5y/J1X7WQauOZmlXOQHQO57R0/img.png&quot; data-alt=&quot;위즈네트 S2E 디바이스 SSL 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulyri/btszCp0cm5y/J1X7WQauOZmlXOQHQO57R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fulyri%2FbtszCp0cm5y%2FJ1X7WQauOZmlXOQHQO57R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;492&quot; data-filename=&quot;스크린샷 2023-11-02 오후 10.50.24.png&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위즈네트 S2E 디바이스 SSL 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;나도 이런 저런 서버를 구축해봤는데&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;TCP 서버&lt;/b&gt;라는 존재 자체가 엄청나게&lt;b&gt; 어색&lt;/b&gt;해.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 와중에 임베디드 디바이스가 수백 ~ 수천대가 붙어? ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거기에 &lt;b&gt;듣보잡 프로토콜&lt;/b&gt;을 올려? ㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: center;&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/042.gif&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-name=&quot;042&quot; data-emoticon-type=&quot;niniz&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;emoticon&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/042.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;못할짓이지 ㅋㅋㅋ 서버 맨날 죽을 걸?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 지랄맞은 설정과 데이터 서버만 해결되도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지금보다 훠~~~ㄹ씬 편해질거 같더라구!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 11.09.49.png&quot; data-origin-width=&quot;3468&quot; data-origin-height=&quot;1472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FEIEE/btszC2cmjIy/VbKDBzrHsC0R9rfTKwGvqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FEIEE/btszC2cmjIy/VbKDBzrHsC0R9rfTKwGvqK/img.png&quot; data-alt=&quot;신규 프로젝트 개요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FEIEE/btszC2cmjIy/VbKDBzrHsC0R9rfTKwGvqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFEIEE%2FbtszC2cmjIy%2FVbKDBzrHsC0R9rfTKwGvqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3468&quot; height=&quot;1472&quot; data-filename=&quot;스크린샷 2023-11-02 오후 11.09.49.png&quot; data-origin-width=&quot;3468&quot; data-origin-height=&quot;1472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신규 프로젝트 개요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 위처럼 대략적으로 전체 프로젝트 개요를 그렸어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;총 4개 ~ 5개 파트로 이루어지는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. S2E 모듈&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 디바이스 설정 프론트 엔드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 디바이스 설정 백엔드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. 데이터 서버&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5. 앱&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정도가 되겠네.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대략적인 컨셉을 설명하자면&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존의 PC에 설치해서 사용하는 설정툴은&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 브라우져 or 앱으로 대체.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 설정(무설정)으로 동작가능.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 서버를 기본 제공&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 서버를 통해서만 데이터가 이동할 수 있도록.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유저 서버와 직접 데이터를 주고 받는 건 X&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 기능을 하는 S2E 중 최저가&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정 서버는 무료!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 서버는 개인 무료, 기업 유료.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;벌써부터 사방에서 아우성 소리가 들리는구만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;인터넷이 안되는 지역은 어떻게 할거냐!!&quot;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;서버 비용 감당되냐!!&quot;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;널 어떻게 믿고 너네 서버를 쓰냐!&quot;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;보안상 외부 서버를 이용하지 못하면 어쩌냐!&quot;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기타 등등 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;괜찮아 ㅋㅋ 해보자고 뭐 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해보다 정 안되면 타협도 하고 그러는 거지 뭐 인생이 ㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;021&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/021.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/021.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개발 순서는 아래와 같이 할거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S2E 모듈(디바이스) -&amp;gt; 디바이스 설정 서버 -&amp;gt; 웹 프론트 엔드 -&amp;gt; 데이터 서버 -&amp;gt; 앱 프론트 엔드&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 회로도를 그려야 할 시간이군!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아... 그나저나 프로젝트 이름을 뭘로하지?&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;047&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/047.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/047.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(사기꾼 프로젝트라고 정했음 ㅋㅋㅋ)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕~~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아주 사소한 팁!!)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나는 위에 그린 개요도처럼 시작전에 간단하게나마 설계하는 걸 좋아하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트의 속도나 결과의 완성도에 큰 차이가 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;귀찮겠지만 나처럼 그리는 걸 추천 안할 수가 없음.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 구조 그리는데 아주 좋은 툴이 있어!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;miro&lt;/b&gt;라는 온라인 툴인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아주! 좋은! &lt;b&gt;무료&lt;/b&gt;! 툴이야. 제발 써! 두번 써!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://miro.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://miro.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698931488851&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Miro | 혁신을 위한 비주얼 워크스페이스&quot; data-og-description=&quot;Miro는 팀이 프로젝트를 관리하고, 제품을 디자인하고, 미래를 함께 만들어가는 혁신을 위한 비주얼 워크스페이스입니다. 전 세계 6천만 명 이상의 사용자와 함께하세요.&quot; data-og-host=&quot;miro.com&quot; data-og-source-url=&quot;https://miro.com/&quot; data-og-url=&quot;https://miro.com/ko/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgNjfe/hyUnSGFyp3/2ova8PcM7lS58rMGnUqNt0/img.png?width=571&amp;amp;height=300&amp;amp;face=0_0_571_300,https://scrap.kakaocdn.net/dn/cdgrVJ/hyUnX2giFr/5KmEeMS8yOpzzrF1jlRbk0/img.png?width=571&amp;amp;height=300&amp;amp;face=0_0_571_300&quot;&gt;&lt;a href=&quot;https://miro.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://miro.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgNjfe/hyUnSGFyp3/2ova8PcM7lS58rMGnUqNt0/img.png?width=571&amp;amp;height=300&amp;amp;face=0_0_571_300,https://scrap.kakaocdn.net/dn/cdgrVJ/hyUnX2giFr/5KmEeMS8yOpzzrF1jlRbk0/img.png?width=571&amp;amp;height=300&amp;amp;face=0_0_571_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Miro | 혁신을 위한 비주얼 워크스페이스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Miro는 팀이 프로젝트를 관리하고, 제품을 디자인하고, 미래를 함께 만들어가는 혁신을 위한 비주얼 워크스페이스입니다. 전 세계 6천만 명 이상의 사용자와 함께하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;miro.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;광고 아니다~~~~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <category>miro.com</category>
      <category>S2E</category>
      <category>SSL S2E</category>
      <category>신규 프로젝트</category>
      <category>프로젝트 시작</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/223</guid>
      <comments>https://engschool.tistory.com/223#entry223comment</comments>
      <pubDate>Thu, 2 Nov 2023 23:55:53 +0900</pubDate>
    </item>
    <item>
      <title>[사기꾼 프로젝트] 신규 프로젝트 기획!</title>
      <link>https://engschool.tistory.com/222</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위즈네트에서 근무할 때 &lt;b&gt;S2E&lt;/b&gt;라는 말을 처음들어봤어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Serial to Ethernet&lt;/b&gt;을 줄여서 표현한건데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ethernet 통신을 Serial로 변환&lt;/b&gt;시키는 디바이스들이라고 보면 쉬워.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디바이스 서버&lt;/b&gt;라고 부르기도 하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시리얼 이더넷 컨버터&lt;/b&gt;라고 부르기도 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;긴 세월 동안 알게 모르게 꾸준하게 판매되고 있는 제품군이고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 제조업체도 쉽게 찾아볼 수 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구글에서 &quot;Serial to Ethernet&quot;로 검색해보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위에서부터 한국 업체들이 보이는데(2023년 10월 기준)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 베이스, 위즈네트, 솔레 시스템즈 세 회사 모두 오랜기간 Serial to ethernet 디바이스를 판매해왔어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.17.00.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WLBKe/btszcP5zUzE/25kIX1zKtKSchySAkmBckk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WLBKe/btszcP5zUzE/25kIX1zKtKSchySAkmBckk/img.png&quot; data-alt=&quot;Serial to Ethernet 판매 회사들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WLBKe/btszcP5zUzE/25kIX1zKtKSchySAkmBckk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWLBKe%2FbtszcP5zUzE%2F25kIX1zKtKSchySAkmBckk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;822&quot; data-filename=&quot;스크린샷 2023-10-26 오후 10.17.00.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Serial to Ethernet 판매 회사들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 위에 언급한 회사 모두&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거의 대부분의 제품이 SSL(네트워크 보안)을 지원하지 않아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최근 들어 SSL을 지원하는 제품을 출시하고 있지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐랄까 한계가 있어보여.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;009&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스를 도입해서 가격이 비싸다거나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용법이 너무 복잡하다거나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시스템에 통합하기가 힘들다거나 하는 문제점들..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(적어도 내가 보기에는)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지금까지는 여차저차해서 사용했지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제는 디바이스도 SSL(네트워크 보안)이 기본 사양으로 요구되면서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;더 이상 디바이스만으로만 남아 있을 수 없고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시스템의 관점에서 시스템의 일부로 설계되어야 하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아무래도 임베디드 엔지니어들만 모여서 제품을 기획하니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 일들이 벌어지는게 아닌가 하는 생각도 들어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하기사&lt;/b&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;033&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/033.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/033.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 임베디드 팀 내에 있는 하드웨어 엔지니어랑 펌웨어 엔지니어조차도 조율은 커녕 니탓 공방하기 바쁜데 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하물며 임베디드와  웹, 백앤드는 어련하시겠어?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이래서 나는 IT 비즈니스 중에 IoT가 최악이라고 봐.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;조율하다가 시간 다 가거든 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 나는 회로 설계도 할 수 있고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;펌웨어도 짤 수 있고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;임베디드 SSL도 해봤고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;웹 백엔드/프론트 엔드 다 할 줄 아니까.....&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;023&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/023.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/023.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;조율 자체가 필요가 없잖아? ㅋㅋㅋㅋ&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; 누군가에게 내 이력과 스킬을 말해주니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사기꾼이라는 답변이 돌아왔던 씁쓸한 기억이 있어...  &lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;그래서 이 프로젝트 이름을 &quot;&lt;b&gt;사기꾼 프로젝트&lt;/b&gt;&quot;라고 명명하노라~&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;그래서&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;S2E&lt;span&gt;&amp;nbsp;&lt;/span&gt;redesign 프로젝트&lt;/b&gt;를 시작해보려고 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;일단 프로젝트 목표는 유저 설정이 불필요한 SSL S2E 시스템!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐 혼자 하니까 시간은 오래 걸리겠지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;천천히 시간남을 때 진행하면 되지 머 ㅋ 놀면 머해 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음에는 대강 시스템 구성도를 그리고 계획을 세워보자구 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>프로젝트</category>
      <category>IoT 프로젝트</category>
      <category>s2e redesign</category>
      <category>serial to ethernet</category>
      <category>ssl</category>
      <category>사기꾼 프로젝트</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/222</guid>
      <comments>https://engschool.tistory.com/222#entry222comment</comments>
      <pubDate>Fri, 27 Oct 2023 00:51:45 +0900</pubDate>
    </item>
    <item>
      <title>트레이더스! MISURA 통밀 도넛! 벌레! 환불!</title>
      <link>https://engschool.tistory.com/221</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  벌레 동영상 주의 &lt;b&gt; &lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이마트 트레이더스 동탄점에서 MISURA 통밀 도넛을 사서 먹고 있었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나도 먹고 와이프도 먹고 1살된 애기는 못먹으니까 가지고 놀고 막 그랬지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 11.55.57.png&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOAsff/btsy9g93ih5/11IHPLlLEf4Z9toyolobQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOAsff/btsy9g93ih5/11IHPLlLEf4Z9toyolobQ1/img.png&quot; data-alt=&quot;미주라 통밀 도넛&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOAsff/btsy9g93ih5/11IHPLlLEf4Z9toyolobQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOAsff%2Fbtsy9g93ih5%2F11IHPLlLEf4Z9toyolobQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1286&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2023-10-25 오후 11.55.57.png&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미주라 통밀 도넛&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아침에도 하나 꺼내 먹고 출근했는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오전에 와이프한테 연락옴;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MISURA 도넛 포장지 안쪽에 벌레가 그득하다고;;;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/441983318&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bp8EgM/hyUkevwD6c/h3KKxGEBJkKkb9JLXx2g1k/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280,https://scrap.kakaocdn.net/dn/caURNh/hyUkjcwUFF/0XhtTIaLOSCOtj389CGZL1/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280&quot; data-video-width=&quot;720&quot; data-video-height=&quot;1280&quot; data-video-origin-width=&quot;720&quot; data-video-origin-height=&quot;1280&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;'Peter circuit soft'에서 업로드한 동영상&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/441983318?service=daum_tistory&quot; width=&quot;720&quot; height=&quot;1280&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;작은 점들이 다 벌레!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;미주라 도넛 겉포장지 안쪽에 곰팡인지 뭔지랑 벌레가 한가득 있더라고 ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아니 개별 포장되어 있는 제품에 저게 뭐냐고!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;005&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/005.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/005.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2023-10-25-23-03-53.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXDwwA/btszbOdV7JS/vMibSWImEQZwp6ikWbhVx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXDwwA/btszbOdV7JS/vMibSWImEQZwp6ikWbhVx1/img.jpg&quot; data-alt=&quot;유통기한 아니면 Best before 겠지.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXDwwA/btszbOdV7JS/vMibSWImEQZwp6ikWbhVx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXDwwA%2FbtszbOdV7JS%2FvMibSWImEQZwp6ikWbhVx1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;1033&quot; data-filename=&quot;KakaoTalk_Photo_2023-10-25-23-03-53.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유통기한 아니면 Best before 겠지.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개빡쳐서 오전에 고객센터 전화!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;고객센터에서 동탄점으로 연결!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;동탄점 담당자가 미주라 영업 사원이랑 통화하겠냐고 물어봐서 싫다고 함!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(이게 유통의 문제일지! 생산의 문제일지! 내가 알게 뭐야?  )&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오후에 동탄점 담당자한테 다시 전화가 왔어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보상으로 &lt;b&gt;이마트 상품권 10만원&lt;/b&gt;이랑 &lt;b&gt;미주라 상품들&lt;/b&gt; 뭐 주겠다고 하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엘베타고 올라가야 해서 일단 끊고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사무실 와서 곰곰히 생각해보니 더 빡치는 거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;벌레 드글드글 거리는 거 누군가 또 먹으면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;10만원 짜리 상품권으로 막겠네 싶더라고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;벌레 나왔던 그 제품 주면서 말이지.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;017&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/017.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/017.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보상? 안받아! ㅅㅂ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제품에 하자가 있으니까 당연히 환불은 받아야지!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물건 가지고 고객센터 방문하라 해서 비닐 봉투에 싸고 김치통에 넣어서 보관하다가 가져감.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시 모르니까 동영상을 촬영해 놔야지 싶어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;트레이더스 주차장에서 열었는데  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;비닐 봉투에 구멍이 났는지 김치통 사방에서 벌레가 파티 중 ㅠㅠ&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/441983688&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/SWonk/hyUkiSdPWa/EUUGhYpsAiBkhVeQKi4ZL0/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280,https://scrap.kakaocdn.net/dn/2QRWE/hyUlvReTOq/m2mRfDwRKHFkLsRCmjNwnK/img.jpg?width=720&amp;amp;height=1280&amp;amp;face=0_0_720_1280&quot; data-video-width=&quot;720&quot; data-video-height=&quot;1280&quot; data-video-origin-width=&quot;720&quot; data-video-origin-height=&quot;1280&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;'Peter circuit soft'에서 업로드한 동영상&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/441983688?service=daum_tistory&quot; width=&quot;720&quot; height=&quot;1280&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어쨋든 들고 가서 환불 받고 옴.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2023-10-25-23-44-10.jpeg&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFht2R/btszekCUSZd/zahjSR9qF5V1YK14WNAJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFht2R/btszekCUSZd/zahjSR9qF5V1YK14WNAJtk/img.png&quot; data-alt=&quot;환불!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFht2R/btszekCUSZd/zahjSR9qF5V1YK14WNAJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFht2R%2FbtszekCUSZd%2FzahjSR9qF5V1YK14WNAJtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;994&quot; data-filename=&quot;edited_edited_KakaoTalk_Photo_2023-10-25-23-44-10.jpeg&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환불!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;으~~ 아직도 벌레가 온몸에서 꾸물 거리는 느낌. ㅠㅠㅠㅠㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;다시는 미주라 안삼!&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;트레이더스도 안감!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타/주절주절</category>
      <category>FoodSafety</category>
      <category>MisuraWholewheatDonuts</category>
      <category>동탄점</category>
      <category>식료품벌레</category>
      <category>환불</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/221</guid>
      <comments>https://engschool.tistory.com/221#entry221comment</comments>
      <pubDate>Thu, 26 Oct 2023 00:04:57 +0900</pubDate>
    </item>
    <item>
      <title>[회로 설계] ARTIX 7 회로 설계</title>
      <link>https://engschool.tistory.com/220</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;갑자기 FPGA 회로를 설계해야 할 일이 생겼는데;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 해본적이 없거든 ㅋㅋ 그럼 망했나? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㄴㄴ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;괜찮아 따라와 ㅋㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;041&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/041.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/041.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 빠르게 적당해 보이는 FPGA를 선택했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;7 Series selection guide 문서를 참고했는데 보통 모든 제조사들이 비슷한 문서를 제공해!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나같은 인간들 꽤 많은 듯 ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698237763272&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7 Series Product Tables and Product Selection Guide (XMP101)&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.xilinx.com&quot; data-og-source-url=&quot;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&quot; data-og-url=&quot;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.xilinx.com/v/u/en-US/7-series-product-selection-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;7 Series Product Tables and Product Selection Guide (XMP101)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.xilinx.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보통 FPGA는 게이트 수(Logic Cells) 가 주요한 고려 사항일거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 그걸 어떻게 알겠어? 아직 프로젝트 시작도 안했는데? -_-;;; 참 난감한 부분이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FPGA로 이것 저것 넣으면 대강 몇만 게이트 나오겠지?? 나올까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너무 오랜만에 해보는 나로써는 거의 무당급 초이스지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;***&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;나는 FPGA 회로 설계와 HDL을 같이 하니까 삽질하는 건데 보통 HDL 엔지니어가 별도로 있잖아?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;회로 설계하기 전에 꼭 물어보자!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&quot;저기 몇만 게이트짜리 쓰면 되요?&quot; 하고&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;꼭!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;***&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 지금 프로젝트에는 Kintex나 Vertex는 오버일거 같더라고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 spartan이랑 artix가 남는데 spartan은 너무 오래되고 저가 느낌? ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 artix 선택! Logic cells은 뭐 기능 구현에 따라서 달라지니까 ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3BTQP/btszcoFYFw3/W4jNO3wkZalzkLMrkKADfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3BTQP/btszcoFYFw3/W4jNO3wkZalzkLMrkKADfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3BTQP/btszcoFYFw3/W4jNO3wkZalzkLMrkKADfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3BTQP%2FbtszcoFYFw3%2FW4jNO3wkZalzkLMrkKADfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;1384&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;1384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 패키지는 (게이트 수 기준)넓은 범위를 커버할 수 있고 쓰잘데기 없는 GTP transceiver가 없는 CSG324로 선택했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마우저나 디지키로 재고도 확인하는 것도 잊지마!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; 나는 글로벌 유통사에 재고가 있으면 시장에 많이 풀려 있다고 여기거든 ㅋ 참고해.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nxIBU/btszcrpaDBj/RyO2CyX1oTuOMMW5YxFoh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nxIBU/btszcrpaDBj/RyO2CyX1oTuOMMW5YxFoh0/img.png&quot; data-alt=&quot;Mouser에 재고가 있다? =&amp;amp;gt; 시장에 풀려 있다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nxIBU/btszcrpaDBj/RyO2CyX1oTuOMMW5YxFoh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnxIBU%2FbtszcrpaDBj%2FRyO2CyX1oTuOMMW5YxFoh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2316&quot; height=&quot;854&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Mouser에 재고가 있다? =&amp;gt; 시장에 풀려 있다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 ~이제 그 다음은 EVB를 찾아야 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왜? 난 처음해보니까 따라하는거지 뭐 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보통은 홈페이지에서 아래처럼 뙇!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 9.57.45.png&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tUlnM/btszcGl8go3/7m6ak5eoOs8VKR4engkDI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tUlnM/btszcGl8go3/7m6ak5eoOs8VKR4engkDI0/img.png&quot; data-alt=&quot;artix 7 EVB들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tUlnM/btszcGl8go3/7m6ak5eoOs8VKR4engkDI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtUlnM%2FbtszcGl8go3%2F7m6ak5eoOs8VKR4engkDI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2486&quot; height=&quot;962&quot; data-filename=&quot;스크린샷 2023-10-25 오후 9.57.45.png&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;artix 7 EVB들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보기에 어때?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;중간에 있는 EVB는 너무 무시무시하게 생기지 않았어? ㅋㅋㅋ 버려&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1, 3번을 참고하도록 하자구 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 1번의 ARTY 기준으로 설명하도록 할게.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(나는 Nexys a7를 참고했어.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Arty-Evaluation-Board.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b258xs/btszcqqfbFV/b9QGfor3QAoMR0dzL4YVSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b258xs/btszcqqfbFV/b9QGfor3QAoMR0dzL4YVSk/img.jpg&quot; data-alt=&quot;ARTY&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b258xs/btszcqqfbFV/b9QGfor3QAoMR0dzL4YVSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb258xs%2FbtszcqqfbFV%2Fb9QGfor3QAoMR0dzL4YVSk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;375&quot; data-filename=&quot;Arty-Evaluation-Board.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ARTY&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 링크에서 회로도를 확인할 수 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://digilent.com/reference/_media/arty:arty_sch.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://digilent.com/reference/_media/arty:arty_sch.pdf&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;먼저 전원 파트의 회로를 보자구.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭔가 우주선이 하나 있구만.....가만 보니 5채널짜리 레귤레이터야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쫄지마 괜찮아 FPGA를 여러 가지 전압의 전원을 사용하거든.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 9.32.31.png&quot; data-origin-width=&quot;2384&quot; data-origin-height=&quot;1596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAxmO/btszbutcMvS/0czsDsd5TWGlRvQoQNRRC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAxmO/btszbutcMvS/0czsDsd5TWGlRvQoQNRRC1/img.png&quot; data-alt=&quot;ARTY 전원 파트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAxmO/btszbutcMvS/0czsDsd5TWGlRvQoQNRRC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAxmO%2FbtszbutcMvS%2F0czsDsd5TWGlRvQoQNRRC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2384&quot; height=&quot;1596&quot; data-filename=&quot;스크린샷 2023-10-25 오후 9.32.31.png&quot; data-origin-width=&quot;2384&quot; data-origin-height=&quot;1596&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ARTY 전원 파트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 설명하면 5V 입력을 받아서 0.95V -&amp;gt; 1.8V -&amp;gt; 1.35V -&amp;gt; 3.3V 순서로 전원을 인가해. 끝!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 시퀀셜하게 전원을 인가하는 이유는?????&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이유는 개뿔 ㅋㅋ 그렇게 IC를 만들어놨어 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이터시트를 살펴보면  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 9.13.23.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkDU6R/btszb57Ak4f/f70JqQEEsZW9jQKBxDRo2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkDU6R/btszb57Ak4f/f70JqQEEsZW9jQKBxDRo2k/img.png&quot; data-alt=&quot;Artix 7 datasheet&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkDU6R/btszb57Ak4f/f70JqQEEsZW9jQKBxDRo2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkDU6R%2Fbtszb57Ak4f%2Ff70JqQEEsZW9jQKBxDRo2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1464&quot; height=&quot;242&quot; data-filename=&quot;스크린샷 2023-10-25 오전 9.13.23.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Artix 7 datasheet&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: center;&quot;&gt;파워온 할 때는 Vccint -&amp;gt; Vccbram -&amp;gt; Vccaux -&amp;gt; Vcco 순서로 전원인가 하세요~&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: center;&quot;&gt;파워 오프할때는 반대 순서로 하시면 됩니다~&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: center;&quot;&gt;Vccint와 Vccbram의 전압 레벨이 같으면 같이 인가해도 되구요~&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: center;&quot;&gt;Vccaux하구 Vcco랑 전압 레벨이 같으면 같은 소스로 동시에 인가해도 됩니다~&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 전력 소모는 어떻게 될까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이게 영 애매한 부분인데!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FPGA는 특성상 로직이 전부다 구현되고 나서야 전력 소모를 알 수가 있거든 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 약간 보수적으로 접근할 수 밖에 없어 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;회로도에서 5V 출력 쪽을 보면 3.5A라고 찍혀 있어... ㅎㄷㄷ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 10.22.13.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V0KmD/btszbRhm1PC/Hx1XSQdmzmXwAiQ27IH4z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V0KmD/btszbRhm1PC/Hx1XSQdmzmXwAiQ27IH4z1/img.png&quot; data-alt=&quot;ARTY EVB 5V regulator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V0KmD/btszbRhm1PC/Hx1XSQdmzmXwAiQ27IH4z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV0KmD%2FbtszbRhm1PC%2FHx1XSQdmzmXwAiQ27IH4z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;798&quot; data-filename=&quot;스크린샷 2023-10-25 오후 10.22.13.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ARTY EVB 5V regulator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;5 * 3.5A = 16.5W;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 까지 해야하나? 싶은데.. 뭐 EVB니까 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;참고만 하자고 참고만!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아 그리고 혹시나 내부 ADC를 사용하려면 외부 레퍼런스 전압을 줘야하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 처럼 1.25V 만들어 주는 아이를 하나 써주면 되겠지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오후 10.27.51.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTDggQ/btszcOj9j9P/NfVup5uejFbBmaiTeiStuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTDggQ/btszcOj9j9P/NfVup5uejFbBmaiTeiStuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTDggQ/btszcOj9j9P/NfVup5uejFbBmaiTeiStuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTDggQ%2FbtszcOj9j9P%2FNfVup5uejFbBmaiTeiStuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2023-10-25 오후 10.27.51.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음은 Configuration 부분을 보자구.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;JTAG interface하고 QSPI Flash가 대부분이고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Flash에서 FPGA에 Bit load하는 PROG,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Bit loading이 완료되면 뜨는 DONE 시그널 정도가 기본이 되겠네.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 밖에 configuration이 진행되는 시간동안 io pullup/down 설정해주는 PUDC_B 등이 있는데 EVB 회로에서 크게 벗어나지 않을거니까 회로를 그대로 사용해도 무방할 것 같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FPGA 모델에 따라서 QSPI Flash 용량 정도만 맞춰주면 될 듯!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-25 오전 9.02.43.png&quot; data-origin-width=&quot;2750&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brOIS4/btszb2bTats/h1DrTUqK6rwdU2OtsT7Cfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brOIS4/btszb2bTats/h1DrTUqK6rwdU2OtsT7Cfk/img.png&quot; data-alt=&quot;FPGA config 파트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brOIS4/btszb2bTats/h1DrTUqK6rwdU2OtsT7Cfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrOIS4%2Fbtszb2bTats%2Fh1DrTUqK6rwdU2OtsT7Cfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2750&quot; height=&quot;1428&quot; data-filename=&quot;스크린샷 2023-10-25 오전 9.02.43.png&quot; data-origin-width=&quot;2750&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FPGA config 파트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Configuration에 대한 더 자세한 내용은 UG470 문서를 살펴보도록!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698240607140&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7 Series FPGAs Configuration User Guide (UG470)&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.xilinx.com&quot; data-og-source-url=&quot;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&quot; data-og-url=&quot;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.xilinx.com/r/en-US/ug470_7Series_Config&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;7 Series FPGAs Configuration User Guide (UG470)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.xilinx.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자~ 그리고 나머지는 FPGA 관련된 부분은 XADC와 같은 내부 Peripharal 관련된 부분이 있겠네. XADC말고 더 있긴한가?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아! 바이패스 캐페시터 달아주는 정도? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어때 참 쉽지? 는 개뿔 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어야 하는 데이터 시트도 많고 경험도 많이 필요하긴 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 한번 해두면 평생 가져가는 자산이 될거야!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기회가 오면 무조건! 알지? ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>임베디드 하드웨어/기타 회로 설계</category>
      <category>artix 7 fpga 회로 설계</category>
      <category>FPGA configuration</category>
      <category>FPGA 전원 시퀀스</category>
      <category>FPGA 회로설계</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/220</guid>
      <comments>https://engschool.tistory.com/220#entry220comment</comments>
      <pubDate>Wed, 25 Oct 2023 22:48:51 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Local Redis cluster</title>
      <link>https://engschool.tistory.com/219</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;네이버 클라우드에서 캐시 서버로 Redis cluster를 사용했어..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 로컬에서 개발할 때 네이버 클라우드 redis cluster에 접근하려니까..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐... 번잡스럽더라구 ㅋㅋㅋ&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;014&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/014.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/014.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 로컬 redis cluster를 구성하려고 이리 저리 검색했는데!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;hwasurr 님의 자료가 가장 적절해서 긁어왔지!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hwasurr.io/redis/cluster/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hwasurr.io/redis/cluster/&lt;/a&gt; &amp;lt;-- 여기!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 파일이름 좀 틀리심 ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 아래가 수정된 docker-compose.yaml&lt;/p&gt;
&lt;pre id=&quot;code_1698154454428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;##docker-compose.yaml
##for localtest

version: &quot;3&quot;
services:
  redis-cluster:
    image: redis:6.2
    container_name: redis-test
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - 6380:6380
      - 6381:6381
      - 6379:6379

  redis-node-1:
    network_mode: &quot;service:redis-cluster&quot;
    image: redis:6.2
    container_name: redis-test1
    volumes:
      - ./redis1.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-node-2:
    network_mode: &quot;service:redis-cluster&quot;
    image: redis:6.2
    container_name: redis-test2
    volumes:
      - ./redis2.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-cluster-entry:
    network_mode: &quot;service:redis-cluster&quot;
    image: redis:6.2
    container_name: redis-cluster-entry
    command: redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 --cluster-yes
    depends_on:
      - redis-cluster
      - redis-node-1
      - redis-node-2&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간략하게 설명하자면!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;redis-cluster들의 노드 container 3개가 각각의 설정 파일을 이용해 살아난 후&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;redis-cluster-entry가 redis-cli로 cluster를 엮은 후 종료! 끝!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;더 자세한 설명을 원하는 사람들은 hwasurr님 블로그 찾아가서 보기로 하자 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 각 redis 노드의 설정 파일이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나는 포트번호만 변경해 가면서 파일을 만들었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(총 3개의 conf 파일이 필요하지!)&lt;/p&gt;
&lt;pre id=&quot;code_1698154544854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;port 6379
cluster-enabled yes
cluster-config-file node.conf
cluster-node-timeout 5000
appendonly yes&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 그 파일들.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/B0Nb4/btsy9eb2HJh/DGV1wOqhoMX9JbH84e6k7k/docker-compose.yaml?attach=1&amp;amp;knm=tfile.yaml&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;docker-compose.yaml&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/2eg2Z/btsy9Pb1r8V/JTUegJKSHskCkcpv5VB4KK/redis.conf?attach=1&amp;amp;knm=tfile.conf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;redis.conf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/P710Q/btsy4bafO0G/akNu8WbwWILPkH7LK9iP5K/redis1.conf?attach=1&amp;amp;knm=tfile.conf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;redis1.conf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bs0UCQ/btsy5fJOp2i/kdGZqtXJ0pkjkIFflvteC1/redis2.conf?attach=1&amp;amp;knm=tfile.conf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;redis2.conf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;docker-compose up 명령으로 실행시켜주고 docker desktop에서 확인해봤어.&lt;/p&gt;
&lt;pre id=&quot;code_1698156292315&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;% docker-compose up&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 캡쳐와 같이 잘 동작하는 걸 확인할 수 있지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.05.57.png&quot; data-origin-width=&quot;2462&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBXFIa/btsy06f1NRC/6gHhAlPNECSwANkorkGzKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBXFIa/btsy06f1NRC/6gHhAlPNECSwANkorkGzKK/img.png&quot; data-alt=&quot;docker redis cluster&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBXFIa/btsy06f1NRC/6gHhAlPNECSwANkorkGzKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBXFIa%2Fbtsy06f1NRC%2F6gHhAlPNECSwANkorkGzKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2462&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2023-10-24 오후 11.05.57.png&quot; data-origin-width=&quot;2462&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker redis cluster&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다들 엄청 바쁘지? ㅎㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;화이팅해 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>Server services/Docker</category>
      <category>docker-compose</category>
      <category>local redis cluster</category>
      <category>Redis Cluster</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/219</guid>
      <comments>https://engschool.tistory.com/219#entry219comment</comments>
      <pubDate>Tue, 24 Oct 2023 23:13:09 +0900</pubDate>
    </item>
    <item>
      <title>[FPGA] non-blocking assignment</title>
      <link>https://engschool.tistory.com/218</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오랜만에 하는 FPGA라 기억이 가물가물~ 해 ㅋㅋ&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 HDL은 문법이 매~~~우 간단해. 설명하기 민망할 정도랄까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 내가 생각해도 약간 이해가 필요한 부분이 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바로 non-blocking/block assignment야.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-10-23 오후 9.58.24.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xnycg/btsy4qDD0PL/369SnhhjqbPrqslOorPFGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xnycg/btsy4qDD0PL/369SnhhjqbPrqslOorPFGK/img.png&quot; data-alt=&quot;이 이미지를 상상하면 더 헤깔린다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xnycg/btsy4qDD0PL/369SnhhjqbPrqslOorPFGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxnycg%2Fbtsy4qDD0PL%2F369SnhhjqbPrqslOorPFGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;414&quot; data-filename=&quot;스크린샷 2023-10-23 오후 9.58.24.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 이미지를 상상하면 더 헤깔린다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;&amp;lt;=&quot; : non-blocking assignment&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;=&quot;: blocking assignment&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단한 예를 들어보자구.&lt;/p&gt;
&lt;pre id=&quot;code_1698063092927&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;case(state_count)
    2'b00: begin
        state_count &amp;lt;= 2'b01;
        if(trig == 1) begin
            state_count &amp;lt;= 2'b10;
        end
    end
    2'b01: begin
        ...
    end
    2'b10: begin
        ...
    end
    ...
    .
    .
endcase&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2'b00 state를 보면 trig가 1이면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;state_count에는 2'b01이 할당될까? 아니면 2'b10이 할당될까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;non-blocking assignment는 현 단계의 마지막에 업데이트 된다고 보면 돼.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러므로 trig가 1일 때 결국은 state_count에는 2'b10이 할당될거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너무 당연한가? ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 그럼! 아래와 같은 애들은 어떨까?ㅋㅋ&lt;/p&gt;
&lt;pre id=&quot;code_1698062228645&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;always @ (posedge(clk) or negedge(nrst))
begin
	pre_busy &amp;lt;= busy;
    if(pre_busy == 0 &amp;amp;&amp;amp; busy == 1) begin
    	state_count &amp;lt;= state_count+ 1;
    end
    case(state_count)
    	2'b00:
        ...
        ...
        .
        .
    endcase
end&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 코드에서 pre_busy &amp;lt;= busy;가 있고 바로 그 다음 줄에 그 둘을 비교하고 있는데 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아마 일반 프로그래밍 언어에 익숙한 사람들은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이게 도대체 뭐야??  &lt;/b&gt;라는 생각이 먼저 들거야 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 설명했듯이 non-blocking assignment는 &lt;b&gt;현 시간 단계의 끝&lt;/b&gt;에서 업데이트 될거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러니까 pre_busy에 busy를 담긴 할건데 이 클럭의 끝에서 할당할거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;pre_busy는 이전 시간 단계의 busy 값을 가지고 있으니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 값을 비교할 수 있는 거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런식으로 non-blocking assignment의 특성을 이용해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 시그널의 edge를 찾기도 한다는 거!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(위의 경우에는 busy의 rising edge를 찾은 거!)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;알아두면 실전에서 매우 도움될껄? ㅎㅎ 아님 말고~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕~&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>임베디드 하드웨어/FPGA</category>
      <category>edge detect</category>
      <category>FPGA</category>
      <category>non blocking assignment</category>
      <category>Verilog</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/218</guid>
      <comments>https://engschool.tistory.com/218#entry218comment</comments>
      <pubDate>Mon, 23 Oct 2023 21:59:34 +0900</pubDate>
    </item>
    <item>
      <title>[FPGA] 이젠 하다하다 FPGA까지 하는구나..</title>
      <link>https://engschool.tistory.com/217</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지금도 회로도 그리다가 펌웨어하다가..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes를 설정하다가..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Cognito를 apisix gateway에 붙이고..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;nest.js로 payment api를 짜다가..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제는...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FPGA 프로젝트까지 하게 되었어...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17e45215c884c61db.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OknEY/btsuRIav8pq/XpyWNgdkzmTSyP8SHlQSgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OknEY/btsuRIav8pq/XpyWNgdkzmTSyP8SHlQSgK/img.jpg&quot; data-alt=&quot;응 내가 죽게 생겼어.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OknEY/btsuRIav8pq/XpyWNgdkzmTSyP8SHlQSgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOknEY%2FbtsuRIav8pq%2FXpyWNgdkzmTSyP8SHlQSgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;795&quot; data-filename=&quot;17e45215c884c61db.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;응 내가 죽게 생겼어.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아주 행복해 죽게 생겼어 그냥...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;번아웃도 오고 말야;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아 모르겠고!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에 사용할 FPGA는 xilinx 사의 Artix7 시리즈인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 5만 게이트쯤 쓰면 되지 않을까 싶어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QrzPv/btsuSjPfzcr/s3CYKJUfVeGGGaUPN3HDJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QrzPv/btsuSjPfzcr/s3CYKJUfVeGGGaUPN3HDJ0/img.png&quot; data-alt=&quot;요건 10만 게이트 짜리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QrzPv/btsuSjPfzcr/s3CYKJUfVeGGGaUPN3HDJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQrzPv%2FbtsuSjPfzcr%2Fs3CYKJUfVeGGGaUPN3HDJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;436&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요건 10만 게이트 짜리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자일링스 FPGA에는 spartan, vertex, kintex, zynq 등등 종류도 다양한데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;vertex나 kintex는 게이트 수가 빵빵한 대신 음청 비싸~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래고 zynq는 mcu(arm)가 내장되어 있지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-19 오후 10.14.49.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnUb5H/btsuG91oYUY/DyuiACdrmByABELKlPk9q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnUb5H/btsuG91oYUY/DyuiACdrmByABELKlPk9q1/img.png&quot; data-alt=&quot;zynq product table&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnUb5H/btsuG91oYUY/DyuiACdrmByABELKlPk9q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnUb5H%2FbtsuG91oYUY%2FDyuiACdrmByABELKlPk9q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;650&quot; data-filename=&quot;스크린샷 2023-09-19 오후 10.14.49.png&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zynq product table&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 난 mcu 사용할 일이 없고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;vertex나 kintex를 사용할 정도로 게이트 수가 클 것 같지 않으니 남는건&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;spartan과 artix7...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;spartan은 예전에 나온거니까 ㅋ 결국 artix7 당첨 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용법?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐... FPGA가 다 똑같지..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Verilog나 VHDL로 코드 짠다! 우가!우가!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. ISE/Quartus로 합성 돌린다! 우가!우가!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 담배 한대 피우고 놀다 온다. 우가 ㅋㅋ 우가ㅋㅋㅋ&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(합성시간 개오래 걸림)&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 바이너리 프로그램하고 테스트! 우가우가!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(이 때 문법 오류 나 있으면 개꿀! 수정 후 다시 2번으로)&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;무지성 무한 반복이었지 ㅋㅋㅋㅋ 10년전에 ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Q8in/btsuCIDtb0w/qAQpRPQu8ImKfbFdvKEkbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Q8in/btsuCIDtb0w/qAQpRPQu8ImKfbFdvKEkbk/img.png&quot; data-alt=&quot;우가우가! 불 피운다! 우가우가 FPGA 꿉는다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Q8in/btsuCIDtb0w/qAQpRPQu8ImKfbFdvKEkbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Q8in%2FbtsuCIDtb0w%2FqAQpRPQu8ImKfbFdvKEkbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;373&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우가우가! 불 피운다! 우가우가 FPGA 꿉는다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자~ ISE 다운로드 받으러 가자~~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-19 오후 9.57.39.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J9YB7/btsuID2pBR5/WgzeqsnfevRbxjP4KSVue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J9YB7/btsuID2pBR5/WgzeqsnfevRbxjP4KSVue1/img.png&quot; data-alt=&quot;잉? Vivado는 뭐시여?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J9YB7/btsuID2pBR5/WgzeqsnfevRbxjP4KSVue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ9YB7%2FbtsuID2pBR5%2FWgzeqsnfevRbxjP4KSVue1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1850&quot; height=&quot;552&quot; data-filename=&quot;스크린샷 2023-09-19 오후 9.57.39.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잉? Vivado는 뭐시여?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엥?? ISE는 쓰지 말고 Vivado를 쓰라고 하네?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 자일링스가 AMD에 인수된겨??? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잠깐만 한눈 팔아도 확 변하니 원.. 따라잡겠나..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잠깐.. 좀 쌔한데? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;혹시나 해서 알테라(자일링스 경쟁사) 검색 ㄱㄱ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-19 오후 10.00.30.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdS91v/btsuJeH6MqB/wiABcJkEbvnFqbDeqX4IR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdS91v/btsuJeH6MqB/wiABcJkEbvnFqbDeqX4IR1/img.png&quot; data-alt=&quot;ㅋㅋㅋㅋㅋㅋ 인텔이 가져갔네? ㅋㅋㅋㅋ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdS91v/btsuJeH6MqB/wiABcJkEbvnFqbDeqX4IR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdS91v%2FbtsuJeH6MqB%2FwiABcJkEbvnFqbDeqX4IR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;502&quot; data-filename=&quot;스크린샷 2023-09-19 오후 10.00.30.png&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅋㅋㅋㅋㅋㅋ 인텔이 가져갔네? ㅋㅋㅋㅋ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐여 이건 또 ㅋㅋ 알테라는 인텔이 인수했네 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Actel은 microchips가 인수했고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기 FPGA 판도 재미지는 구만 ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 나는 자일링스 쓸거니깐 다른 건 신경끄고!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Vivado 설치하고 basys3 보드에다가 예제 굴려봤지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(다운로드 하고 설치하는데 1시간 넘게 걸리더라)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blGvmw/btsuAuSztfI/2Uy7iX8KkXsS7X9imH3LO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blGvmw/btsuAuSztfI/2Uy7iX8KkXsS7X9imH3LO1/img.jpg&quot; data-alt=&quot;Basys 3 artix 7 FPGA 보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blGvmw/btsuAuSztfI/2Uy7iX8KkXsS7X9imH3LO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblGvmw%2FbtsuAuSztfI%2F2Uy7iX8KkXsS7X9imH3LO1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;755&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;755&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Basys 3 artix 7 FPGA 보드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음.. 솔직히 느낌에는 ISE랑 다른 거 하나도 없더라구 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;똑같아 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;합성하는데 시간 드릅게 오래 걸리고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;편집기 개 불편하고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음부터는 그냥 vscode에서 코드짜고 합성만 vivado에서 해야겠어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋ 암튼 이제 이짓거리도 본격적으로 해야 하니...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간간히 FPGA관련 글들도 올려야겠다.... 올려야 하나?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;으흐흐흐흐흐흐&lt;/p&gt;</description>
      <category>임베디드 하드웨어/FPGA</category>
      <category>Artix7</category>
      <category>Basys3</category>
      <category>Vivado</category>
      <category>xilinx</category>
      <category>자일링스</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/217</guid>
      <comments>https://engschool.tistory.com/217#entry217comment</comments>
      <pubDate>Tue, 19 Sep 2023 22:38:53 +0900</pubDate>
    </item>
    <item>
      <title>[Kubernetes] 네이버 클라우드에다가 시작!</title>
      <link>https://engschool.tistory.com/216</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;도커를 하다보니 도커 컴포즈가 튀어나오고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;도커 컴포즈를 하다보니 결국은 쿠버네티스까지 오는구만..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 kubernetes에다가 msa 구축, 내일은 회로 그리고 PCB 아트웍을 할건데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이건 뭐 업무가 오페라부르면서 헤드스핀 도는 개미핥기마냥 변태적이구만..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이젠 뭐가 뭔지 모르겠다 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 지금은 네이버 클라우드 kubernetes에다가 작업중이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 메뉴얼이 한글이라 개행복!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-01 오후 11.40.22.png&quot; data-origin-width=&quot;2852&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3hWX/btspFlMx3cD/qytSvAZtLPbjWCJ9kMIe7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3hWX/btspFlMx3cD/qytSvAZtLPbjWCJ9kMIe7K/img.png&quot; data-alt=&quot;네이버 쿠버네티스 서비스 한글 메뉴얼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3hWX/btspFlMx3cD/qytSvAZtLPbjWCJ9kMIe7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3hWX%2FbtspFlMx3cD%2FqytSvAZtLPbjWCJ9kMIe7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;428&quot; data-filename=&quot;스크린샷 2023-08-01 오후 11.40.22.png&quot; data-origin-width=&quot;2852&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 쿠버네티스 서비스 한글 메뉴얼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 뭐랄까 약간 설정 지옥인데;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;영문 메뉴얼 보다가 한글 메뉴얼 보니까 뇌가 맑아지는 듯~ 캬~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빠르게 쿠버네티스에 진입하고자 하는 한국 사람들은 네이버 클라우드가 좋을지도!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 일주일 정도 사용해봤는데 전반적으로 깔끔하게 동작하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다시 말하지만 한글 메뉴얼 덕분에 크게 막히는 부분은 없었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가격적인 측면에서는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;네이버 쿠버네티스 노드 4코어 16기가 3개 돌리면 528000원,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(쿠버네티스 사용료는 월 72000원정도)&lt;br /&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1984&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFyVZQ/btspFl6TAk1/ny5BsByC87mSOppvhRtrfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFyVZQ/btspFl6TAk1/ny5BsByC87mSOppvhRtrfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFyVZQ/btspFl6TAk1/ny5BsByC87mSOppvhRtrfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFyVZQ%2FbtspFl6TAk1%2Fny5BsByC87mSOppvhRtrfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1984&quot; height=&quot;1050&quot; data-origin-width=&quot;1984&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;AWS도 비슷한 사양 컴터에 46-7만원, EKS 사용료는 월 94000원 정도 되니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;큰 가격 차이는 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 이건 홈페이지 기준이고 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MSP(대리점 같은) 끼고 할인 받으면 좀 더 가격이 저렴해지겠지 뭐 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 실제로 MSA를 구축하려면 이거 말고도 NAS라던지 DB, IP 등등등&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;추가로 사용해야 할 것들이 많아서 월 2-3백만원 정도는 각오하고 있어  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개인이나 소규모의 기업에게는 절대 쉬운 가격은 아니지!  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잡소리는 이 정도까지만 하고 다음부터는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;네이버 클라우드에 MSA 구축하면서 약간 어려웠던 것들 위주로 글을 쓰도록 하지. 안녕! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(대부분 메뉴얼대로 하면 아주 잘!! 동작해)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 국내에서는 KT 클라우드도 있는 거 알지?&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 너님 뇌 용량 낭비하고 있는거야.  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 존재 자체를 잊어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;레드썬!&lt;/p&gt;</description>
      <category>Server services/kubernetes</category>
      <category>네이버 클라우드</category>
      <category>쿠버네티스 시작</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/216</guid>
      <comments>https://engschool.tistory.com/216#entry216comment</comments>
      <pubDate>Wed, 2 Aug 2023 00:42:21 +0900</pubDate>
    </item>
    <item>
      <title>FreeRTOS + Lwip socket 갯수 조정</title>
      <link>https://engschool.tistory.com/215</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;STM cube에서 rtos + lwip 서버를 돌릴 때 접속가능한 클라이언트 갯수를 조정해보려고 ㅎ&lt;br /&gt;상당히 간단한데 난 엄한 이유로 개고생했어 ㅋ&lt;br /&gt;다른 사람들은 나처럼 고생하지 말라고!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;br /&gt;간단하게 설명하면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MEMP_NUM_TCP_PCB&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MEMP_NUM_TCP_PCB_LISTEN&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MEMP_NUM_NETCONN&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 세가지를 조정하면 끝이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내용이 중복되는 느낌이지만 암튼 이것들이 클라이언트의 접속 갯수에 영향을 미쳐.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설정은 아래와 같이  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;총 소캣 수 = 클라이언트 수 + 1&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;서버니까 listen 소켓 하나 + 클라이언트용 소켓들로 총 소켓 수가 나오겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 3개의 클라이언트의 접속을 허용할거니까 +1해서 4로 설정했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WmXSh/btspHY4sp6Z/M5KCgo3oK2U4kdPKgn7cKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WmXSh/btspHY4sp6Z/M5KCgo3oK2U4kdPKgn7cKK/img.png&quot; data-alt=&quot;LWIP 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WmXSh/btspHY4sp6Z/M5KCgo3oK2U4kdPKgn7cKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWmXSh%2FbtspHY4sp6Z%2FM5KCgo3oK2U4kdPKgn7cKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;657&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LWIP 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSDfeA/btspOzQjhrq/T4fMY3o3rJCZtdEnf4ZCb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSDfeA/btspOzQjhrq/T4fMY3o3rJCZtdEnf4ZCb0/img.png&quot; data-alt=&quot;LWIP 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSDfeA/btspOzQjhrq/T4fMY3o3rJCZtdEnf4ZCb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSDfeA%2FbtspOzQjhrq%2FT4fMY3o3rJCZtdEnf4ZCb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;657&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LWIP 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단하지? ㅋㅋㅋㅋ&lt;br /&gt;그런데 내가 고생했던 부분은 여기가 아님 ㅋ&lt;br /&gt;분명히 바르게 조정했는데 소켓 2개 이상부터 할당을 못하더라 ㅠㅠ&lt;br /&gt;디버그 모드로 겁나 쫓아들어갔더니 rtos queue할당에 실패..&lt;br /&gt;lwip만 주구장창 팠는데 freertos 메모리 문제였다니 허무~~~~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;br /&gt;결국 freertos heap 사이즈를 2k정도 더 늘려주는 것으로 해결;;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8eA4I/btspOA2JpLE/4AMUtwkjDwZCHrkLB62jn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8eA4I/btspOA2JpLE/4AMUtwkjDwZCHrkLB62jn0/img.png&quot; data-alt=&quot;FreeRTOS 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8eA4I/btspOA2JpLE/4AMUtwkjDwZCHrkLB62jn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8eA4I%2FbtspOA2JpLE%2F4AMUtwkjDwZCHrkLB62jn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;662&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FreeRTOS 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 대~~강 통빱으로 해결하려고 하지말고 첨부터 차근히 디버그 모드로 코드 따라갔으면 30분이면 끝낼 문제였는데;;&lt;br /&gt;이 간단한 걸로 만 하루를 통으로 날렸으니 한심하기도 하지  &lt;br /&gt;rtos하면서 항상 느끼는 건데...&lt;br /&gt;문제가 생기면&lt;br /&gt;Heap 사이즈부터 늘려보자!!&lt;br /&gt;안녕!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>임베디드 소프트웨어/FreeRTOS</category>
      <category>FreeRTOS HEAP_SIZE</category>
      <category>lwip 서버 소켓</category>
      <category>lwip 소켓 갯수 늘리기</category>
      <category>MEMP_NUM_TCP</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/215</guid>
      <comments>https://engschool.tistory.com/215#entry215comment</comments>
      <pubDate>Tue, 1 Aug 2023 23:02:11 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] Kafkajs</title>
      <link>https://engschool.tistory.com/214</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 글에서 이야기했듯이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Nest.js에서 제공하는 Kafka micro service는 조금 구려 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 kafkajs를 직접 써보려고 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kafka.js.org/docs/getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kafka.js.org/docs/getting-started&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687780244849&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;KafkaJS &amp;middot; KafkaJS, a modern Apache Kafka client for Node.js&quot; data-og-description=&quot;KafkaJS, a modern Apache Kafka client for Node.js&quot; data-og-host=&quot;kafka.js.org&quot; data-og-source-url=&quot;https://kafka.js.org/docs/getting-started&quot; data-og-url=&quot;https://kafka.js.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://kafka.js.org/docs/getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kafka.js.org/docs/getting-started&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;KafkaJS &amp;middot; KafkaJS, a modern Apache Kafka client for Node.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;KafkaJS, a modern Apache Kafka client for Node.js&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kafka.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메뉴얼이 굉장히 잘 써져 있고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용법도 매우 직관적이고 간단하더라구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시간내서 한번 읽어보는 것을 추천해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 새로운 nestjs 프로젝트 만들고 kafkajs 설치하고~&lt;/p&gt;
&lt;pre id=&quot;code_1687780309531&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest new kafkajs
npm install kafkajs&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;귀찮게 새로 만들지 말고 app.service.js에다가 코딩 ㄱㄱ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1687780975424&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Injectable } from '@nestjs/common';
import { EachMessagePayload, Kafka } from 'kafkajs';

@Injectable()
export class AppService {
  private kafka = new Kafka({
    clientId: &quot;peter's kafka&quot;,
    brokers: ['localhost:9094'],
  });
  private producer = this.kafka.producer();
  private consumer = this.kafka.consumer({ groupId: &quot;peter's kafka group&quot; });

  constructor() {
    this.consumer.connect();//접속
    this.consumer.subscribe({ topics: ['test_a', 'test_b'] });//구독
    this.consumer.run({//메세지 수신 뱅뱅이
      eachMessage: this.consumerCallback,//메세지 수신 콜백
    });
  }

  async consumerCallback(payload: EachMessagePayload) {//메세지 수신 콜백
    console.log('kafka message arrived');
    console.log(
      `topic: ${payload.topic}, Message:${payload.message.value.toString()}`,
    );
  }

  getHello(): string {
    return 'Hello World!';
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코드가 뭐 너무 짧아서 설명할게 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;초기화해주고 consumer 하나 선언하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;접속 -&amp;gt; 구독 -&amp;gt; 수신 이게 전부 다야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메세지 들어오면 콜백 호출되서 메세지 뿌리고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 kafka broker는 미리 준비되어 있어야겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.25 - [Server services/Docker] - [Docker] Docker desktop + kafka + zookeeper + kafka ui&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687781198032&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Docker] Docker desktop + kafka + zookeeper + kafka ui&quot; data-og-description=&quot;도커에 대한 설명? 구글링 해보면 &amp;quot;경량화된 가상화 서버&amp;quot;라는 말을 어렵고 유식하게 설명해 놓은 글이 차고 넘치니 아무거나 읽어보는 척하면서 스크롤 죽죽 당기자. 왠지 이런 툴들은 리눅스 &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/212&quot; data-og-url=&quot;https://engschool.tistory.com/212&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mWkeL/hyS6AHGPlL/Mx2Re5TRRZIB4DURkbGkkK/img.gif?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/calRxb/hyS6Dj75km/plO0qHRV7dYGacoF6F0qrK/img.gif?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/n25h8/hyS6wZARHG/fTif6CNkh6O3mnK0PKuT3k/img.png?width=2540&amp;amp;height=1440&amp;amp;face=0_0_2540_1440&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/212&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mWkeL/hyS6AHGPlL/Mx2Re5TRRZIB4DURkbGkkK/img.gif?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/calRxb/hyS6Dj75km/plO0qHRV7dYGacoF6F0qrK/img.gif?width=800&amp;amp;height=452&amp;amp;face=0_0_800_452,https://scrap.kakaocdn.net/dn/n25h8/hyS6wZARHG/fTif6CNkh6O3mnK0PKuT3k/img.png?width=2540&amp;amp;height=1440&amp;amp;face=0_0_2540_1440');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Docker] Docker desktop + kafka + zookeeper + kafka ui&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;도커에 대한 설명? 구글링 해보면 &quot;경량화된 가상화 서버&quot;라는 말을 어렵고 유식하게 설명해 놓은 글이 차고 넘치니 아무거나 읽어보는 척하면서 스크롤 죽죽 당기자. 왠지 이런 툴들은 리눅스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 나서 실행&lt;/p&gt;
&lt;pre id=&quot;code_1687781428780&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run start:dev&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 kafka-ui를 통해 토픽을 생성해보면!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GAvqf/btslt1khC3t/LUkpDG7Yj0UQSdxkKq5kU1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GAvqf/btslt1khC3t/LUkpDG7Yj0UQSdxkKq5kU1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GAvqf/btslt1khC3t/LUkpDG7Yj0UQSdxkKq5kU1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/GAvqf/btslt1khC3t/LUkpDG7Yj0UQSdxkKq5kU1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;397&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아주우우~ 잘 동작하는 걸 볼수가 있지!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자! 이제 새로운 토픽을 생성하는 엔드포인트를 하나 만들어보자구 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이것도 귀찮으니까 app.controller.ts에다가 만들어봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1687782708041&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Body, Controller, Get, Post, Query } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
  //꼴랑 이거 하나 추가
  @Post('add-topic')
  async addSubscriptionTopic(@Body('topic') topic: string): Promise&amp;lt;string&amp;gt; {
    console.log(topic);
    if (topic == undefined) {
      return 'topic is undefined';
    } else {
      await this.appService.addSubscriptionTopic(topic);
      return `topic ${topic} added`;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음에는 app.service.ts를 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1687782787984&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Injectable } from '@nestjs/common';
import { EachMessagePayload, Kafka } from 'kafkajs';

@Injectable()
export class AppService {
  private kafka = new Kafka({
    clientId: &quot;peter's kafka&quot;,
    brokers: ['localhost:9094'],
  });
  private producer = this.kafka.producer();
  private consumer = this.kafka.consumer({ groupId: &quot;peter's kafka group&quot; });

  constructor() {
    this.consumer.connect();
    this.consumer.subscribe({ topics: ['test_a', 'test_b'] });
    this.consumer.run({
      eachMessage: this.consumerCallback,
    });
  }

  async consumerCallback(payload: EachMessagePayload) {
    console.log('kafka message arrived');
    console.log(
      `topic: ${payload.topic}, Message:${payload.message.value.toString()}`,
    );
  }
  //아래 함수를 추가한 거임!!!!!
  async addSubscriptionTopic(topic: string) {
    await this.consumer.stop(); // 컨슈머 멈추고
    await this.consumer.subscribe({ topic }); // 구독하고
    await this.consumer.run({ // 다시 돌돌이!
      eachMessage: this.consumerCallback,
    });
  }
  
  getHello(): string {
    return 'Hello World!';
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;별거 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;컨슈머 잠시 멈추고, 토픽 추가 구독하고 다시 돌돌이!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런식으로 dynamic하게 토픽을 추가할 수 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;테스트를 해보면  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 localhost:3000/app-topic에 post로 구독할 토픽을 보내.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 addSubscriptionTopic이 호출되서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;토픽이 추가될거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 kafka-ui에서 추가된 토픽으로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메세지를 보내면 console창에 출력이 되겠지!.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0LLEY/btslxK2FcRM/kXuW1J2v2rC24HedYcWHi1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0LLEY/btslxK2FcRM/kXuW1J2v2rC24HedYcWHi1/img.gif&quot; data-alt=&quot;dynamic topic subscription!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0LLEY/btslxK2FcRM/kXuW1J2v2rC24HedYcWHi1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/0LLEY/btslxK2FcRM/kXuW1J2v2rC24HedYcWHi1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;479&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dynamic topic subscription!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㅎㅎㅎ 매우~ 잘 동작해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런식으로 nestjs에다가 kafkajs 올려서 사용하면 좋을 듯!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;매우 훌륭해! ㅎㅎㅎ&lt;/p&gt;</description>
      <category>Server services/nest.js</category>
      <category>dynamic topic subscription</category>
      <category>kafkajs</category>
      <category>nestjs</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/214</guid>
      <comments>https://engschool.tistory.com/214#entry214comment</comments>
      <pubDate>Mon, 26 Jun 2023 21:47:44 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] Kafka microservice</title>
      <link>https://engschool.tistory.com/213</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Nest.js에서는 공식적으로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka microservice를 제공하고 있어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3190&quot; data-origin-height=&quot;2120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dR86c1/btslmVwIK3K/1Dk11idTfzpd2ZiD6anHx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dR86c1/btslmVwIK3K/1Dk11idTfzpd2ZiD6anHx1/img.png&quot; data-alt=&quot;kafka micro service&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dR86c1/btslmVwIK3K/1Dk11idTfzpd2ZiD6anHx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdR86c1%2FbtslmVwIK3K%2F1Dk11idTfzpd2ZiD6anHx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3190&quot; height=&quot;2120&quot; data-origin-width=&quot;3190&quot; data-origin-height=&quot;2120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kafka micro service&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;근데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구려. ㅋ&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해보면 알아~ 해보자구 ㅋ&lt;/p&gt;
&lt;pre id=&quot;code_1687697485263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest new kafka_msa_test&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 명령으로 nest.js 새 프로젝트 시작&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.55.10.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bueJza/btslbpsEaKk/KkD1n353CdYDhlzkDh8CoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bueJza/btslbpsEaKk/KkD1n353CdYDhlzkDh8CoK/img.png&quot; data-alt=&quot;새 프로젝트 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bueJza/btslbpsEaKk/KkD1n353CdYDhlzkDh8CoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbueJza%2FbtslbpsEaKk%2FKkD1n353CdYDhlzkDh8CoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;373&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.55.10.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새 프로젝트 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카프카랑 @nestjs/microservices도 미리 설치해주고~&lt;/p&gt;
&lt;pre id=&quot;code_1687697785470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i --save kafkajs
npm i --save @nestjs/microservices&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 main.ts에다가 microservice를 추가해 줄거야~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1687702487429&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/microservices';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.connectMicroservice({
    transport: Transport.KAFKA,
    options: {
      client: {
        clientId: 'peterKafkaClient',
        brokers: ['localhost:9094'],
      },
      consumer: {
        groupId: 'peterKafkaGroup',
      },
    },
  });

  await app.listen(3000);
  await app.startAllMicroservices();
}
bootstrap();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기에 명시된 broker는 내가 로컬 도커에 띄운 kafka 브로커임.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 글 참고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.25 - [Server services/Docker] - [Docker] Docker desktop + kafka + zookeeper + kafka ui&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687702845750&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Docker] Docker desktop + kafka + zookeeper + kafka ui&quot; data-og-description=&quot;도커에 대한 설명? 구글링 해보면 &amp;quot;경량화된 가상화 서버&amp;quot;라는 말을 어렵고 유식하게 설명해 놓은 글이 차고 넘치니 아무거나 읽어보는 척하면서 스크롤 죽죽 당기자. 왠지 이런 툴들은 리눅스 &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/212&quot; data-og-url=&quot;https://engschool.tistory.com/212&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ciIqeb/hyS6GHcP1N/XuiokIasqdFzObTsvfVA51/img.png?width=2540&amp;amp;height=1440&amp;amp;face=0_0_2540_1440&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/212&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/212&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ciIqeb/hyS6GHcP1N/XuiokIasqdFzObTsvfVA51/img.png?width=2540&amp;amp;height=1440&amp;amp;face=0_0_2540_1440');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Docker] Docker desktop + kafka + zookeeper + kafka ui&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;도커에 대한 설명? 구글링 해보면 &quot;경량화된 가상화 서버&quot;라는 말을 어렵고 유식하게 설명해 놓은 글이 차고 넘치니 아무거나 읽어보는 척하면서 스크롤 죽죽 당기자. 왠지 이런 툴들은 리눅스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 기본적으로 생성된 app.controller.ts에다가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 @MessagePattern('구독할 토픽') 을 넣어주면 끝!&lt;/p&gt;
&lt;pre id=&quot;code_1687702562673&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
  
  //이부분 추가요~
  @MessagePattern('peterKafka')
  helloKafka(@Payload() payload) {
    console.log(JSON.stringify(payload));
  }

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 테스트를 해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1687702872843&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run start&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka-ui에서 확인해보면 자신이 설정한 카프가 그룹이 보일거야.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 구독중인 토픽으로 메세지를 날려보자구&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjLTyH/btslhcy3XZv/EiHyi4eTUulEdWbOkq9Wk0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjLTyH/btslhcy3XZv/EiHyi4eTUulEdWbOkq9Wk0/img.gif&quot; data-alt=&quot;localhost:8080 (kafka-ui)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjLTyH/btslhcy3XZv/EiHyi4eTUulEdWbOkq9Wk0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bjLTyH/btslhcy3XZv/EiHyi4eTUulEdWbOkq9Wk0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;640&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;localhost:8080 (kafka-ui)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 콘솔창에서 정상적으로 메세지가 수신되는 걸 확인할 수가 있지!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE6XEk/btslndxrmN9/Vn0wyEa8lYN8s4zAkFKTB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE6XEk/btslndxrmN9/Vn0wyEa8lYN8s4zAkFKTB0/img.png&quot; data-alt=&quot;정상적으로 메세지가 수신된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE6XEk/btslndxrmN9/Vn0wyEa8lYN8s4zAkFKTB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE6XEk%2FbtslndxrmN9%2FVn0wyEa8lYN8s4zAkFKTB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1678&quot; height=&quot;854&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적으로 메세지가 수신된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엄청 쉽고 강력해! ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 좀 구린게 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;토픽을 dynamic하게 구독할 수가 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구독할 토픽을 변경하려면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코드나 설정을 변경한 다음에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;서버를 내렸다가 다시 올려야함 -_-;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이게 메세지를 발행할 때도 문제가 돼 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;response 받아야 하는 경우가 있잖아?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럴 땐 response 토픽을 수신해야 하는데;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이때 dynamic하게 추가할 수 없으면;;; 음.. 구려~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 난 nest.js에서 제공하는 kafka micro service 대신&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 kafkajs를 써서 kafka agent를 구현할 거임 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 시간에! ㅋ 안녕!&lt;/p&gt;</description>
      <category>Server services/nest.js</category>
      <category>Kafka</category>
      <category>microservice</category>
      <category>nestjs</category>
      <category>topic dynamic subscription</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/213</guid>
      <comments>https://engschool.tistory.com/213#entry213comment</comments>
      <pubDate>Sun, 25 Jun 2023 23:36:47 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker desktop + kafka + zookeeper + kafka ui</title>
      <link>https://engschool.tistory.com/212</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;도커에 대한 설명?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구글링 해보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;경량화된 가상화 서버&quot;라는 말을 어렵고 유식하게 설명해 놓은 글이 차고 넘치니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아무거나 읽어보는 척하면서 스크롤 죽죽 당기자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왠지 이런 툴들은 리눅스 기반에서 탄생했고..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;막 linux 터미널에서 커맨드로 막 설정하고 막 ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;괜히 짜증나니까 GUI 찾아보면 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;!! 바로 있네&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Docker desktop&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687691225448&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Download Docker Desktop | Docker&quot; data-og-description=&quot;Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-url=&quot;https://www.docker.com/products/docker-desktop/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cd2CBK/hyS6CLndVZ/1G2Sx3YgibvDbyB62OMRkk/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/mN3n5/hyS6DKhmaN/YxMGAZrSvRxgIWAKk5XTgK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cd2CBK/hyS6CLndVZ/1G2Sx3YgibvDbyB62OMRkk/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/mN3n5/hyS6DKhmaN/YxMGAZrSvRxgIWAKk5XTgK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Docker Desktop | Docker&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;운영 체제에 맞게 설치하자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 Mac이므로 아래와 같이.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.36.46.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDMuXI/btslaI6YUGi/C8H9PkTTQrJkgmFPvaoqI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDMuXI/btslaI6YUGi/C8H9PkTTQrJkgmFPvaoqI1/img.png&quot; data-alt=&quot;다운로드하고 드레그 하면 끝.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDMuXI/btslaI6YUGi/C8H9PkTTQrJkgmFPvaoqI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDMuXI%2FbtslaI6YUGi%2FC8H9PkTTQrJkgmFPvaoqI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;670&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.36.46.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다운로드하고 드레그 하면 끝.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;직원이 250명 넘고 연간 매출 $10 million보다 작으면 공짜라고..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;돈좀 내고 써봤으면 소원이 없겠다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.37.56.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDi44F/btslbRvDhsL/EDi8ECqoVfWQvoEXIhUVl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDi44F/btslbRvDhsL/EDi8ECqoVfWQvoEXIhUVl1/img.png&quot; data-alt=&quot;서비스 약관 동의하시고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDi44F/btslbRvDhsL/EDi8ECqoVfWQvoEXIhUVl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDi44F%2FbtslbRvDhsL%2FEDi8ECqoVfWQvoEXIhUVl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1000&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.37.56.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서비스 약관 동의하시고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자신없으면 recommended 설정 사용하시고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.11.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A0iPl/btsldPjLIPM/gIep9ofETrakfU1xh59So1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A0iPl/btsldPjLIPM/gIep9ofETrakfU1xh59So1/img.png&quot; data-alt=&quot;기본 설정으로 놔두고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A0iPl/btsldPjLIPM/gIep9ofETrakfU1xh59So1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA0iPl%2FbtsldPjLIPM%2FgIep9ofETrakfU1xh59So1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;1500&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.11.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 설정으로 놔두고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설문 조사 응해주시고~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.40.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLy1Ub/btsljilo6jZ/93Aonpk5OztKRpDmBatGj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLy1Ub/btsljilo6jZ/93Aonpk5OztKRpDmBatGj0/img.png&quot; data-alt=&quot;대강 설문 조사 응해주시고&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLy1Ub/btsljilo6jZ/93Aonpk5OztKRpDmBatGj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLy1Ub%2Fbtsljilo6jZ%2F93Aonpk5OztKRpDmBatGj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.40.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대강 설문 조사 응해주시고&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 따란~ 설치는 끝이네.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.53.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ofsXx/btsljhz1haz/cFL4laFBzCDTN8lexUPr40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ofsXx/btsljhz1haz/cFL4laFBzCDTN8lexUPr40/img.png&quot; data-alt=&quot;따란!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ofsXx/btsljhz1haz/cFL4laFBzCDTN8lexUPr40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FofsXx%2Fbtsljhz1haz%2FcFL4laFBzCDTN8lexUPr40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.38.53.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;따란!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 본격적으로 도커에 kafka를 올려보자구!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka 구축에 필요한 건 총 3가지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. kafka: 당..연하지!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. kafka ui: 카프카 상태 볼 수 있는 UI 툴&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. zookeeper: 분산처리해주는 놈.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 도커에 올릴 이미지를 찾아보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;docker desktop 검색창에서 검색해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 kafka로 검색해보면&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다운로드 많은 순서대로 나오는데 인기 많은게 일반적인거겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Pull 버튼 눌러서 다운로드 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDmZdD/btslbn9qeTL/SiaYGTrKukZYwnkBzqhctK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDmZdD/btslbn9qeTL/SiaYGTrKukZYwnkBzqhctK/img.png&quot; data-alt=&quot;bitnami/kafka가 일등!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDmZdD/btslbn9qeTL/SiaYGTrKukZYwnkBzqhctK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDmZdD%2Fbtslbn9qeTL%2FSiaYGTrKukZYwnkBzqhctK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bitnami/kafka가 일등!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 kafka-ui&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;provectuslabs/kafka-ui 당첨!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.50.50.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQCYC/btslhdq9V8U/uPVWZ7HlGQhFn87USRn81k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQCYC/btslhdq9V8U/uPVWZ7HlGQhFn87USRn81k/img.png&quot; data-alt=&quot;provectuslabs/kafka-ui&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQCYC/btslhdq9V8U/uPVWZ7HlGQhFn87USRn81k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQCYC%2Fbtslhdq9V8U%2FuPVWZ7HlGQhFn87USRn81k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-filename=&quot;스크린샷 2023-06-25 오후 8.50.50.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;provectuslabs/kafka-ui&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마지막 zookeeper!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기본 zookeeper가 가장 인기가 많지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka랑 똑같이 binami 걸로 선택해줄게.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.07.45.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VupWc/btslmULkOLU/bkT1BhHh7ZIZiB3YsXHGfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VupWc/btslmULkOLU/bkT1BhHh7ZIZiB3YsXHGfK/img.png&quot; data-alt=&quot;binami/zookeeper&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VupWc/btslmULkOLU/bkT1BhHh7ZIZiB3YsXHGfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVupWc%2FbtslmULkOLU%2FbkT1BhHh7ZIZiB3YsXHGfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.07.45.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;binami/zookeeper&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAdmHr/btslahhBykf/MkZYRe7LXfTifulfr2Aq01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAdmHr/btslahhBykf/MkZYRe7LXfTifulfr2Aq01/img.png&quot; data-alt=&quot;다운로드된 image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAdmHr/btslahhBykf/MkZYRe7LXfTifulfr2Aq01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAdmHr%2FbtslahhBykf%2FMkZYRe7LXfTifulfr2Aq01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다운로드된 image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전부 다운로드를 받았으면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설정하고 가상머신 돌리면 되겠구만!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하나씩 하면 귀찮으니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;docker-compose에서 이 3개를 한번에 묶어서 구성해보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 docker-compose 파일을 아무데나 만들고!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(나는 workspace 폴더에 docker 폴더 하나 만들고 거기에서 했음)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1687695652847&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  zookeeper:
    image: bitnami/zookeeper:latest
    container_name: zookeeper
    ports:
      - 2181:2181
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes

  kafka:
    image: bitnami/kafka:latest
    container_name: kafka
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
      - 9094:9094
    environment:
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_ENABLE_KRAFT=no
      - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    depends_on:
      - kafka
    ports:
      - 8080:8080
    environment:
      - DYNAMIC_CONFIG_ENABLED=true
      - KAFKA_CLUSTERS_0_NAME=peters_kafka
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 설정들은 인터넷 검색해서 막 집어넣지 말고!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 도커 허브가서!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 사용할 이미지 검색!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 거기에 정의된 설정 이름을 사용하라구.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특히 environment는 말야!!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제발~~~~~&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sfKZ0/btslaHmOii9/rsduYEEofi4UtFU5kiPW21/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sfKZ0/btslaHmOii9/rsduYEEofi4UtFU5kiPW21/img.gif&quot; data-alt=&quot;docker hub에 각 도커 이미지 설정을 어떻게 해야하는지 매우 잘 나와 있어!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sfKZ0/btslaHmOii9/rsduYEEofi4UtFU5kiPW21/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/sfKZ0/btslaHmOii9/rsduYEEofi4UtFU5kiPW21/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;693&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker hub에 각 도커 이미지 설정을 어떻게 해야하는지 매우 잘 나와 있어!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka-ui는 공홈에 잘 나와 있구 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687696919902&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Configuration wizard - UI for Apache Kafka&quot; data-og-description=&quot;Note, that if the container is recreated, your edited (and uploaded) files won't be present and the app will be started with static configuration only. If you want to be able to keep the configuration created by wizard, you have to mount/copy the same file&quot; data-og-host=&quot;docs.kafka-ui.provectus.io&quot; data-og-source-url=&quot;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&quot; data-og-url=&quot;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.kafka-ui.provectus.io/configuration/configuration-wizard&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Configuration wizard - UI for Apache Kafka&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Note, that if the container is recreated, your edited (and uploaded) files won't be present and the app will be started with static configuration only. If you want to be able to keep the configuration created by wizard, you have to mount/copy the same file&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.kafka-ui.provectus.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설정이 올바르게 다 되었으면&lt;/p&gt;
&lt;pre id=&quot;code_1687696091722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d --force-recreate&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;명령으로 docker 올려버렷!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.18.35.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv4qDC/btsljSfXPaQ/3GL7r7CXUzLE1Fk5bKJeZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv4qDC/btsljSfXPaQ/3GL7r7CXUzLE1Fk5bKJeZ0/img.png&quot; data-alt=&quot;docker-compose up!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv4qDC/btsljSfXPaQ/3GL7r7CXUzLE1Fk5bKJeZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv4qDC%2FbtsljSfXPaQ%2F3GL7r7CXUzLE1Fk5bKJeZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;292&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.18.35.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker-compose up!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.19.39.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWCLC8/btslfdSusK0/tmFYrPPCxKDr0HKXjGWuFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWCLC8/btslfdSusK0/tmFYrPPCxKDr0HKXjGWuFK/img.png&quot; data-alt=&quot;도커들이 실행되고 있어!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWCLC8/btslfdSusK0/tmFYrPPCxKDr0HKXjGWuFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWCLC8%2FbtslfdSusK0%2FtmFYrPPCxKDr0HKXjGWuFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2540&quot; height=&quot;1440&quot; data-filename=&quot;스크린샷 2023-06-25 오후 9.19.39.png&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도커들이 실행되고 있어!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 localhost:8080으로 접속해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka가 정상적으로 동작중인지 확인해바바&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdQktx/btslhc6QEOH/7VNAy9ubKFvKs4KMVxYUG0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdQktx/btslhc6QEOH/7VNAy9ubKFvKs4KMVxYUG0/img.gif&quot; data-alt=&quot;kafka가 잘 동작하는 걸 kafka-ui를 통해 확인할 수 있어.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdQktx/btslhc6QEOH/7VNAy9ubKFvKs4KMVxYUG0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bdQktx/btslhc6QEOH/7VNAy9ubKFvKs4KMVxYUG0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;543&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kafka가 잘 동작하는 걸 kafka-ui를 통해 확인할 수 있어.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자 잘 동작하는 구만.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 메세지를 잘 주고 받는지 확인해볼 차례인데 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너어어어무 길다 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 시간에 이어서 하자 ㅋㅋ&lt;/p&gt;</description>
      <category>Server services/Docker</category>
      <category>bitnami/kafka</category>
      <category>bitnami/zookeeper</category>
      <category>docker desktop</category>
      <category>docker-compose</category>
      <category>Kafka-UI</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/212</guid>
      <comments>https://engschool.tistory.com/212#entry212comment</comments>
      <pubDate>Sun, 25 Jun 2023 21:32:57 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker에 대한 글쓰기 전 뻘글.</title>
      <link>https://engschool.tistory.com/211</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Docker 뻘짓으로 오늘 하루를 날린 내 자신에게 하고 싶은 말이 있네?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;RTFM 등신아 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://namu.wiki/w/RTFM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://namu.wiki/w/RTFM&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686662191362&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;RTFM - 나무위키&quot; data-og-description=&quot;Read The Fucking Manual!씨발 설명서 좀 처 읽어! 묻지도 따지지도 않고 일단 아무나 붙들고 자신의 궁금함을 해결하려는 사람들에게 반복되는 일상에 지친 사람들이 대답 대신으로 돌려줌으로써 질&quot; data-og-host=&quot;namu.wiki&quot; data-og-source-url=&quot;https://namu.wiki/w/RTFM&quot; data-og-url=&quot;https://namu.wiki/w/RTFM&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://namu.wiki/w/RTFM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://namu.wiki/w/RTFM&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RTFM - 나무위키&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Read The Fucking Manual!씨발 설명서 좀 처 읽어! 묻지도 따지지도 않고 일단 아무나 붙들고 자신의 궁금함을 해결하려는 사람들에게 반복되는 일상에 지친 사람들이 대답 대신으로 돌려줌으로써 질&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;namu.wiki&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;docker-vertical-logo-monochromatic.webp&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/domeeX/btsjO4wh4an/ZKj7u5s5COkKMa8krXxlt0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/domeeX/btsjO4wh4an/ZKj7u5s5COkKMa8krXxlt0/img.webp&quot; data-alt=&quot;docker!! docker!! docker!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/domeeX/btsjO4wh4an/ZKj7u5s5COkKMa8krXxlt0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdomeeX%2FbtsjO4wh4an%2FZKj7u5s5COkKMa8krXxlt0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;1126&quot; data-filename=&quot;docker-vertical-logo-monochromatic.webp&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker!! docker!! docker!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 도커를 써본 적이 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;응~ 배포가 쉬운 가상 서버~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 정도가 끝. 시도해 볼 생각은 1도 없었음.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실은 지금도 도 닦는 마음으로 하는거임.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;kafka 클러스터 도커 배포가 필요한 회사가 한국에 과연 몇이나 될까?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 서버 서비스를 하는 스타트업이 성공하기 전까지는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;gcp나 azure, aws가 제공하는 managed service를 사용하면 충분해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka 말고 pub/sub 서비스 쓰면 되고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;micro servier? lambda, cloud function 매우 훌륭하게 동작해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설치형 db를 왜써?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;firebase, dynamoDB 쓰면 되잖아 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;게다가 클라우드 서비스 대부분 무료 사용 용량이 있어서 초기에는 거의 공짜!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기에 EC2를 설정하고 도커, 쿠버네티스 같은 건 필요없고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;SSL 걱정, 도메인 걱정할 필요도 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 거 생각하면 아직도 도커를 만지는게 매우 어색하게 느껴짐.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;불합리~ &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어쨌든 도커들로 구성된 MSA를 구축해야 할 상황이 왔으니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나중에 크게 성공할 때를 위한 준비라고 생각하고 기분 좋게 해야지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;셀프 가스라이팅 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server services/Docker</category>
      <category>Docker</category>
      <category>도커</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/211</guid>
      <comments>https://engschool.tistory.com/211#entry211comment</comments>
      <pubDate>Tue, 13 Jun 2023 23:08:35 +0900</pubDate>
    </item>
    <item>
      <title>MSA 설계</title>
      <link>https://engschool.tistory.com/210</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거창하게 MSA 설계 라고 적어놨지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 MSA 실무에 투입되어 본 적도 없고 컴공 출신도 아니야 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 하게 되었으니 해야지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쫄지만 마 ㅋㅋㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;쫄지마.jpeg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMgfg/btsjPJeh0kK/8o3FRY671HxKQ18k0dKQX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMgfg/btsjPJeh0kK/8o3FRY671HxKQ18k0dKQX0/img.jpg&quot; data-alt=&quot;쫄지마 ㅋ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMgfg/btsjPJeh0kK/8o3FRY671HxKQ18k0dKQX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMgfg%2FbtsjPJeh0kK%2F8o3FRY671HxKQ18k0dKQX0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;186&quot; data-filename=&quot;쫄지마.jpeg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쫄지마 ㅋ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Micro  Service Architecture 라더라&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음 들어봄 ㅋ 관심이 없었으니 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;요약하면 커다란 서비스를 작은 서비스들로 쪼개서 운영하는 것.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 장점이 몇개 생기는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용량에 따라서 특정 서비스 용량 조절이 가능하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;서비스 장애 대응이 좋고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 생각안남 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;논문 쓸 것도 아니고 몰라도 됨.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 직관적으로 좋다는 거 다 알잖아?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 설계 시작&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-13 오후 8.41.15.png&quot; data-origin-width=&quot;2738&quot; data-origin-height=&quot;1290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VmUKp/btsjQh9Bh75/X9Z4ZAmyQB02q9eKAjPde0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VmUKp/btsjQh9Bh75/X9Z4ZAmyQB02q9eKAjPde0/img.png&quot; data-alt=&quot;대에에강 그려봄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VmUKp/btsjQh9Bh75/X9Z4ZAmyQB02q9eKAjPde0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVmUKp%2FbtsjQh9Bh75%2FX9Z4ZAmyQB02q9eKAjPde0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2738&quot; height=&quot;1290&quot; data-filename=&quot;스크린샷 2023-06-13 오후 8.41.15.png&quot; data-origin-width=&quot;2738&quot; data-origin-height=&quot;1290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대에에강 그려봄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 Miro.com에서 이런 저런 설계를 하는데 꽤 좋아. 다들 써봐 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 위 그림 처럼 대강 그려봤어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용자 인증은 크으으은 회사(구글같은)한테 맞기는 게 좋을 거 같아서 따로 했고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음에는 커어어어다란 API gateway에게 맡기는 거지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 API gateway는 각 MSA 모듈과 맵핑되어 있도록 했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 각 MSA간 DB sync나 기타 정보 교환에 카프카를 써보기로 했음 ㅇㅇ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왜 카프카냐고?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이름이 멋있음 준내 멋있음.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;KAFKA~~~ 크~~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다른 것들도 많은데 있던데.. RabitMQ 같은 거... 이름이 구려.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 했으면 각 서비스 구조를 생각해보려구&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-13 오후 8.58.28.png&quot; data-origin-width=&quot;4010&quot; data-origin-height=&quot;1748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO1Gaq/btsjPsjv4P9/8xtEKzBReDKHAh5NqDwqY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO1Gaq/btsjPsjv4P9/8xtEKzBReDKHAh5NqDwqY1/img.png&quot; data-alt=&quot;초기 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO1Gaq/btsjPsjv4P9/8xtEKzBReDKHAh5NqDwqY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO1Gaq%2FbtsjPsjv4P9%2F8xtEKzBReDKHAh5NqDwqY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4010&quot; height=&quot;1748&quot; data-filename=&quot;스크린샷 2023-06-13 오후 8.58.28.png&quot; data-origin-width=&quot;4010&quot; data-origin-height=&quot;1748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우린 이게 맞는지 안맞는지 고민따위는 하지 않아 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 그려 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내가 맡은 파트가 결제 서비스인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;회사에서 고민해놓은 MSA 구조가 아예 없어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내가 그릴 수 밖에 없었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내가 그린 MS는 간단하게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;API 서버, Kafka 서버, DB&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 3부분으로 나눌 수 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기존 서비스가 Django로 되어 있어서 Python 쓰시라고 Fast api를 넣었고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;api 서버와 kafka 서버는 분리했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 서비스용 DB가 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka 서버는 nest.js를 사용했는데 이유는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Fast api에 있는 kafka 라이브러리가 굉장히 구렸고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어차피 별도의 thread를 돌려야 했으므로...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;합치면 등신같은 코드가 나올 것 같은 느낌적인 느낌...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;퓨전실패.webp&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mU5XI/btsjRV55SdT/mdrLMD3mC1YfS2P3KPuyg0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mU5XI/btsjRV55SdT/mdrLMD3mC1YfS2P3KPuyg0/img.webp&quot; data-alt=&quot;퓨전 실패...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mU5XI/btsjRV55SdT/mdrLMD3mC1YfS2P3KPuyg0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmU5XI%2FbtsjRV55SdT%2FmdrLMD3mC1YfS2P3KPuyg0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;750&quot; data-filename=&quot;퓨전실패.webp&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퓨전 실패...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그에 비해 nest.js는 microservices 파트에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공식적으로 kafka를 지원하고 있었고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로고가 멋있잖아.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.13.23.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3KoWn/btsjS4BIYZ7/mM3Okkv2SYMmYrk3ztShMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3KoWn/btsjS4BIYZ7/mM3Okkv2SYMmYrk3ztShMk/img.png&quot; data-alt=&quot;Nest.js Kafka support&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3KoWn/btsjS4BIYZ7/mM3Okkv2SYMmYrk3ztShMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3KoWn%2FbtsjS4BIYZ7%2FmM3Okkv2SYMmYrk3ztShMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2200&quot; height=&quot;1916&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.13.23.png&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Nest.js Kafka support&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정했으니까 더 간결하게 표현해보자구&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.22.41.png&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6xuIL/btsjPqMNMiB/kihr7GNJyzdjxD7nPY1QIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6xuIL/btsjPqMNMiB/kihr7GNJyzdjxD7nPY1QIK/img.png&quot; data-alt=&quot;간결 버전!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6xuIL/btsjPqMNMiB/kihr7GNJyzdjxD7nPY1QIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6xuIL%2FbtsjPqMNMiB%2Fkihr7GNJyzdjxD7nPY1QIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2628&quot; height=&quot;1016&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.22.41.png&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간결 버전!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka consume event가 있으면 kafka 처리 서버는 api 서버에 데이터를 전달하면 되는데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Kafka produce는 어떻게 해야할까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;API 서버가 kafka에 다이렉트로 데이터를 produce 해야 할까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아니면 카프카 처리 서버가 DB Subscription으로 변화가 생기면 Produce해야 할까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;고민이 생기더라고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결국은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;api와 Kafka 처리 서버 사이에 별도의 프로토콜을 만들고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;business logic은 api 서버에서 처리하는 것으로 결정!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.28.32.png&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urmBL/btsjPExdsHC/DeJuexZfcZ0cIEFxSVIVzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urmBL/btsjPExdsHC/DeJuexZfcZ0cIEFxSVIVzK/img.png&quot; data-alt=&quot;MSA v1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urmBL/btsjPExdsHC/DeJuexZfcZ0cIEFxSVIVzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurmBL%2FbtsjPExdsHC%2FDeJuexZfcZ0cIEFxSVIVzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1802&quot; height=&quot;684&quot; data-filename=&quot;스크린샷 2023-06-13 오후 9.28.32.png&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MSA v1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음 간결해졌군~ 보기 좋아 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;NEST Kafka MSA는 이제 kafka 서버 설정&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 토픽에 대한 consume, produce만 딱 담당하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나머지는 API 서버에서 몽땅 다 하는 걸로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 kafka쪽은 모든 MSA 모듈이 공용으로 사용할 수 있게 되고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;API쪽은 최대한 kafka는 잊고 CRUD와 Business 로직에 집중할 수 있을거 같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아냐?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 어쩔 수 없어 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이젠 Nest kafka consume, produce 설정하는 프로토콜 만들고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;도커 짜서 배포하는 험난한 과정이 기다리고 있지  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;kafka 클러스터 구성은 덤이야 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;같이 할래? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>Server services/MSA 설계</category>
      <category>Fast API</category>
      <category>Kafka</category>
      <category>microservice</category>
      <category>MSA 설계</category>
      <category>Nest.js</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/210</guid>
      <comments>https://engschool.tistory.com/210#entry210comment</comments>
      <pubDate>Tue, 13 Jun 2023 21:43:43 +0900</pubDate>
    </item>
    <item>
      <title>[nRF5 + Zephyr] #14. Bluetooth 처음부터 시작하기!</title>
      <link>https://engschool.tistory.com/209</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;본격적으로 블루투스를 해볼건데&lt;br /&gt;블루투스 자체에 대한 건 사실 나도 잘 모르고,&lt;br /&gt;블루투스 스택을 따로 공부할 생각도 없어 ㅎㅎㅎ&lt;br /&gt;모든 걸 다 알고 시작할 수는 없잖아?&lt;br /&gt;예제 따라해보면서 배울수도 있고 말야. ㅋ&lt;br /&gt;암튼 바로 실전 ㄱㄱ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;라고 했지만...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;블로그에 쓸 자신이 없다..;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한단계 한단계 차근차근 글로 설명할 자신이 없다...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;br /&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 유튜브에 채널 만들고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난생 처음 동영상찍어서 올림 ㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.06.59.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJjFcb/btsjlELTlLp/fr5bcym1yg2E83WaKC958K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJjFcb/btsjlELTlLp/fr5bcym1yg2E83WaKC958K/img.png&quot; data-alt=&quot;유튜부에 채널 만듬 ㅋ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJjFcb/btsjlELTlLp/fr5bcym1yg2E83WaKC958K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJjFcb%2FbtsjlELTlLp%2Ffr5bcym1yg2E83WaKC958K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;422&quot; data-filename=&quot;스크린샷 2023-06-11 오후 5.06.59.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유튜부에 채널 만듬 ㅋ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유튜브로 봐~~ 안녕~~ ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/m2dqXqwFDfs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/m2dqXqwFDfs&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=m2dqXqwFDfs&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Xspdj/hySW1xOB2u/zFfjcokN4lMRmuJ9u1YRJK/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;BLE 처음부터 시작하기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/m2dqXqwFDfs&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;nrf5 ble 시작하기&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>ble 코드 분석</category>
      <category>blue tooth 시작하기</category>
      <category>bluetooth example</category>
      <category>nRF52832</category>
      <category>nrf5340</category>
      <category>VSCode</category>
      <category>Zephyr</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/209</guid>
      <comments>https://engschool.tistory.com/209#entry209comment</comments>
      <pubDate>Sun, 11 Jun 2023 17:15:50 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #13. Inter-task communication B</title>
      <link>https://engschool.tistory.com/208</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #11. Inter-task communication A&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883685658&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #11. Inter-task communication A&quot; data-og-description=&quot;제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;    우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이 &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/206&quot; data-og-url=&quot;https://engschool.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xtCaf/hySRRPIxC7/TuYwL9TQv0Xoqb0cjZDZw0/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/cvd3wU/hySR5HcnuV/clhCJYWK1XcQ77j3eYBf1k/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/bFlgG9/hySR3P998j/RPGMC5ZII1iHIKreI2fC50/img.png?width=1668&amp;amp;height=1178&amp;amp;face=0_0_1668_1178&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xtCaf/hySRRPIxC7/TuYwL9TQv0Xoqb0cjZDZw0/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/cvd3wU/hySR5HcnuV/clhCJYWK1XcQ77j3eYBf1k/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/bFlgG9/hySR3P998j/RPGMC5ZII1iHIKreI2fC50/img.png?width=1668&amp;amp;height=1178&amp;amp;face=0_0_1668_1178');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #11. Inter-task communication A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;    우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전에서 FIFO랑 Queue만 해봤는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 Message Queue랑, Mail box를 해볼거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 Message Queue부터 시작!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Message Queue의 기본적인 동작은 그냥 Queue와 다를 바 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;차이점은 Queue가 포인터만 전달했다면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Message Queue는 고정된 크기의 데이터를 전달한다는 거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바로 예제 ㄱㄱ&lt;/p&gt;
&lt;pre id=&quot;code_1685884993274&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

typedef struct  {
	uint8_t field1;
	uint8_t field2;
}msgq_data_t;

K_MSGQ_DEFINE(my_msgq, sizeof(msgq_data_t), 10, 4);

void my_entry_point(void *, void *, void *){
	int ret;
	msgq_data_t msgq_data;
	for(;;){
		k_sleep(K_MSEC(1000));
		ret = k_msgq_get(&amp;amp;my_msgq, &amp;amp;msgq_data, K_FOREVER);
		printk(&quot;data1: %d,data2: %d\n&quot;,msgq_data.field1, msgq_data.field2);
	}
}

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);

void main(void)
{
	msgq_data_t msgq_data;
	uint8_t data1 = 0,data2= 127;
	int ret;
	for(;;){
		msgq_data.field1 = data1++;
		msgq_data.field2 = data2++;
		k_sleep(K_MSEC(500));
		ret = k_msgq_put(&amp;amp;my_msgq, &amp;amp;msgq_data, K_NO_WAIT);
		if(ret){
			printk(&quot;msgq is full. Purge all messages.\n&quot;);
			k_msgq_purge(&amp;amp;my_msgq);
		} else {
			printk(&quot;Sucesefully queued: %d,%d\n&quot;,msgq_data.field1, msgq_data.field2);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;main에서 계속 500ms 단위로 message queue에  넣고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다른 쓰레드에서 1초 마다 읽어봐서 message queue에서 읽어오는 예제야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어오는 속도보다 넣는 속도가 더 빠르니 당연히 queue가 가득차서 못 넣겠지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그때 purge 시켜버렸어. queue를 다 비우는 거지 ㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-04 오후 10.34.49.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEB6o/btsivfZ5hx4/0lRdPBaKGnmqJR36adKiH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEB6o/btsivfZ5hx4/0lRdPBaKGnmqJR36adKiH0/img.png&quot; data-alt=&quot;큐가 가득 차면 purge 시킴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEB6o/btsivfZ5hx4/0lRdPBaKGnmqJR36adKiH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEB6o%2FbtsivfZ5hx4%2F0lRdPBaKGnmqJR36adKiH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;568&quot; data-filename=&quot;스크린샷 2023-06-04 오후 10.34.49.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;큐가 가득 차면 purge 시킴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 mail box?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;mailbox도 기본적으로 Queue!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 ISR(interrupt service routine)에서는 사용할 수 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 크기가 고정일 필요도 없고 타겟 thread를 지정할 수도 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;약간 진보된 Queue 느낌이랄까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바로 예제 고고&lt;/p&gt;
&lt;pre id=&quot;code_1685887210469&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

K_MBOX_DEFINE(my_mbox);//mail box 선언

void my_entry_point(void *, void *, void *){
	int ret;
	struct k_mbox_msg rx_msg;//rx_msg
	for(;;){
		rx_msg.rx_source_thread = K_ANY;//아무한테서나 받는다!
		k_mbox_get(&amp;amp;my_mbox, &amp;amp;rx_msg, NULL, K_FOREVER);//메일 올때까지 기다림!
		printk(&quot;Received message: %d\n&quot;, rx_msg.info);
	}
}

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);

void main(void)
{
	int ret;
	struct k_mbox_msg tx_msg;
	uint8_t info = 0;
	for(;;){
		tx_msg.info = info++;
		tx_msg.size = 0;
		tx_msg.tx_data = 0;
		tx_msg.tx_block.data = NULL;
		tx_msg.tx_target_thread = K_ANY;//아무나 받아라!
		k_mbox_put(&amp;amp;my_mbox,&amp;amp;tx_msg, K_FOREVER);//메일 받을때까지 기다림!
		k_sleep(K_MSEC(1000));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;첫번째 maibox 예제는 비어있는 메일을 보내는 거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 오직 k_mbox_msg 구조체 중에 info값만 의미가 있을거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이걸 보니 zephyr에 flag가 없는게 이해가 감. mailbox를 쓰면 됨!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 결과인데 info만 출력하도록 해놨어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-04 오후 11.04.12.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRRwVC/btsiuKswWag/cCC4SuYYsfR0qqsUhd803K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRRwVC/btsiuKswWag/cCC4SuYYsfR0qqsUhd803K/img.png&quot; data-alt=&quot;info 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRRwVC/btsiuKswWag/cCC4SuYYsfR0qqsUhd803K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRRwVC%2FbtsiuKswWag%2FcCC4SuYYsfR0qqsUhd803K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;562&quot; data-filename=&quot;스크린샷 2023-06-04 오후 11.04.12.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;info 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;info 말고 긴 데이터도 보내보자구.&lt;/p&gt;
&lt;pre id=&quot;code_1685888003967&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

K_MBOX_DEFINE(my_mbox);

void my_entry_point(void *, void *, void *){
	int ret;
	char buffer[100];// 100개 짜리 버퍼~
	struct k_mbox_msg rx_msg;
	for(;;){
		rx_msg.rx_source_thread = K_ANY;//아무한테서나 받아왔!
		rx_msg.size=100;
		k_mbox_get(&amp;amp;my_mbox, &amp;amp;rx_msg, buffer, K_FOREVER); // 메일 기다렷!
		printk(&quot;Received message: %s\n&quot;, buffer);//출력
	}
}

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);

void main(void)
{
	int ret;
	char buffer[100];
	int size;
	struct k_mbox_msg tx_msg;
	uint8_t info = 0;
	for(;;){
		size = sprintf(buffer, &quot;어머니는 짜장면이 싫다고 하셨어. 탕수육이 좋다고 하셨어~ 이야야~&quot;, NULL);
		tx_msg.info = info++;
		tx_msg.size = size;
		tx_msg.tx_data = buffer; //전송할 데이터
		tx_msg.tx_block.data = NULL;
		tx_msg.tx_target_thread = K_ANY;// 아무한테나 줘버렷!
		k_mbox_put(&amp;amp;my_mbox,&amp;amp;tx_msg, K_FOREVER); //받을 때까지 기다렷!
		k_sleep(K_MSEC(1000));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;char 100개짜리 버퍼를 만들고 임의의 데이터를 넣고 전송해봤어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;당연한 말이지만 잘 전송되고 잘 받아서 출력해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-04 오후 11.12.30.png&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAwCC/btsis0pmHDF/51fbaEaKu0HlR7OQdNhXG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAwCC/btsis0pmHDF/51fbaEaKu0HlR7OQdNhXG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAwCC/btsis0pmHDF/51fbaEaKu0HlR7OQdNhXG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAwCC%2Fbtsis0pmHDF%2F51fbaEaKu0HlR7OQdNhXG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2668&quot; height=&quot;1190&quot; data-filename=&quot;스크린샷 2023-06-04 오후 11.12.30.png&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인코딩 문제인지 vscode 터미널에서는 한글이 조금씩 깨져서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;nRF connect 프로그램으로 터미널 실행했음.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 아주 큰 block 데이터를 전송하는 기능이 있는데 음...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;딱히 두 번째 예제와 다를 바가 없을 듯. 그래서 과감하게 생략!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해보고 싶은 사람들은 아래 링크를 참고하도록!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685888405327&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mailboxes &amp;mdash; Zephyr Project Documentation&quot; data-og-description=&quot;A thread receives a message by first creating a message descriptor that characterizes the message it wants to receive. It then calls one of the mailbox receive APIs. The mailbox searches its send queue and takes the message from the first compatible thread&quot; data-og-host=&quot;docs.zephyrproject.org&quot; data-og-source-url=&quot;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&quot; data-og-url=&quot;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.zephyrproject.org/3.1.0/kernel/services/data_passing/mailboxes.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mailboxes &amp;mdash; Zephyr Project Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A thread receives a message by first creating a message descriptor that characterizes the message it wants to receive. It then calls one of the mailbox receive APIs. The mailbox searches its send queue and takes the message from the first compatible thread&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.zephyrproject.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;mailbox는 타겟을 지정할 수 있다는 점에서 실제 프로젝트에서 꽤 유용할 듯 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물론 mailbox를 쓸 수 있을 만큼 thread 갯수가 많아야 겠지만 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원래는 pipe도 같이 해보려고 했는데;;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너무 글이 길어져서 pipe는 다음 시간에!! ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>K_MBOX_DEFINE</category>
      <category>K_MSGQ_DEFINE</category>
      <category>Mailbox</category>
      <category>message queue</category>
      <category>nrf52840</category>
      <category>nrf5340</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/208</guid>
      <comments>https://engschool.tistory.com/208#entry208comment</comments>
      <pubDate>Sun, 4 Jun 2023 23:22:47 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #12. Synchronization</title>
      <link>https://engschool.tistory.com/207</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Synchronization에 대해서는 Semaphore와 Mutex, 이 두 개만 알면 끝!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Semaphore부터 보자구.&lt;/p&gt;
&lt;pre id=&quot;code_1685768021495&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//런타임에서는 이렇게
struct k_sem my_sem;
k_sem_init(&amp;amp;my_sem, 0, 1);

//컴파일타임에서는 이렇게
K_SEM_DEFINE(my_sem, 0, 1);//가용 세마포어 1, 초기 가용 세마포어 0

//or
K_SEM_DEFINE(my_sem, 1, 1);//가용 세마포어 1, 초기 가용 세마포어 1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;  위처럼 선언하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;  아래처럼 사용하지.&lt;/p&gt;
&lt;pre id=&quot;code_1685768567451&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Semaphore take
k_sem_take(&amp;amp;my_sem, K_MSEC(50))

//Semaphore give
k_sem_give(&amp;amp;my_sem);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;약간 설명하자면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가용한 세마포어가 있으면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_sem_take로 세마포어를 차지하고 사용이 끝나면&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_sem_give로 돌려주는 거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실습은 조금 있다가 하고 mutex로 넘어가면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685769456556&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//런타임에서 이렇게
struct k_mutex my_mutex;
k_mutex_init(&amp;amp;my_mutex);

//컴파일타임에서는 이렇게
K_MUTEX_DEFINE(my_mutex);

//사용은 이렇게
//mutex lock
k_mutex_lock(&amp;amp;my_mutex, K_FOREVER);

//mutex unlock
k_mutex_unlock(&amp;amp;my_mutex);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용법은 세마포어와 거의 비슷하지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뮤택스는 가용 공간이 1개인 세마포어와 동작이 동일해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어때?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런걸 쓸까 싶어? ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;응!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;응응응응응응응응응!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Thread나 Task를 사용하는 RTOS에서는 필수적인 개념이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 여러 Thread에서 동일한 자원에 접근이 가능할 수 있기 때문이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 억지로 예제를 만들어 볼게 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실습을 해봐야 좋겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;BLE advertisement 하는 부분에서 한번 살펴볼게.&lt;/p&gt;
&lt;pre id=&quot;code_1685771001132&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//prj.conf
CONFIG_HEAP_MEM_POOL_SIZE=1024
CONFIG_BT=y
CONFIG_BT_HCI=y

CONFIG_LOG=y
CONFIG_LOG_BACKEND_UART=y&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 ble 사용 설정을 하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결과가 잘 보이게 logging system도 넣어두고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시작!&lt;/p&gt;
&lt;pre id=&quot;code_1685770921571&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;

#include &amp;lt;zephyr/bluetooth/bluetooth.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/conn.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/hci.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/uuid.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/gatt.h&amp;gt;

LOG_MODULE_REGISTER(main);

#define BT_UUID_REMOTE_SERVICE_VAL BT_UUID_128_ENCODE(0xc99d5788,0xf6dc,0x11ed,0xb67e,0x0242ac120002)
//c99d5788-f6dc-11ed-b67e-0242ac120002
#define BT_UUID_REMOTE_SERVICE BT_UUID_DECLARE_128(BT_UUID_REMOTE_SERVICE_VAL)

static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
	BT_DATA(BT_DATA_NAME_COMPLETE, &quot;PETERCIRCUITSOFT&quot;, sizeof(&quot;PETERCIRCUITSOFT&quot;) - 1),
};

static const struct bt_data sd[] = {
	BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_REMOTE_SERVICE_VAL),
};

bt_ready_cb_t bt_ready_cb(int err)
{
	if (err) {
		LOG_ERR(&quot;Bluetooth init failed (err %d)\n&quot;, err);
		return;
	}
	LOG_INF(&quot;Bluetooth enabled\n&quot;);
}

void main(void)
{
	int err;
	LOG_INF(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	bt_enable(bt_ready_cb);
	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd));
	if(err){
		LOG_ERR(&quot;Advertising failed to start (err %d)\n&quot;, err);
		return;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 결과가  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-03 오후 2.51.29.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brC7rO/btsiwjUPj9y/CdkKwQzyXLE4jkaTmlZMy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brC7rO/btsiwjUPj9y/CdkKwQzyXLE4jkaTmlZMy1/img.png&quot; data-alt=&quot;Advertising failed&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brC7rO/btsiwjUPj9y/CdkKwQzyXLE4jkaTmlZMy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrC7rO%2FbtsiwjUPj9y%2FCdkKwQzyXLE4jkaTmlZMy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2023-06-03 오후 2.51.29.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Advertising failed&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;advertising failed!!!!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로그를 잘 살펴보면 bluetooth가 enable되기도 전에 advertising이 시작되고 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 오류가 발생하는 거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이럴 때 semaphore를 사용하는 거야.&lt;/p&gt;
&lt;pre id=&quot;code_1685771742408&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;

#include &amp;lt;zephyr/bluetooth/bluetooth.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/conn.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/hci.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/uuid.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/gatt.h&amp;gt;

LOG_MODULE_REGISTER(main);

#define BT_UUID_REMOTE_SERVICE_VAL BT_UUID_128_ENCODE(0xc99d5788,0xf6dc,0x11ed,0xb67e,0x0242ac120002)
//c99d5788-f6dc-11ed-b67e-0242ac120002
#define BT_UUID_REMOTE_SERVICE BT_UUID_DECLARE_128(BT_UUID_REMOTE_SERVICE_VAL)

static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
	BT_DATA(BT_DATA_NAME_COMPLETE, &quot;PETERCIRCUITSOFT&quot;, sizeof(&quot;PETERCIRCUITSOFT&quot;) - 1),
};

static const struct bt_data sd[] = {
	BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_REMOTE_SERVICE_VAL),
};

//여기 추가!!!
K_SEM_DEFINE(sem, 0, 1);

bt_ready_cb_t bt_ready_cb(int err)
{
	if (err) {
		LOG_ERR(&quot;Bluetooth init failed (err %d)\n&quot;, err);
		return;
	}
	LOG_INF(&quot;Bluetooth enabled\n&quot;);
    //여기 추가!!!
	k_sem_give(&amp;amp;sem);
}

void main(void)
{
	int err;
	LOG_INF(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	bt_enable(bt_ready_cb);
    //여기 추가!!!
	k_sem_take(&amp;amp;sem, K_FOREVER);
	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd));
	if(err){
		LOG_ERR(&quot;Advertising failed to start (err %d)\n&quot;, err);
		return;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 세마포어 선언하고!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;bt_enable을 실행하고 k_sem_take로 세마포어에 공간이 생기기를 기다리지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;bt_enable이 끝나고 bt_ready_cb가 수행되면 그 때 k_sem_give가 실행되서 세마포어에 공간을 주게 됨.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 k_sem_take에서 대기하고 있던 스레드가 무사히?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세마포어 공간을 차지하고 넘어가서 Ble advertisement를 수행할 수 있게되지!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/10h4v/btsiyWkMCwv/xh1FDLPm3MYDesCzpf3EV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/10h4v/btsiyWkMCwv/xh1FDLPm3MYDesCzpf3EV0/img.png&quot; data-alt=&quot;정상적으로 동작한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/10h4v/btsiyWkMCwv/xh1FDLPm3MYDesCzpf3EV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F10h4v%2FbtsiyWkMCwv%2Fxh1FDLPm3MYDesCzpf3EV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;200&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적으로 동작한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;mutex도 동작 방식이 세마포어와 거의 비슷한데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 스레드 안에서는 lock을 여러번 할 수 있어서 위 예제처럼 사용은 안돼.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 자원(예를 들면 SPI, UART)에 여러 쓰레드에서 접근하는 걸 상정하고 있기 때문이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 억지로 예제를 만들어보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685776142221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;

LOG_MODULE_REGISTER(main);

K_MUTEX_DEFINE(my_mutex);

void my_thread_entry_point(void *p1, void *p2, void *p3);

K_THREAD_DEFINE(my_thread, 1024, my_thread_entry_point, NULL, NULL, NULL, 7, 0, 0);

void my_thread_entry_point(void *p1, void *p2, void *p3)
{
	while(1){
		k_mutex_lock(&amp;amp;my_mutex, K_FOREVER);
		printk(&quot;my_thread is running!\n&quot;);
		k_msleep(100);
		printk(&quot;my_thread is running!\n&quot;);
		k_msleep(100);
		printk(&quot;my_thread is running!\n&quot;);
		k_msleep(100);
		k_mutex_unlock(&amp;amp;my_mutex);
	}
}

void main(void)
{
	for(;;){
		k_mutex_lock(&amp;amp;my_mutex, K_FOREVER);
		printk(&quot;main thread is running!\n&quot;);
		k_msleep(100);
		printk(&quot;main thread is running!\n&quot;);
		k_msleep(100);
		printk(&quot;main thread is running!\n&quot;);
		k_msleep(100);
		k_mutex_unlock(&amp;amp;my_mutex);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 mutex를 설정하면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 한 쓰레드에서 printk를 전부 하고 난 후에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다른 쓰레드에서 printk를 수행하지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-03 오후 4.10.30.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OLrTb/btsiuCgl8gp/Yea9gDLgKCpbDe93q074i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OLrTb/btsiuCgl8gp/Yea9gDLgKCpbDe93q074i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OLrTb/btsiuCgl8gp/Yea9gDLgKCpbDe93q074i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOLrTb%2FbtsiuCgl8gp%2FYea9gDLgKCpbDe93q074i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;794&quot; data-filename=&quot;스크린샷 2023-06-03 오후 4.10.30.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 만약 mutex를 없애면 어떻게 될까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전부 주석처리해놓고 테스트 해바바 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 쓰레드가 쉬는 틈을 다른 쓰레드가 치고 들어가서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자기 걸 수행해버리고 말지.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-03 오후 4.07.23.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLx2Ex/btsisRMEGMB/omPdddjNZUYkajblweeSHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLx2Ex/btsisRMEGMB/omPdddjNZUYkajblweeSHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLx2Ex/btsisRMEGMB/omPdddjNZUYkajblweeSHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLx2Ex%2FbtsisRMEGMB%2FomPdddjNZUYkajblweeSHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;752&quot; data-filename=&quot;스크린샷 2023-06-03 오후 4.07.23.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이건 단순하게 printk니까 큰 문제가 없지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;SPI나 I2C처럼 여러 디바이스가 버스로 묶여있는 하드웨어에서는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;치명적인 오류가 발생할 수 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세마포어와 뮤텍스는 필수!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 시간부터는 본격적 nRF로 BLE를 구동시켜 볼거야!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>Mutex</category>
      <category>Semaphore</category>
      <category>Zephyr</category>
      <category>뮤택스</category>
      <category>세마포어</category>
      <category>제퍼</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/207</guid>
      <comments>https://engschool.tistory.com/207#entry207comment</comments>
      <pubDate>Sat, 3 Jun 2023 16:15:58 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #11. Inter-task communication A</title>
      <link>https://engschool.tistory.com/206</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼의 경우에는 Inter-thread communication이 되겠구만!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지원되는 기능을 살펴보니....&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너무 많아;;; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crl3dC/btsitzYPV5Y/vAvjTkS6dgaWKrq9LBU7Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crl3dC/btsitzYPV5Y/vAvjTkS6dgaWKrq9LBU7Z0/img.png&quot; data-alt=&quot;지원되는 inter-thread communication 기능이 너무 많다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crl3dC/btsitzYPV5Y/vAvjTkS6dgaWKrq9LBU7Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrl3dC%2FbtsitzYPV5Y%2FvAvjTkS6dgaWKrq9LBU7Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;1178&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지원되는 inter-thread communication 기능이 너무 많다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우린 너무 많은 거 안좋아 하니까 줄여보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;난 보통 다른 RTOS에서는 Flag와 Queue를 많이 사용했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 제퍼에는 Flag가 없네? 진짜 없는 건가? ;;; 간편하게 사용하기 좋았는데 ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Queue는 당연히 있는데... FIFO가 Queue 아닌가?;;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;LIFO가 Stack이고?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Pipe는 freertos에서 stream같고 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주절 주절 말이 많았는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Stack은 잘 안쓰니까 우선 Queue부터 해보자구&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685760382262&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

K_QUEUE_DEFINE(my_queue);

typedef struct queueItem{
	uint8_t itemName[10];
	uint8_t data;		
}queueItem_t;

//declaration
void queue_thread_entry(void *p1, void *p2, void *p3);

K_THREAD_DEFINE(queue_thread, 512, queue_thread_entry, NULL, NULL, NULL,
		5, 0, 0);

void queue_thread_entry(void *p1, void *p2, void *p3){
	static uint8_t itemNumber = 0;
	for(;;){
		queueItem_t *queueItem = k_malloc(sizeof(queueItem_t));
		sprintf(queueItem-&amp;gt;itemName, &quot;item_%d\0&quot;, itemNumber++);
		queueItem-&amp;gt;data = itemNumber;
		k_queue_append(&amp;amp;my_queue, queueItem);
		k_msleep(1000);
	}
}

void main(void)
{
	queueItem_t *queueItem;
	printk(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	for(;;){
		queueItem = k_queue_get(&amp;amp;my_queue,	K_FOREVER);
		printk(&quot;%s, %d\n&quot;, queueItem-&amp;gt;itemName, queueItem-&amp;gt;data);
		k_free(queueItem);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예제가 아~~주 약간 긴데 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;별거 아니니까 얼른 보자  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;queue_thread에서 main thread로 데이터를 전송하는 예제야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. 우선 K_QUEUE_DEFINE으로 Queue 선언하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. queue_thread에서 전송할 데이터 malloc한 후 전송&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. main thread에서 k_queue_get으로 데이터 수신&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. printk!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;끝!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엄청 간단하지?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-03 오전 11.52.50.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FrBcG/btsit0uWY9m/5NKkEaRGgpRyKoMKfj5051/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FrBcG/btsit0uWY9m/5NKkEaRGgpRyKoMKfj5051/img.png&quot; data-alt=&quot;queue example 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FrBcG/btsit0uWY9m/5NKkEaRGgpRyKoMKfj5051/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFrBcG%2Fbtsit0uWY9m%2F5NKkEaRGgpRyKoMKfj5051%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;506&quot; data-filename=&quot;스크린샷 2023-06-03 오전 11.52.50.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;queue example 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 멈추지 말고 바로 FIFO 갑니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코드를 보면 알겠지만 FIFO 사용법이 민망할 정도로 QUEUE와 똑같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685761148247&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

K_FIFO_DEFINE(my_fifo);

typedef struct fifoItem{
	uint8_t itemName[20];
	uint8_t data;		
}fifoItem_t;

//declaration
void queue_thread_entry(void *p1, void *p2, void *p3);

K_THREAD_DEFINE(fifo_thread, 512, queue_thread_entry, NULL, NULL, NULL,
		5, 0, 0);

void queue_thread_entry(void *p1, void *p2, void *p3){
	static uint8_t itemNumber = 0;
	for(;;){
		fifoItem_t *fifoItem = $k_malloc(sizeof(fifoItem_t));
		sprintf(fifoItem-&amp;gt;itemName, &quot;fifo item_%d\0&quot;, itemNumber++);
		fifoItem-&amp;gt;data = itemNumber;
		printk(&quot;FIFO put\n&quot;);
		k_fifo_put(&amp;amp;my_fifo, fifoItem);
		k_msleep(1000);
	}
}

void main(void)
{
	fifoItem_t *fifoItem;
	printk(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	for(;;){
		fifoItem = k_fifo_get(&amp;amp;my_fifo,K_FOREVER);
		printk(&quot;Fifo received: %s, %d\n&quot;, fifoItem-&amp;gt;itemName, fifoItem-&amp;gt;data);
		k_free(fifoItem);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;함수 이름이 조금 다를 뿐이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;당연히 결과도 잘 나오고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-03 오후 12.02.12.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bObez0/btsitSYbOle/vDOjMsIyDGLOtZC18mR11K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bObez0/btsitSYbOle/vDOjMsIyDGLOtZC18mR11K/img.png&quot; data-alt=&quot;FIFO와 Queue는 거의 같다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bObez0/btsitSYbOle/vDOjMsIyDGLOtZC18mR11K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbObez0%2FbtsitSYbOle%2FvDOjMsIyDGLOtZC18mR11K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;488&quot; data-filename=&quot;스크린샷 2023-06-03 오후 12.02.12.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FIFO와 Queue는 거의 같다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;음.. 그런데 공식 문서를 보니 이런 내용이 있네?&lt;/p&gt;
&lt;pre id=&quot;code_1685762610131&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct data_item_t {
    void *fifo_reserved;   /* 1st word reserved for use by FIFO */
    ...
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전송할 데이터의 첫번째 워드는 FIFO가 사용하게 되어 있네?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;-_- 왜 잘 동작했지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 따를 건 따라야지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685762722744&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef struct fifoItem{
	void *reserved;
	uint8_t itemName[20];
	uint8_t data;		
}fifoItem_t;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 해도 동작에는 별 차이가 없는 듯.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;LIFO나 STACK도 사용법은 거의 비슷하니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;관심 있는 사람들은 따로 해보면 될 것 같고 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(사실 난 거의 쓸일이 없었어.)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;글이 너무 길어지니까 다음글에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Message Queue랑 Mail box 그리고 Pipe를 다뤄보도록 하지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/208&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.04 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #13. Inter-task communication B&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685888749435&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #13. Inter-task communication B&quot; data-og-description=&quot;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #11. Inter-task communication A [nRF52840 + Zephyr] #11. Inter-task communication A 제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/208&quot; data-og-url=&quot;https://engschool.tistory.com/208&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buPxFu/hySR5mXMC2/2iUHB6MOhl0kYz0uvjLfM0/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bkhkkJ/hySRTGQc7z/hcmtpcZGESJV5LOjvWjVJK/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/dvTnto/hySRTtlzrA/N4KJTF3bf3ikUcBvSSE3C0/img.png?width=2668&amp;amp;height=1190&amp;amp;face=0_0_2668_1190&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/208&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/208&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buPxFu/hySR5mXMC2/2iUHB6MOhl0kYz0uvjLfM0/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bkhkkJ/hySRTGQc7z/hcmtpcZGESJV5LOjvWjVJK/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/dvTnto/hySRTtlzrA/N4KJTF3bf3ikUcBvSSE3C0/img.png?width=2668&amp;amp;height=1190&amp;amp;face=0_0_2668_1190');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #13. Inter-task communication B&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #11. Inter-task communication A [nRF52840 + Zephyr] #11. Inter-task communication A 제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다시 말하지만 inter-thread comminication은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;rtos에서 매우 핵심적인 기능이라 할 수 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;꼭 숙지! 공부! 하자고!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #12. Synchronization&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883523422&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #12. Synchronization&quot; data-og-description=&quot;Synchronization에 대해서는 Semaphore와 Mutex, 이 두 개만 알면 끝!   Semaphore부터 보자구. //런타임에서는 이렇게 struct k_sem my_sem; k_sem_init(&amp;amp;my_sem, 0, 1); //컴파일타임에서는 이렇게 K_SEM_DEFINE(my_s&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/207&quot; data-og-url=&quot;https://engschool.tistory.com/207&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dFAy4M/hySR33Gl6g/sbHBWGUqap3rBHeW5yDZSK/img.png?width=800&amp;amp;height=179&amp;amp;face=0_0_800_179,https://scrap.kakaocdn.net/dn/bmXgl9/hySR4VP7Sf/KmHwknaEtkwBvxlOplNqzK/img.png?width=800&amp;amp;height=179&amp;amp;face=0_0_800_179,https://scrap.kakaocdn.net/dn/bEartU/hySRZtr3R4/KqYtuALeh3zVOkDKPPJKBk/img.png?width=1046&amp;amp;height=794&amp;amp;face=0_0_1046_794&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/207&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dFAy4M/hySR33Gl6g/sbHBWGUqap3rBHeW5yDZSK/img.png?width=800&amp;amp;height=179&amp;amp;face=0_0_800_179,https://scrap.kakaocdn.net/dn/bmXgl9/hySR4VP7Sf/KmHwknaEtkwBvxlOplNqzK/img.png?width=800&amp;amp;height=179&amp;amp;face=0_0_800_179,https://scrap.kakaocdn.net/dn/bEartU/hySRZtr3R4/KqYtuALeh3zVOkDKPPJKBk/img.png?width=1046&amp;amp;height=794&amp;amp;face=0_0_1046_794');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #12. Synchronization&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Synchronization에 대해서는 Semaphore와 Mutex, 이 두 개만 알면 끝!   Semaphore부터 보자구. //런타임에서는 이렇게 struct k_sem my_sem; k_sem_init(&amp;amp;my_sem, 0, 1); //컴파일타임에서는 이렇게 K_SEM_DEFINE(my_s&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>FIFO</category>
      <category>K_FIFO_DEFINE</category>
      <category>K_QUEUE_DEFINE</category>
      <category>queue</category>
      <category>zephyr inter-thread communication</category>
      <category>제퍼</category>
      <category>큐</category>
      <category>피포</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/206</guid>
      <comments>https://engschool.tistory.com/206#entry206comment</comments>
      <pubDate>Sat, 3 Jun 2023 12:34:54 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #10. Time management</title>
      <link>https://engschool.tistory.com/205</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼도 다른 os와 마찬가지로 여러가지 시간관련 기능을 제공하고 있어.&lt;br /&gt;대표적인게 os timer야.&lt;br /&gt;임베디드 프로젝트를 하다보면 타이머를 자주 사용하게 되는데.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;타이머를 하드웨어로 돌리려면 하드웨어 사용 설정하고, 주기 설정하고, 인터럽트 작성해주고, 혹시나 동작이 길면 global flag 설정해주고 인터럽트 외주에서 나머지 동작을 처리해야 하지. ㅋㅋㅋ&lt;br /&gt; &lt;br /&gt;데이터시트도 읽어야 하는 건 덤이고 말이야 ㅋ&lt;br /&gt;&lt;br /&gt;아주 그냥 대환장 파티.&lt;br /&gt;그에 비해 os timer는 사용 설정하고 쓰면 끝이야.&lt;br /&gt;매우 간편!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685709108664&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct k_timer my_timer;
extern void my_expiry_function(struct k_timer *timer_id);

k_timer_init(&amp;amp;my_timer, my_expiry_function, NULL);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아니면 아래처럼 관련 매크로를 사용해서 컴파일타임에서 선언할 수도 있지.&lt;/p&gt;
&lt;pre id=&quot;code_1685709242709&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;K_TIMER_DEFINE(my_timer, my_expiry_function, NULL);
//K_TIMER_DEFINE(타이머 이름, 타이머 만료 콜백, 타이머 중지 콜백);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 사용은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;pre id=&quot;code_1685753179421&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k_timer_start(&amp;amp;my_timer, K_SECONDS(1), K_SECONDS(1));//1초 후 만료되는 타이머를 1초 주기로 반복
//or
k_timer_start(&amp;amp;my_timer, K_MSEC(100), K_NO_WAIT);// 100ms(0.1초) 후 타이머 만료.
//or
k_timer_start(&amp;amp;my_timer, K_MSEC(100), K_SECONDS(1));//100ms(0.1초)후 만료되는 타이머를 1초 주기로 반복&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정해진 시간이 끝나면 등록해 두었던 my_expiry_function이 수행되지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정말 간단하게 타이머를 사용할 수가 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;역시나 억지로 예제를 만들어보자구&lt;/p&gt;
&lt;pre id=&quot;code_1685754050395&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;

//declaration
void my_expiry_function(struct k_timer *timer_id);

K_TIMER_DEFINE(my_timer,my_expiry_function,NULL);

//implementation
void my_expiry_function(struct k_timer *timer_id){
	printk(&quot;Timer expired\n&quot;);
}

void main(void)
{
	printk(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	k_timer_start(&amp;amp;my_timer, K_MSEC(1000), K_MSEC(1000));
    return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음에 timer를 선언했고 expiry_function도 등록했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 main 함수에서 timer를 시작하고 return!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;말 그대로 main함수를 종료시켜버린거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도? 타이머는 아주 자알~~ 돈다~&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QEEOl/btsiswaI1iR/oklDjKTUk2dJablVvVrQqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QEEOl/btsiswaI1iR/oklDjKTUk2dJablVvVrQqK/img.png&quot; data-alt=&quot;Timer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QEEOl/btsiswaI1iR/oklDjKTUk2dJablVvVrQqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQEEOl%2FbtsiswaI1iR%2FoklDjKTUk2dJablVvVrQqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;514&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Timer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;타이머 선언할 때 콜백이 하나 더 있었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;타이머 중지 콜백인데.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이건 타이머가 수행중에 사용자에 의해 중지되면 동작하는 콜백이야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이것도 예제를 살펴보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685754639467&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;

//declaration
void my_expiry_function(struct k_timer *timer_id);
void my_timer_stop_function(struct k_timer *timer_id);

//타이머 만료 콜백 함수와 타이머 중지 콜백 함수를 등록
K_TIMER_DEFINE(my_timer,my_expiry_function,my_timer_stop_function);

//implementation
void my_expiry_function(struct k_timer *timer_id){
	printk(&quot;Timer expired\n&quot;);
}

void my_timer_stop_function(struct k_timer *timer_id){
	printk(&quot;Timer stopped\n&quot;);
}

void main(void)
{
	printk(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	k_timer_start(&amp;amp;my_timer, K_MSEC(1000), K_MSEC(1000));
	k_sleep(K_SECONDS(2.5));
	printk(&quot;Timer will be stopped: %d\n&quot;,k_timer_remaining_get(&amp;amp;my_timer));
	k_timer_stop(&amp;amp;my_timer);
	return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;my_timer_stop_function이라는 콜백 함수를 작성하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그걸 K_TIMER_DEFINE 매크로에 등록했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 메인문에서 1초 반복 타이머를 시작하고 2.5초 뒤에 중지시켰어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 500ms 정도 타이머가 진행된 상태에서 타이머 중지 콜백이 호출될거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkYls/btsiswIyNX0/mQ7yDGfps459hkafZsb6J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkYls/btsiswIyNX0/mQ7yDGfps459hkafZsb6J0/img.png&quot; data-alt=&quot;타이머 중지 콜백도 잘 동작한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkYls/btsiswIyNX0/mQ7yDGfps459hkafZsb6J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkYls%2FbtsiswIyNX0%2FmQ7yDGfps459hkafZsb6J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;298&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;타이머 중지 콜백도 잘 동작한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; 이렇게 편하게 타이머를 쓸 수 있다니 ㅎㅎ 너무 좋아~으흐흐흐&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 가지만 더 해볼 게 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_timer_status_sync()라는 함수야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 함수는 타이머가 만료되어 콜백이 수행되기 전까지 thread가 멈춰있게 해.&lt;/p&gt;
&lt;pre id=&quot;code_1685755454530&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(void)
{
	printk(&quot;Hello World! %s\n&quot;, CONFIG_BOARD);
	k_timer_start(&amp;amp;my_timer, K_MSEC(1000), K_MSEC(1000));
	for(;;){
		k_timer_status_sync(&amp;amp;my_timer);
		printk(&quot;After timer expired.\n&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런식으로 thread가 timer expiry callback에 의존하게 할 수 있지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;역시나? 자알~~ 동작한다~&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo4KdH/btsiswaJDU7/Wka8ZpuFik8NfgYut1f0yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo4KdH/btsiswaJDU7/Wka8ZpuFik8NfgYut1f0yK/img.png&quot; data-alt=&quot;k_timer_status_sync() 동작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo4KdH/btsiswaJDU7/Wka8ZpuFik8NfgYut1f0yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo4KdH%2FbtsiswaJDU7%2FWka8ZpuFik8NfgYut1f0yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;540&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;k_timer_status_sync() 동작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;별거 아닌거 같아도 내가 원할 때 딱딱 쓰려면 많이 익숙해져야 해 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러니까 비슷한 예제 10번 정도는 반복해서 돌려보자 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래봐야 30분 안걸려!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #11. Inter-task communication A&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883485691&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #11. Inter-task communication A&quot; data-og-description=&quot;제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;    우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이 &quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/206&quot; data-og-url=&quot;https://engschool.tistory.com/206&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xtCaf/hySRRPIxC7/TuYwL9TQv0Xoqb0cjZDZw0/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/cvd3wU/hySR5HcnuV/clhCJYWK1XcQ77j3eYBf1k/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/bFlgG9/hySR3P998j/RPGMC5ZII1iHIKreI2fC50/img.png?width=1668&amp;amp;height=1178&amp;amp;face=0_0_1668_1178&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/206&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xtCaf/hySRRPIxC7/TuYwL9TQv0Xoqb0cjZDZw0/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/cvd3wU/hySR5HcnuV/clhCJYWK1XcQ77j3eYBf1k/img.png?width=800&amp;amp;height=564&amp;amp;face=0_0_800_564,https://scrap.kakaocdn.net/dn/bFlgG9/hySR3P998j/RPGMC5ZII1iHIKreI2fC50/img.png?width=1668&amp;amp;height=1178&amp;amp;face=0_0_1668_1178');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #11. Inter-task communication A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;    우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>k_timer callback</category>
      <category>k_timer expiry function</category>
      <category>k_timer stop callback</category>
      <category>K_TIMER_DEFINE</category>
      <category>k_timer_start</category>
      <category>k_timer_status_sync</category>
      <category>zephyr timer</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/205</guid>
      <comments>https://engschool.tistory.com/205#entry205comment</comments>
      <pubDate>Sat, 3 Jun 2023 10:38:12 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #9. Memory Management</title>
      <link>https://engschool.tistory.com/204</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼에서 제공하는 Memory management 기능은 여러 가지가 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_malloc()과 k_free() 정도만 알면 될 것 같아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 나머지는 어디서 어떻게 사용되는지 잘 모르겠거든 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;누가 잘 아는 사람은 알려주고 ㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u8nR3/btsivgXUTXi/JtYlGUTDDG80Y5OzR5LKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u8nR3/btsivgXUTXi/JtYlGUTDDG80Y5OzR5LKXK/img.png&quot; data-alt=&quot;제퍼에서 제공하는 Memory management 기능들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u8nR3/btsivgXUTXi/JtYlGUTDDG80Y5OzR5LKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu8nR3%2FbtsivgXUTXi%2FJtYlGUTDDG80Y5OzR5LKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;464&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제퍼에서 제공하는 Memory management 기능들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_malloc()과 k_free()는 특별한 사용법이 없어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;malloc, free랑 동일하거든.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 prj.conf 에서 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CONFIG_HEAP_MEM_POOL_SIZE(힙 크기) 만 설정해주면 끝이야.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;굳이 이상한 예제를 만들어보자면&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685708249318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//prj.conf
CONFIG_HEAP_MEM_POOL_SIZE=1024


//main.c
void main(void)
{
	for(;;){
		k_sleep(K_MSEC(1000));
		uint8_t* ptr = k_malloc(100);
		if(ptr){
			printk(&quot;Memory Allocated: %x\n&quot;,ptr);
			sprintf(ptr,&quot;Hello World&quot;);
			printk(&quot;%s\n&quot;,ptr);
			k_free(ptr);
		} else {
			printk(&quot;Memory Not Allocated: %x\n&quot;,ptr);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1초 마다 memory 할당하고 sprintf로 문자열 삽입하고 printk로 출력했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐... 당연하게 잘 동작하겠지? ㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfZgN/btsisPOb7YD/sLxpvguTYxmvo1e2rGc111/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfZgN/btsisPOb7YD/sLxpvguTYxmvo1e2rGc111/img.png&quot; data-alt=&quot;당연히 잘 동작한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfZgN/btsisPOb7YD/sLxpvguTYxmvo1e2rGc111/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpfZgN%2FbtsisPOb7YD%2FsLxpvguTYxmvo1e2rGc111%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;370&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;당연히 잘 동작한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 설정한 힙 크기(1024)보다 더 크게 malloc해보자구.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685708561318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//prj.conf
CONFIG_HEAP_MEM_POOL_SIZE=1024


//main.c
void main(void)
{
	for(;;){
		k_sleep(K_MSEC(1000));
		uint8_t* ptr = k_malloc(1025);
		if(ptr){
			printk(&quot;Memory Allocated: %x\n&quot;,ptr);
			sprintf(ptr,&quot;Hello World&quot;);
			printk(&quot;%s\n&quot;,ptr);
			k_free(ptr);
		} else {
			printk(&quot;Memory Not Allocated: %x\n&quot;,ptr);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 당연히? ㅎㅎ 실패하겠지!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IlNG7/btsit0VK4J3/s8IrYtxkg6fvBq7l5xrQ21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IlNG7/btsit0VK4J3/s8IrYtxkg6fvBq7l5xrQ21/img.png&quot; data-alt=&quot;메모리 할당 실패!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IlNG7/btsit0VK4J3/s8IrYtxkg6fvBq7l5xrQ21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIlNG7%2Fbtsit0VK4J3%2Fs8IrYtxkg6fvBq7l5xrQ21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;359&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리 할당 실패!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 이런식으로 각 thread가 메모리를 &quot;동적 할당&quot;할 수 있는거지 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오랜만에 써보네 ㅋㅋ 동적 할당이라는 말을 ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;Dynamic allocation!!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://engschool.tistory.com/205&quot;&gt;2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #10. Time management&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883449247&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #10. Time management&quot; data-og-description=&quot;제퍼도 다른 os와 마찬가지로 여러가지 시간관련 기능을 제공하고 있어. 대표적인게 os timer야. 임베디드 프로젝트를 하다보면 타이머를 자주 사용하게 되는데. 타이머를 하드웨어로 돌리려면 하&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/205&quot; data-og-url=&quot;https://engschool.tistory.com/205&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WMsf7/hySRZmF2xr/D3AYlHEY01pzexLKCL5yX0/img.png?width=800&amp;amp;height=249&amp;amp;face=0_0_800_249,https://scrap.kakaocdn.net/dn/crmp3h/hySRWwJuW9/gG3DSyskR3lbCheO0Zokck/img.png?width=800&amp;amp;height=249&amp;amp;face=0_0_800_249,https://scrap.kakaocdn.net/dn/bbvZWt/hySRVEChQr/4dNSm0UOnHkLhmBlcxpkLK/img.png?width=944&amp;amp;height=540&amp;amp;face=0_0_944_540&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/205&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/205&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WMsf7/hySRZmF2xr/D3AYlHEY01pzexLKCL5yX0/img.png?width=800&amp;amp;height=249&amp;amp;face=0_0_800_249,https://scrap.kakaocdn.net/dn/crmp3h/hySRWwJuW9/gG3DSyskR3lbCheO0Zokck/img.png?width=800&amp;amp;height=249&amp;amp;face=0_0_800_249,https://scrap.kakaocdn.net/dn/bbvZWt/hySRVEChQr/4dNSm0UOnHkLhmBlcxpkLK/img.png?width=944&amp;amp;height=540&amp;amp;face=0_0_944_540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #10. Time management&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제퍼도 다른 os와 마찬가지로 여러가지 시간관련 기능을 제공하고 있어. 대표적인게 os timer야. 임베디드 프로젝트를 하다보면 타이머를 자주 사용하게 되는데. 타이머를 하드웨어로 돌리려면 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>dynamic allocation</category>
      <category>k_free()</category>
      <category>k_malloc()</category>
      <category>Zephyr</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/204</guid>
      <comments>https://engschool.tistory.com/204#entry204comment</comments>
      <pubDate>Fri, 2 Jun 2023 21:30:11 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #8. Thread Management</title>
      <link>https://engschool.tistory.com/203</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼에서 thread를 굳이 나누자면&lt;br /&gt;System thread와&lt;br /&gt;User thread로 나눌 수 있어.&lt;br /&gt;System thread는 main()을 호출하는 main thread와 idle thread 그리고 workqueue thread 정도가 될거고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;User thread는 말 그대로 유저가 만드는 거겠지.&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Thread 뭐 별거 없어.&lt;br /&gt;생성하고 종료하고 멈추고 재시작하고 이게 전부.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이왕 이면 예제를 통해 살펴보는게 좋겠지?&lt;/p&gt;
&lt;pre id=&quot;code_1685417500212&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

extern void my_entry_point(void *, void *, void *);

K_THREAD_STACK_DEFINE(my_stack_area, MY_STACK_SIZE);
struct k_thread my_thread_data;

k_tid_t my_tid = k_thread_create(&amp;amp;my_thread_data, my_stack_area,
                                 K_THREAD_STACK_SIZEOF(my_stack_area),
                                 my_entry_point,
                                 NULL, NULL, NULL,
                                 MY_PRIORITY, 0, K_NO_WAIT);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이건 제퍼 공식 문서에서 제공하는 예제야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;k_thread_create라는 함수를 이용해서 MY_STACK_SIZE 크기의 메모리를 갖는 thread를 생성하는거지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 이렇게 하려면 main()안에서 k_thread_create를 호출해야 해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;runtime 전용인거지&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685563720635&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

#define LED0_NODE DT_NODELABEL(led0)
#define LED1_NODE DT_NODELABEL(led1)
static struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE,gpios);
static struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE,gpios);


void my_entry_point(void *, void *, void *){
	int ret;
	ret = gpio_pin_configure_dt(&amp;amp;led1,GPIO_OUTPUT);
	for(;;){
		gpio_pin_toggle_dt(&amp;amp;led1);
		k_sleep(K_MSEC(500));
	}
}

K_THREAD_STACK_DEFINE(my_stack_area, MY_STACK_SIZE);
struct k_thread my_thread_data;

void main(void)
{
	int ret;
	ret = gpio_pin_configure_dt(&amp;amp;led0,GPIO_OUTPUT);

	k_tid_t my_tid = k_thread_create(&amp;amp;my_thread_data, my_stack_area,
                                 K_THREAD_STACK_SIZEOF(my_stack_area),
                                 my_entry_point,
                                 NULL, NULL, NULL,
                                 MY_PRIORITY, 0, K_NO_WAIT);
	for(;;){
		gpio_pin_toggle_dt(&amp;amp;led0);
		k_sleep(K_MSEC(1000));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HqSBs/btsh9GR3hFG/QvTmNg0PUi2OUP4OfQpdF0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HqSBs/btsh9GR3hFG/QvTmNg0PUi2OUP4OfQpdF0/img.gif&quot; data-alt=&quot;지겨운 LED thread... 어쨌든 돈다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HqSBs/btsh9GR3hFG/QvTmNg0PUi2OUP4OfQpdF0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/HqSBs/btsh9GR3hFG/QvTmNg0PUi2OUP4OfQpdF0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;853&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지겨운 LED thread... 어쨌든 돈다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐 이것도 나쁘지 않지만 사실 더 편한 방법이 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;런타임이 아니고 컴파일 타임에 thread를 생성할 수 있는 메크로가 제공되거든.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 제퍼 공식 문서 예제&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685563811697&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

extern void my_entry_point(void *, void *, void *);

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;훨씬 간단하지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하면 main()에서 호출할 필요없이 thread가 생성돼.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;pre id=&quot;code_1685563958922&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

#define LED0_NODE DT_NODELABEL(led0)
#define LED1_NODE DT_NODELABEL(led1)
static struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE,gpios);
static struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE,gpios);

void my_entry_point(void *, void *, void *){
	int ret;
	ret = gpio_pin_configure_dt(&amp;amp;led1,GPIO_OUTPUT);
	for(;;){
		gpio_pin_toggle_dt(&amp;amp;led1);
		k_sleep(K_MSEC(300));
	}
}

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);

void main(void)
{
	int ret;
	ret = gpio_pin_configure_dt(&amp;amp;led0,GPIO_OUTPUT);
	for(;;){
		gpio_pin_toggle_dt(&amp;amp;led0);
		k_sleep(K_MSEC(1000));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음에 설명했듯이 여기에서 main()을 삭제해도 새로 만든 thread는 동작해.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;main()은 그냥 main thread에서 초기화를 마친 후 호출하는 함수에 불과하기 때문.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;궁금한 사람들은 한번 해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;thread를 아예 종료(abort)하는 일은 드물것 같으니 넘어가고 대신&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;suspend - resume을 해보자고&lt;/p&gt;
&lt;pre id=&quot;code_1685564464189&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;

#define MY_STACK_SIZE 500
#define MY_PRIORITY 5

#define LED0_NODE DT_NODELABEL(led0)
static struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE,gpios);

void my_entry_point(void *, void *, void *){
	int ret;
	ret = gpio_pin_configure_dt(&amp;amp;led1,GPIO_OUTPUT);
	for(;;){
		gpio_pin_toggle_dt(&amp;amp;led1);
		k_sleep(K_MSEC(50));
	}
}

K_THREAD_DEFINE(my_tid, MY_STACK_SIZE,
                my_entry_point, NULL, NULL, NULL,
                MY_PRIORITY, 0, 0);

void main(void)
{
	for(;;){
		k_thread_suspend(my_tid);
		k_sleep(K_MSEC(1000));
		k_thread_resume(my_tid);
		k_sleep(K_MSEC(1000));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhpc2k/btsibbDGija/71bFEdkjCfGXiXbcLGgKE0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhpc2k/btsibbDGija/71bFEdkjCfGXiXbcLGgKE0/img.gif&quot; data-alt=&quot;thread의 일시 정지 - 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhpc2k/btsibbDGija/71bFEdkjCfGXiXbcLGgKE0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bhpc2k/btsibbDGija/71bFEdkjCfGXiXbcLGgKE0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;569&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;thread의 일시 정지 - 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;역시나... 너무 쉽게.. 동작..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;딱히 더 할게 생각나지 않는다;;;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;047&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/047.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/047.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 제퍼 thread 상태를 다이어그램으로 나타낸거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 상태가 있는지 정도는 알아두자. 그럼 안녕!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXqxr/btsiaChuIFo/Zj0xNTSgRKDeJXhyG5JCs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXqxr/btsiaChuIFo/Zj0xNTSgRKDeJXhyG5JCs0/img.jpg&quot; data-alt=&quot;제퍼 thread status diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXqxr/btsiaChuIFo/Zj0xNTSgRKDeJXhyG5JCs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXqxr%2FbtsiaChuIFo%2FZj0xNTSgRKDeJXhyG5JCs0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;381&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제퍼 thread status diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;  nrf 보드가 52840DK가 아니라 5340DK인데 너무 신경쓰지 말자. 동작은 똑같아 ㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/204&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.02 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #9. Memory Management&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883384514&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #9. Memory Management&quot; data-og-description=&quot;제퍼에서 제공하는 Memory management 기능은 여러 가지가 있는데 k_malloc()과 k_free() 정도만 알면 될 것 같아. 사실 나머지는 어디서 어떻게 사용되는지 잘 모르겠거든 ㅋㅋ 누가 잘 아는 사람은 알려&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/204&quot; data-og-url=&quot;https://engschool.tistory.com/204&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3Ui3d/hySR06WHdM/1NJaGIFdfOTR7FByKDxsc1/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/be62g0/hySR5Hcf1m/cu8zT06Ic5vbNIZLz5Zb11/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/WtAau/hySRVkgQ2A/j0qZLnGkBj3vC9fUpNEXz1/img.png?width=1060&amp;amp;height=464&amp;amp;face=0_0_1060_464&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/204&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/204&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3Ui3d/hySR06WHdM/1NJaGIFdfOTR7FByKDxsc1/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/be62g0/hySR5Hcf1m/cu8zT06Ic5vbNIZLz5Zb11/img.png?width=800&amp;amp;height=462&amp;amp;face=0_0_800_462,https://scrap.kakaocdn.net/dn/WtAau/hySRVkgQ2A/j0qZLnGkBj3vC9fUpNEXz1/img.png?width=1060&amp;amp;height=464&amp;amp;face=0_0_1060_464');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #9. Memory Management&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제퍼에서 제공하는 Memory management 기능은 여러 가지가 있는데 k_malloc()과 k_free() 정도만 알면 될 것 같아. 사실 나머지는 어디서 어떻게 사용되는지 잘 모르겠거든 ㅋㅋ 누가 잘 아는 사람은 알려&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>k_thread_create</category>
      <category>k_thread_resume</category>
      <category>k_thread_suspend</category>
      <category>zephyr on nRF52840</category>
      <category>zephyr on nRF5340</category>
      <category>zephyr thread example</category>
      <category>제퍼 thread</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/203</guid>
      <comments>https://engschool.tistory.com/203#entry203comment</comments>
      <pubDate>Tue, 30 May 2023 20:32:39 +0900</pubDate>
    </item>
    <item>
      <title>STM32CubeMX 와치독 디버그 옵션</title>
      <link>https://engschool.tistory.com/202</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 이건 간단한 팁 같은건데 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ST-LINK로 디버깅할 때 와치독이 Enable되어 있으면 Break point 걸릴 때 리셋이 되버리잖아.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엄청 짜증나지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 보통 와치독을 Disable하거나 주석처리하고 디버그를 했었어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 실수도 많이 하고 말이지.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Debug configuration에서 이걸 해결해주는 옵션이 있더라고;;;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WyiGP/btshp4MB4fr/IZkUrx41AU58GWT99C0RKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WyiGP/btshp4MB4fr/IZkUrx41AU58GWT99C0RKK/img.png&quot; data-alt=&quot;Debug configuration&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WyiGP/btshp4MB4fr/IZkUrx41AU58GWT99C0RKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWyiGP%2Fbtshp4MB4fr%2FIZkUrx41AU58GWT99C0RKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;935&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;935&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Debug configuration&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이거 체크해주면 와치독이 활성화된 상태에서도 break point를 걸면서 디버깅을 할 수가 있어 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나만 몰랐나? ㅎㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해피 코딩~ 아디오스!&lt;/p&gt;</description>
      <category>임베디드 소프트웨어</category>
      <category>break point</category>
      <category>Debug configuration</category>
      <category>ST LINK</category>
      <category>STM32CubeMX 와치독 디버그 옵션</category>
      <category>watch dog</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/202</guid>
      <comments>https://engschool.tistory.com/202#entry202comment</comments>
      <pubDate>Fri, 26 May 2023 08:27:37 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #7. RTOS 기본</title>
      <link>https://engschool.tistory.com/201</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;RTOS 가 기본적으로 제공하는 기능들이 있어.&lt;br /&gt;5가지 정도인데 아래를 보자구!&lt;br /&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1. Task(Thread) management&lt;br /&gt;2. Memory management&lt;br /&gt;3. Time management&lt;br /&gt;4. Inter-task communication&lt;br /&gt;5. Synchronization&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWtxG/btshia66kHY/q44nVydvYsretKetC6xQ1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWtxG/btshia66kHY/q44nVydvYsretKetC6xQ1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWtxG/btshia66kHY/q44nVydvYsretKetC6xQ1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWtxG%2Fbtshia66kHY%2Fq44nVydvYsretKetC6xQ1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1518&quot; height=&quot;1412&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;모든 rtos가 비슷해.&lt;br /&gt;(제퍼도 마찬가지!)&lt;br /&gt;그래서 난 새로운 rtos를 사용해야 할 때 항상 저 기준을 적용하고 있어.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Thread management&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Thread 혹은 Task의 생성, 삭제, 정지, 재시작 등등의 기능을 말하는 거야.&lt;br /&gt;Delay로 많이 사용하는 sleep도 thread의 기능 중에&amp;nbsp;&amp;nbsp;하나임.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제퍼에서도 k_thread_create, k_thread_suspend 와 같은 함수들이 있어.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLIy3/btshh9mS1ae/bGlJ0gbNsaSdnrkkc7FKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLIy3/btshh9mS1ae/bGlJ0gbNsaSdnrkkc7FKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLIy3/btshh9mS1ae/bGlJ0gbNsaSdnrkkc7FKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLIy3%2Fbtshh9mS1ae%2FbGlJ0gbNsaSdnrkkc7FKh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;736&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Memory management&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이건 malloc과 free에 대한 건데, Mcu 다룰 때는 무서워서 잘 안쓰지.&lt;br /&gt;메모리가 작고 힙관리도 안되고 해서 malloc/free 함부러 쓰면 바로 hard fault!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이제는 피할 수 없는 정도까지 왔어. 동적 할당을 사용하는 라이브러리들을 사용해야 하기 때문이지!&lt;br /&gt;RTOS에서는 비교적 안전하게 동적 할당을 사용할 수 있도록 기능을 제공해.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mctdz/btshjvWPQK7/wsapiJ3IAkdDpyZNgqJhcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mctdz/btshjvWPQK7/wsapiJ3IAkdDpyZNgqJhcK/img.png&quot; data-alt=&quot;k_malloc, k_free&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mctdz/btshjvWPQK7/wsapiJ3IAkdDpyZNgqJhcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmctdz%2FbtshjvWPQK7%2FwsapiJ3IAkdDpyZNgqJhcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;302&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;k_malloc, k_free&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Time management&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Software timer 말고는 특별한 건 없어.&lt;br /&gt;그런데 이게 강력하지!&lt;br /&gt;MCU에서 timer를 사용하려면 HW timer 설정하고 전역변수를 남발해야하지;;&lt;br /&gt;물론 OS에서 제공하는 타이머는 HW timer 만큼 정확하지는 않지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;초단위나 수백 ms 단위의 타이머로 간단하게 사용하기는 매우 좋아. 꿀!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XEH5l/btshkaY7W4h/sXf92O9dff2kMWx5J12Hf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XEH5l/btshkaY7W4h/sXf92O9dff2kMWx5J12Hf1/img.png&quot; data-alt=&quot;제퍼에서의 timer 활용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XEH5l/btshkaY7W4h/sXf92O9dff2kMWx5J12Hf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXEH5l%2FbtshkaY7W4h%2FsXf92O9dff2kMWx5J12Hf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;816&quot; height=&quot;604&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제퍼에서의 timer 활용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Inter-task communication&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모든 rtos에는 Task 간 데이터를 주고 받을 수 있는 queue나 flag 등의 기능을 제공하고 있어.&lt;br /&gt;Timeout처리도 가능해서 활용도가 매우 높아! 정말 사랑스러운 기능이지!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq38Ph/btshhHjZ3P7/kt5m5XxHwkk5TnDtuhjDok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq38Ph/btshhHjZ3P7/kt5m5XxHwkk5TnDtuhjDok/img.png&quot; data-alt=&quot;Task 간 Message queue&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq38Ph/btshhHjZ3P7/kt5m5XxHwkk5TnDtuhjDok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq38Ph%2FbtshhHjZ3P7%2Fkt5m5XxHwkk5TnDtuhjDok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;830&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Task 간 Message queue&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Synchronization&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Semaphore, mutex 같은 기능을 말하는거야.&lt;br /&gt;Rtos 사용에는 필수적이라 꼭 알아둬야 해!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;1578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bycTlG/btshkNJoLd2/8PXlCYS8I2QPkILkHd6au1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bycTlG/btshkNJoLd2/8PXlCYS8I2QPkILkHd6au1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bycTlG/btshkNJoLd2/8PXlCYS8I2QPkILkHd6au1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbycTlG%2FbtshkNJoLd2%2F8PXlCYS8I2QPkILkHd6au1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1714&quot; height=&quot;1578&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;1578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;제퍼도 위에서 설명한 다섯가지 기능군으로 nRF보드 위에서 테스트해볼거야. ㅎㅎ&lt;br /&gt;생각보다 쉽고 재밌으니까 잘 따라 오라귯!&lt;br /&gt;안녕! &lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/203&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.05.30 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #8. Thread Management&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685883353182&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[nRF52840 + Zephyr] #8. Thread Management&quot; data-og-description=&quot;제퍼에서 thread를 굳이 나누자면 System thread와 User thread로 나눌 수 있어. System thread는 main()을 호출하는 main thread와 idle thread 그리고 workqueue thread 정도가 될거고 User thread는 말 그대로 유저가 만드는&quot; data-og-host=&quot;engschool.tistory.com&quot; data-og-source-url=&quot;https://engschool.tistory.com/203&quot; data-og-url=&quot;https://engschool.tistory.com/203&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/juON8/hySRXoQc0i/AOTtSjGXm5NWpbrEmEjlZK/img.gif?width=480&amp;amp;height=853&amp;amp;face=0_0_480_853,https://scrap.kakaocdn.net/dn/dBLmra/hySR5f8idw/GprqF65dsmjpy6wkm7K4s1/img.gif?width=480&amp;amp;height=853&amp;amp;face=0_0_480_853,https://scrap.kakaocdn.net/dn/Sx5C4/hySRSgNi76/4YSNVYG9SqDlK0FcEslNdK/img.jpg?width=601&amp;amp;height=381&amp;amp;face=0_0_601_381&quot;&gt;&lt;a href=&quot;https://engschool.tistory.com/203&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engschool.tistory.com/203&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/juON8/hySRXoQc0i/AOTtSjGXm5NWpbrEmEjlZK/img.gif?width=480&amp;amp;height=853&amp;amp;face=0_0_480_853,https://scrap.kakaocdn.net/dn/dBLmra/hySR5f8idw/GprqF65dsmjpy6wkm7K4s1/img.gif?width=480&amp;amp;height=853&amp;amp;face=0_0_480_853,https://scrap.kakaocdn.net/dn/Sx5C4/hySRSgNi76/4YSNVYG9SqDlK0FcEslNdK/img.jpg?width=601&amp;amp;height=381&amp;amp;face=0_0_601_381');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[nRF52840 + Zephyr] #8. Thread Management&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;제퍼에서 thread를 굳이 나누자면 System thread와 User thread로 나눌 수 있어. System thread는 main()을 호출하는 main thread와 idle thread 그리고 workqueue thread 정도가 될거고 User thread는 말 그대로 유저가 만드는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engschool.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>inter-task communication</category>
      <category>Memory Management</category>
      <category>RTOS</category>
      <category>RTOS 기본</category>
      <category>Synchronization</category>
      <category>thread management</category>
      <category>Time Management</category>
      <category>Zephyr</category>
      <category>제퍼</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/201</guid>
      <comments>https://engschool.tistory.com/201#entry201comment</comments>
      <pubDate>Wed, 24 May 2023 21:53:08 +0900</pubDate>
    </item>
    <item>
      <title>[nRF52840 + Zephyr] #6. KConfig</title>
      <link>https://engschool.tistory.com/200</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Kconfig는 제퍼 소프트웨어 설정에 관련이 있어.&lt;br /&gt;gpio나 usb처럼 하드웨어 드라이버를 로드하기 위한 설정도 포함되지.&lt;br /&gt; &lt;br /&gt;CONFIG_GPIO=y&lt;br /&gt;CONFIG_UART=y&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 하드웨어 사용 설정을 하는데 하드웨어 peripharal 종류만큼 있겠지?&lt;br /&gt;자주 사용되는 것들은 외우면 좋을 듯 하고.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;소프트웨어 설정 쪽을 살펴보면 두 가지 정도가 있을 거 같아.&lt;br /&gt;1. 제퍼 os 시스템 소프트웨어&lt;br /&gt;2. 그 외 서브 시스템 소프트웨어 등등&lt;br /&gt;&lt;br /&gt;k_malloc, k_free를 위한 heap 사이즈 설정이나 logging 모듈 사용처럼 os과 밀접하게 관련이 있는 것들이 있고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ccbln/btsg1tZmaTT/6z0K5rAwwpu7jFCx0P7RZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ccbln/btsg1tZmaTT/6z0K5rAwwpu7jFCx0P7RZ0/img.png&quot; data-alt=&quot;system heap을 사용하려면 위와 같은 kconfig 설정이 필요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ccbln/btsg1tZmaTT/6z0K5rAwwpu7jFCx0P7RZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCcbln%2Fbtsg1tZmaTT%2F6z0K5rAwwpu7jFCx0P7RZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;474&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;system heap을 사용하려면 위와 같은 kconfig 설정이 필요하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;modbus 처럼 어플리케이션 종류에 따라 사용이 결정되는 subsystem software가 있지.&lt;br /&gt; &lt;br /&gt;CONFIG_MODBUS=y&lt;br /&gt;CONFIG_MODBUS_ROLE_CLIENT=y&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.26.56.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQk17/btsgUsgd3D5/Wf1iSp4RQV52z351o7WCE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQk17/btsgUsgd3D5/Wf1iSp4RQV52z351o7WCE0/img.png&quot; data-alt=&quot;제퍼 MODBUS RTU CLIENT 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQk17/btsgUsgd3D5/Wf1iSp4RQV52z351o7WCE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQk17%2FbtsgUsgd3D5%2FWf1iSp4RQV52z351o7WCE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;475&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.26.56.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제퍼 MODBUS RTU CLIENT 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;자주 사용하는 것들은 외워두면 되겠지만 ㅎ&lt;br /&gt;그렇지 않은 것들은 zephyr 사이트에서 검색해가며 써야 할거야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;양이 엄청 많거든 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로토콜이든 서브시스템이든 일단 검색부터 해보자!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예제라도 검색해보라구!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.36.52.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;2538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jz7Tx/btsg4hw5YVD/y8M4rfsd3DNuwWx35RlAi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jz7Tx/btsg4hw5YVD/y8M4rfsd3DNuwWx35RlAi1/img.png&quot; data-alt=&quot;전체 예제의 반의 반도 안된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jz7Tx/btsg4hw5YVD/y8M4rfsd3DNuwWx35RlAi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJz7Tx%2Fbtsg4hw5YVD%2Fy8M4rfsd3DNuwWx35RlAi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1318&quot; height=&quot;2538&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.36.52.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;2538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전체 예제의 반의 반도 안된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자기가 만든 application에서 kconfig 설정은 prj.conf에서 할 수 있어.&lt;br /&gt;그런데 hello world나 blinky 같은 예제를 보면 gpio나 uart 설정이 없는데...&lt;br /&gt;다들 예상하고 있다시피 ㅎㅎ 기본적인 것들은 이미 보드 레벨에서 설정이 되어 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.12.46.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s4pMa/btsg0oK2Ijc/ZeccA6IKcajeNdRU9x7Bv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s4pMa/btsg0oK2Ijc/ZeccA6IKcajeNdRU9x7Bv1/img.png&quot; data-alt=&quot;Default kconfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s4pMa/btsg0oK2Ijc/ZeccA6IKcajeNdRU9x7Bv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs4pMa%2Fbtsg0oK2Ijc%2FZeccA6IKcajeNdRU9x7Bv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1172&quot; height=&quot;1224&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.12.46.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;1224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default kconfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내 mac에서는 아래 경로에 위치해 있어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;opt&amp;gt;nordic&amp;gt;ncs&amp;gt;v.2.3.0&amp;gt;zephyr&amp;gt;boards&amp;gt;arm&amp;gt;nrf52840dk_nrf52840&amp;gt;nrf52840dk_nrf52840_defconfig&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 덕분에 별도 설정없이 gpio나 uart를 사용할 수 있는 거지 ㅎㅎ 다들 한번 확인해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 vscode nRF extension에서는 kconfig gui를 제공하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 좀 헤깔리 수 있으니 천천히 시간을 두고 보는 걸 추천해!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.40.51.png&quot; data-origin-width=&quot;1942&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bfg5C/btsg1VOTOYY/7a8jNUTn4sPhhamsH2widK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bfg5C/btsg1VOTOYY/7a8jNUTn4sPhhamsH2widK/img.png&quot; data-alt=&quot;kconfig gui&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bfg5C/btsg1VOTOYY/7a8jNUTn4sPhhamsH2widK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBfg5C%2Fbtsg1VOTOYY%2F7a8jNUTn4sPhhamsH2widK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1942&quot; height=&quot;1608&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.40.51.png&quot; data-origin-width=&quot;1942&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kconfig gui&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 기본 툴에서 제공하는 gui보다는 나으니깐 감사해 하자 ㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.44.06.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tPiN8/btsgTikj2SE/sxeC6SKwkwpEp3NQ7AasN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tPiN8/btsgTikj2SE/sxeC6SKwkwpEp3NQ7AasN0/img.png&quot; data-alt=&quot;zephyr west guiconfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tPiN8/btsgTikj2SE/sxeC6SKwkwpEp3NQ7AasN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtPiN8%2FbtsgTikj2SE%2FsxeC6SKwkwpEp3NQ7AasN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1196&quot; height=&quot;1330&quot; data-filename=&quot;스크린샷 2023-05-22 오후 9.44.06.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zephyr west guiconfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이걸로 kconfig를 마무리 할건데&lt;br /&gt;kconfig는 device tree와 함께 제퍼 os 설정에 필수적인만큼 대강 넘기지 말고 꼭 여러번 공부하고 눈에 익히길 바래.&lt;br /&gt;나중에 개발하다가&lt;br /&gt;&amp;ldquo;왜 안되지?&amp;rdquo;&lt;br /&gt;이러면 kconfig와 device tree 문제인 경우가 많으니까! 안녕!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>임베디드 소프트웨어/Zephyr</category>
      <category>defconfig</category>
      <category>guiconfig</category>
      <category>kconfig</category>
      <category>nrf kconfig</category>
      <category>Zephyr</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/200</guid>
      <comments>https://engschool.tistory.com/200#entry200comment</comments>
      <pubDate>Mon, 22 May 2023 21:47:10 +0900</pubDate>
    </item>
    <item>
      <title>콧속 물혹 비수술 완치기? (완치된 줄 착각! ㅋㅋㅋ)</title>
      <link>https://engschool.tistory.com/199</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엔지니어 블로그에서 왠 코 물혹이냐고? ㅋ&lt;br /&gt;이건 널리 알려야 함 ㅋㅋㅋ&lt;br /&gt;결론부터 말하자면 의사가 당장 수술해야 한다고 했던 콧속 물혹이 없어졌어!! ㅋㅋ&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;015&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/015.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/015.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한 4년 전쯤 와이프가 내 코골이를 못참겠는지 코 관련 한의원을 데려갔어.&lt;br /&gt;그날 침을 콧속에 엄청 맞았는데;;;&lt;br /&gt;그 뒤로 갑자기 냄새가 안나는 거야.&lt;br /&gt;그래서 4년동안 냄새없이 살았어 ㅋㅋㅋ&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그러다가 점점 숨쉬는 게 힘들어져서 이비인후과를 갔더니 콧속에 물혹이 엄청 심각해서 당장 수술을 해야 한다고 하는거야 ㅠㅜ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0822_Original.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYd5Cz/btsjPsKEE5j/CWag59jZ7WZebz1dswLTXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYd5Cz/btsjPsKEE5j/CWag59jZ7WZebz1dswLTXk/img.jpg&quot; data-alt=&quot;입구부터 엄청 심한 물혹들!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYd5Cz/btsjPsKEE5j/CWag59jZ7WZebz1dswLTXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYd5Cz%2FbtsjPsKEE5j%2FCWag59jZ7WZebz1dswLTXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;521&quot; data-filename=&quot;IMG_0822_Original.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입구부터 엄청 심한 물혹들!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;걍 봐도 심해보이긴 하네;;&lt;br /&gt;그런데 회복에 1주일 정도 걸리고, 비행기도 타면 안된다 해서 출장 때문에 미루고 있었어.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- 광고 절대 아니다 -&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;그런데 그 사이에 와이즐리에서 홍삼이 엄청 싸길래 시켜 먹고 있었거든 ㅋㅋ&lt;br /&gt;한 3개월 먹으니까 갑자기 냄새가 나는 거야;;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;003&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/003.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/003.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물혹도 세끼 손가락으로 만져질 정도였는데 어느 순간 줄어들기도 하고 말이야.&lt;br /&gt;한동안 물혹이 줄었다 커졌다 하더라고 ㅋ&lt;br /&gt;암튼 냄새만 나도 황송할 정도여서 와이즐리 팬이됨 ㅋㅋ 엄청 싸기도 하고 ㅋㅋ&lt;br /&gt;그래수 무슨 프로폴리스? 그것도 사먹고 비타민도 사먹고 ㅋㅋㅋ 미친듯이 먹었지 ㅋ&lt;br /&gt;이러다가 코로나에 걸림.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;004&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/004.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/004.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엄청 아픈데 약을 엄청 주더라고;;&lt;br /&gt;아마 항생제같은 게 많았겠지 뭐 ㅋㅋ&lt;br /&gt;코로나도 끝나고 한달 정도 지났는데 이제는&lt;br /&gt;&lt;b&gt;물혹?&lt;/b&gt;&lt;br /&gt;없어졌음!&lt;br /&gt;&lt;b&gt;냄새?&lt;/b&gt;&lt;br /&gt;지하철에서 사람들이 그렇게 방구를 많이 뀌는 줄 몰랐음 ㅋㅋㅋ&lt;br /&gt;&lt;b&gt;코막힘?&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;양쪽 코로 숨쉬는 건 살면서 처음이야 ㅋㅋ&lt;br /&gt;완전 신세계!!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;027&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/027.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/027.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물혹이나 이런게 면역력같은 거랑 관계가 있니봐 ㅋ&lt;br /&gt;내가 뭐 의사도 아니고 관련 지식도 없어.&lt;br /&gt;그래서 홍삼 때문인지 비타민이나 프로폴리스 때문인지 그럴리 없겠지만 코로나가 원인인지 잘 몰라 ㅋㅋ &lt;br /&gt;아무렴 어때!!&lt;br /&gt;그렇게 괴롭히던 물혹도 없어졌고!&lt;br /&gt;숨도 잘 쉬고!&lt;br /&gt;냄새도 나는데 ㅋㅋㅋㅋ&lt;br /&gt;&lt;br /&gt;참고할 게 있을까 싶지만 ㅋ&lt;br /&gt;참고해 ㅋㅋ 안녕!!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;####업데이트####&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코로나 약을 끊고 2주 지나니까 다시 냄새가 안나더라구 ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코로 숨은 잘 쉬어지는데 말야.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 그러다가 이명이 좀 있어서 병원에 갔더니 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;의사가 귀 보다가 코도 보더라구&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 냉큼 사진찍었지 ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5114.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boaovp/btsjPK5pUE3/1pP41HFC0tD1ThEvBs1wU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boaovp/btsjPK5pUE3/1pP41HFC0tD1ThEvBs1wU0/img.jpg&quot; data-alt=&quot;꽤 많이 후퇴한 물혹들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boaovp/btsjPK5pUE3/1pP41HFC0tD1ThEvBs1wU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboaovp%2FbtsjPK5pUE3%2F1pP41HFC0tD1ThEvBs1wU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;384&quot; data-filename=&quot;IMG_5114.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;꽤 많이 후퇴한 물혹들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보니까 물혹이 사라지진 않았지만 대신 많이 후퇴(?)했어.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원래 코 입구부터 난리였는데 카메라를 꽤 쑥 넣어서 찍은 거임 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내 느낌적인 느낌인지는 모르겠지만 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;수술하자는 소리도 또 듣고 왔지 ㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안해!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ㅋㅋㅋㅋㅋ&lt;/p&gt;</description>
      <category>기타/주절주절</category>
      <category>물혹</category>
      <category>물혹 비수술</category>
      <category>비염</category>
      <category>와이즐리</category>
      <category>홍삼</category>
      <author>방피터</author>
      <guid isPermaLink="true">https://engschool.tistory.com/199</guid>
      <comments>https://engschool.tistory.com/199#entry199comment</comments>
      <pubDate>Fri, 19 May 2023 21:12:14 +0900</pubDate>
    </item>
  </channel>
</rss>