<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>승코딩당당당</title>
    <link>https://xeungcoding.tistory.com/</link>
    <description>컴퓨터공학 전공자의 개발 공부 기록</description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 16:52:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>승코딩당당당</managingEditor>
    <image>
      <title>승코딩당당당</title>
      <url>https://tistory1.daumcdn.net/tistory/8454356/attach/fcbfef11a71943548ecc37e01d574e9a</url>
      <link>https://xeungcoding.tistory.com</link>
    </image>
    <item>
      <title>[AUTOSAR] Communication 구조와 BSW 통신 스택 정리</title>
      <link>https://xeungcoding.tistory.com/117</link>
      <description>&lt;p data-end=&quot;239&quot; data-start=&quot;67&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;239&quot; data-start=&quot;67&quot; data-ke-size=&quot;size16&quot;&gt;AUTOSAR Communication 구조는 소프트웨어 컴포넌트 간의 데이터 교환을 효율적으로 수행하고, 하드웨어와의 결합도를 낮추기 위해 계층적으로 설계되어 있다. SWC와 Runnable을 기반으로 기능을 분리하고, RTE를 통해 컴포넌트 간 통신을 추상화함으로써 시스템의 재사용성과 확장성을 확보한다.&lt;/p&gt;
&lt;p data-end=&quot;239&quot; data-start=&quot;67&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;454&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;이 과정에서 BSW는 하드웨어와 상위 애플리케이션 사이를 연결하는 핵심 역할을 수행하며, System Services, ECU Abstraction, MCAL로 구성된 계층 구조를 통해 하드웨어 의존성을 최소화한다. 또한 Com, Dcm, Dem과 같은 통신 및 진단 모듈과 PduR, CanIf, CAN Driver로 이어지는 통신 흐름을 통해 데이터가 실제 네트워크로 전달된다.&lt;/p&gt;
&lt;p data-end=&quot;454&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;456&quot; data-ke-size=&quot;size16&quot;&gt;특히 NM과 CanSM은 네트워크의 상태를 관리하여 불필요한 전력 소모를 줄이고, FlexRay와 같은 통신 방식은 시스템 설계에 따라 구조적 제약을 갖는다는 점에서 AUTOSAR 통신 구조의 특징을 잘 보여준다.&lt;/p&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;456&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;654&quot; data-start=&quot;577&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 AUTOSAR의 전체 통신 흐름과 주요 BSW 모듈의 역할을 중심으로, 각 계층이 어떻게 연결되고 동작하는지에 대해 정리한다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;654&quot; data-start=&quot;577&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;37&quot; data-start=&quot;26&quot; data-section-id=&quot;rzkdgm&quot; data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;919&quot; data-start=&quot;39&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;141&quot; data-start=&quot;39&quot; data-section-id=&quot;abxupu&quot;&gt;software component(SWC) 단위로 기능을 구성한다 (객체지향 개념)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;141&quot; data-start=&quot;90&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;105&quot; data-start=&quot;90&quot; data-section-id=&quot;1ngsv2x&quot;&gt;기능 단위로 분리된 모듈&lt;/li&gt;
&lt;li data-end=&quot;141&quot; data-start=&quot;108&quot; data-section-id=&quot;1v8qiz4&quot;&gt;단독으로 동작하지 못하고 다른 SWC와 상호작용하여 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;142&quot; data-section-id=&quot;nerxaf&quot;&gt;Runnable은 SWC 내부에서 실제로 동작하는 함수 단위
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;253&quot; data-start=&quot;180&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;180&quot; data-section-id=&quot;1m0cwdq&quot;&gt;RTE를 통해 데이터를 주고 받는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;253&quot; data-start=&quot;206&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;253&quot; data-start=&quot;206&quot; data-section-id=&quot;131dxvs&quot;&gt;[SWC A - Runnable] &amp;harr; RTE &amp;harr; [SWC B - Runnable]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;369&quot; data-start=&quot;254&quot; data-section-id=&quot;a0pyj2&quot;&gt;RTE(Runtime Environment)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;369&quot; data-start=&quot;283&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;283&quot; data-section-id=&quot;tpliwz&quot;&gt;SWC와 SWC, 그리고 SWC와 하드웨어 사이를 연결하는 중간 계층&lt;/li&gt;
&lt;li data-end=&quot;369&quot; data-start=&quot;326&quot; data-section-id=&quot;1my06jy&quot;&gt;컴포넌트들이 서로를 직접 알지 않아도 통신 가능하도록 하는 인터페이스 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;439&quot; data-start=&quot;371&quot; data-section-id=&quot;liroys&quot;&gt;전체 구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;439&quot; data-start=&quot;381&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;439&quot; data-start=&quot;381&quot; data-section-id=&quot;1e20hu7&quot;&gt;ASW(Application Layer) &amp;larr; RTE &amp;larr; BSW(Basic Software) &amp;larr; MCU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;838&quot; data-start=&quot;441&quot; data-section-id=&quot;3brvwh&quot;&gt;BSW는 크게 3단계 구조로 나뉜다
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;838&quot; data-start=&quot;465&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;465&quot; data-section-id=&quot;6dhsrg&quot;&gt;System Services
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;568&quot; data-start=&quot;487&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;506&quot; data-start=&quot;487&quot; data-section-id=&quot;u8qc3n&quot;&gt;OS 및 시스템 공통 기능 제공&lt;/li&gt;
&lt;li data-end=&quot;526&quot; data-start=&quot;511&quot; data-section-id=&quot;1frtxp8&quot;&gt;시스템 전체 동작을 관리&lt;/li&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;531&quot; data-section-id=&quot;1mbcj9r&quot;&gt;예: OS(스케줄링), 통신 서비스, 메모리 관리, 진단 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;571&quot; data-section-id=&quot;mn97yx&quot;&gt;ECU Abstraction Layer
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;686&quot; data-start=&quot;599&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;599&quot; data-section-id=&quot;tg0l36&quot;&gt;하드웨어를 직접 다루지 않도록 추상화&lt;/li&gt;
&lt;li data-end=&quot;647&quot; data-start=&quot;626&quot; data-section-id=&quot;11nd1j9&quot;&gt;하드웨어 변경에 대한 영향을 최소화&lt;/li&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;652&quot; data-section-id=&quot;f26ytd&quot;&gt;예: 센서 추상화, 통신 모듈 추상화, 메모리 HW 추상화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;838&quot; data-start=&quot;689&quot; data-section-id=&quot;m2ucu&quot;&gt;MCAL (Microcontroller Abstraction Layer)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;838&quot; data-start=&quot;736&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;759&quot; data-start=&quot;736&quot; data-section-id=&quot;1uymm5x&quot;&gt;하드웨어 레지스터를 직접 제어하는 계층&lt;/li&gt;
&lt;li data-end=&quot;781&quot; data-start=&quot;764&quot; data-section-id=&quot;2px5qs&quot;&gt;디바이스 드라이버 역할 수행&lt;/li&gt;
&lt;li data-end=&quot;838&quot; data-start=&quot;786&quot; data-section-id=&quot;k3nhon&quot;&gt;예: GPIO Driver, ADC Driver, PWM Driver, CAN Driver&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;919&quot; data-start=&quot;840&quot; data-section-id=&quot;1pr8b25&quot;&gt;AUTOSAR 통신 구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;919&quot; data-start=&quot;858&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;878&quot; data-start=&quot;858&quot; data-section-id=&quot;32w2g3&quot;&gt;server는 항상 동작하지 않음&lt;/li&gt;
&lt;li data-end=&quot;919&quot; data-start=&quot;881&quot; data-section-id=&quot;le9i4w&quot;&gt;client의 요청이 있을 때 해당 요청을 처리하는 방식으로 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;932&quot; data-start=&quot;926&quot; data-section-id=&quot;1hryl7n&quot; data-ke-size=&quot;size26&quot;&gt;BSW&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IUCfN/dJMcahRi1nh/kWJ0LlnQlIDnSxzafJvpk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IUCfN/dJMcahRi1nh/kWJ0LlnQlIDnSxzafJvpk1/img.png&quot; data-alt=&quot;https://yoginsavani.com/understanding-autosar-architecture-a-guide-to-automotive-software-integration/#google_vignette&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IUCfN/dJMcahRi1nh/kWJ0LlnQlIDnSxzafJvpk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIUCfN%2FdJMcahRi1nh%2FkWJ0LlnQlIDnSxzafJvpk1%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;1024&quot; height=&quot;554&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://yoginsavani.com/understanding-autosar-architecture-a-guide-to-automotive-software-integration/#google_vignette&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2114&quot; data-start=&quot;934&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;967&quot; data-start=&quot;934&quot; data-section-id=&quot;ekc11v&quot;&gt;BSW는 하드웨어와 상위 소프트웨어를 연결하는 핵심 계층&lt;/li&gt;
&lt;li data-end=&quot;1157&quot; data-start=&quot;969&quot; data-section-id=&quot;tx5wys&quot;&gt;BSW 모듈 구성
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1157&quot; data-start=&quot;983&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1060&quot; data-start=&quot;983&quot; data-section-id=&quot;1y76bfg&quot;&gt;노란색 블록
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1060&quot; data-start=&quot;996&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1015&quot; data-start=&quot;996&quot; data-section-id=&quot;zk5amo&quot;&gt;특정 기능을 수행하는 개별 모듈&lt;/li&gt;
&lt;li data-end=&quot;1036&quot; data-start=&quot;1020&quot; data-section-id=&quot;140l0pk&quot;&gt;하나의 명확한 역할을 담당&lt;/li&gt;
&lt;li data-end=&quot;1060&quot; data-start=&quot;1041&quot; data-section-id=&quot;mbjs4r&quot;&gt;예: 메모리, 입출력, 진단 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1157&quot; data-start=&quot;1063&quot; data-section-id=&quot;1gnobmz&quot;&gt;파란색 블록
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1157&quot; data-start=&quot;1076&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1097&quot; data-start=&quot;1076&quot; data-section-id=&quot;1cxdhjl&quot;&gt;여러 모듈이 계층적으로 구성된 구조&lt;/li&gt;
&lt;li data-end=&quot;1118&quot; data-start=&quot;1102&quot; data-section-id=&quot;1dsxr20&quot;&gt;주로 통신 스택에서 나타남&lt;/li&gt;
&lt;li data-end=&quot;1157&quot; data-start=&quot;1123&quot; data-section-id=&quot;8r1lih&quot;&gt;데이터 패킹, 라우팅, 인터페이스 처리 등 여러 단계 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1159&quot; data-section-id=&quot;amv1vf&quot;&gt;Transceiver
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1362&quot; data-start=&quot;1175&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1175&quot; data-section-id=&quot;1i31c2q&quot;&gt;MCU와 CAN Bus 사이에서 신호를 변환하는 장치&lt;/li&gt;
&lt;li data-end=&quot;1312&quot; data-start=&quot;1209&quot; data-section-id=&quot;12nn6fs&quot;&gt;구조: MCU &amp;harr; CAN Controller &amp;harr; Transceiver &amp;harr; CAN Bus
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1312&quot; data-start=&quot;1264&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1288&quot; data-start=&quot;1264&quot; data-section-id=&quot;m2tir2&quot;&gt;MCU/Controller: 디지털 신호&lt;/li&gt;
&lt;li data-end=&quot;1312&quot; data-start=&quot;1293&quot; data-section-id=&quot;1n4spyz&quot;&gt;CAN Bus: 전압 기반 신호&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1344&quot; data-start=&quot;1315&quot; data-section-id=&quot;wtrg58&quot;&gt;디지털 신호를 실제 통신 가능한 전기 신호로 변환&lt;/li&gt;
&lt;li data-end=&quot;1362&quot; data-start=&quot;1347&quot; data-section-id=&quot;18q1co1&quot;&gt;통신을 위해 반드시 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1364&quot; data-section-id=&quot;ljocah&quot;&gt;NM (Network Management)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1539&quot; data-start=&quot;1392&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1410&quot; data-start=&quot;1392&quot; data-section-id=&quot;ky8ket&quot;&gt;네트워크 상태를 관리하는 모듈&lt;/li&gt;
&lt;li data-end=&quot;1453&quot; data-start=&quot;1413&quot; data-section-id=&quot;1fpsnwu&quot;&gt;필요할 때만 네트워크를 활성화하고, 필요 없을 때는 절전 상태로 전환&lt;/li&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1456&quot; data-section-id=&quot;1l5tnxm&quot;&gt;역할
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1539&quot; data-start=&quot;1465&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1484&quot; data-start=&quot;1465&quot; data-section-id=&quot;1mt579j&quot;&gt;Wake-up: 네트워크 활성화&lt;/li&gt;
&lt;li data-end=&quot;1512&quot; data-start=&quot;1489&quot; data-section-id=&quot;17vc27f&quot;&gt;유지: ECU 상태 확인 및 통신 유지&lt;/li&gt;
&lt;li data-end=&quot;1539&quot; data-start=&quot;1517&quot; data-section-id=&quot;hmcj3g&quot;&gt;Sleep: 네트워크 절전 상태 전환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1693&quot; data-start=&quot;1541&quot; data-section-id=&quot;106xpzj&quot;&gt;CanSM (CAN State Manager)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1693&quot; data-start=&quot;1571&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1591&quot; data-start=&quot;1571&quot; data-section-id=&quot;1chtp0&quot;&gt;CAN 통신 상태를 제어하는 모듈&lt;/li&gt;
&lt;li data-end=&quot;1628&quot; data-start=&quot;1594&quot; data-section-id=&quot;hn2695&quot;&gt;통신 시작, 정상 동작, 오류 상태, 절전 상태 등을 관리&lt;/li&gt;
&lt;li data-end=&quot;1693&quot; data-start=&quot;1631&quot; data-section-id=&quot;15b9pou&quot;&gt;NM과의 관계
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1693&quot; data-start=&quot;1645&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1664&quot; data-start=&quot;1645&quot; data-section-id=&quot;ezg2o1&quot;&gt;NM: 네트워크 사용 여부 결정&lt;/li&gt;
&lt;li data-end=&quot;1693&quot; data-start=&quot;1669&quot; data-section-id=&quot;397z2c&quot;&gt;CanSM: 실제 CAN 상태 전환 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1695&quot; data-section-id=&quot;1g5r601&quot;&gt;Com / Dcm / Dem
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1895&quot; data-start=&quot;1715&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1769&quot; data-start=&quot;1715&quot; data-section-id=&quot;lzdnvf&quot;&gt;Com (Communication Module)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1769&quot; data-start=&quot;1748&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1769&quot; data-start=&quot;1748&quot; data-section-id=&quot;wb5ojq&quot;&gt;SWC의 데이터를 네트워크로 송수신&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1840&quot; data-start=&quot;1772&quot; data-section-id=&quot;16h0g37&quot;&gt;Dcm (Diagnostic Communication Manager)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1840&quot; data-start=&quot;1817&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1840&quot; data-start=&quot;1817&quot; data-section-id=&quot;16xy957&quot;&gt;외부 진단 장비와 ECU 간 통신 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1843&quot; data-section-id=&quot;a5g2sp&quot;&gt;Dem (Diagnostic Event Manager)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1895&quot; data-start=&quot;1880&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1880&quot; data-section-id=&quot;pve2vv&quot;&gt;에러 발생 기록 및 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1987&quot; data-start=&quot;1897&quot; data-section-id=&quot;8jtllg&quot;&gt;PduR (PDU Router)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1987&quot; data-start=&quot;1919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1942&quot; data-start=&quot;1919&quot; data-section-id=&quot;544if5&quot;&gt;데이터를 목적지로 전달하는 라우터 역할&lt;/li&gt;
&lt;li data-end=&quot;1987&quot; data-start=&quot;1945&quot; data-section-id=&quot;1ukk4g5&quot;&gt;상위 모듈(Com, Dcm)과 하위 통신 모듈(CAN, LIN 등) 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2114&quot; data-start=&quot;1989&quot; data-section-id=&quot;51o935&quot;&gt;FlexRay
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2114&quot; data-start=&quot;2001&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2032&quot; data-start=&quot;2001&quot; data-section-id=&quot;d2wv35&quot;&gt;정적 스케줄 기반 통신 (Time-triggered)&lt;/li&gt;
&lt;li data-end=&quot;2064&quot; data-start=&quot;2035&quot; data-section-id=&quot;1qgx3w5&quot;&gt;모든 ECU가 정해진 시간 슬롯에 따라 통신 수행&lt;/li&gt;
&lt;li data-end=&quot;2114&quot; data-start=&quot;2067&quot; data-section-id=&quot;1u90g9b&quot;&gt;특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2114&quot; data-start=&quot;2076&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2090&quot; data-start=&quot;2076&quot; data-section-id=&quot;3ch3vu&quot;&gt;높은 신뢰성과 실시간성&lt;/li&gt;
&lt;li data-end=&quot;2114&quot; data-start=&quot;2095&quot; data-section-id=&quot;yy2w1&quot;&gt;구조 변경 시 전체 스케줄 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2152&quot; data-start=&quot;2121&quot; data-section-id=&quot;4n6fsk&quot; data-ke-size=&quot;size26&quot;&gt;CAN Interface module (CanIf)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2503&quot; data-start=&quot;2154&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2201&quot; data-start=&quot;2154&quot; data-section-id=&quot;51iqpm&quot;&gt;CanIf
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2201&quot; data-start=&quot;2164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2201&quot; data-start=&quot;2164&quot; data-section-id=&quot;13jldsu&quot;&gt;상위 통신 모듈과 CAN Driver 사이를 연결하는 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2300&quot; data-start=&quot;2203&quot; data-section-id=&quot;m4wxvv&quot;&gt;Hardware Object (Mailbox)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2300&quot; data-start=&quot;2233&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2260&quot; data-start=&quot;2233&quot; data-section-id=&quot;16efv3w&quot;&gt;CAN Controller 내부의 메모리 버퍼&lt;/li&gt;
&lt;li data-end=&quot;2278&quot; data-start=&quot;2263&quot; data-section-id=&quot;7v2rlb&quot;&gt;송신/수신 메시지를 저장&lt;/li&gt;
&lt;li data-end=&quot;2300&quot; data-start=&quot;2281&quot; data-section-id=&quot;1f9j1ih&quot;&gt;설정에 따라 특정 메시지를 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2302&quot; data-section-id=&quot;1yr1jgk&quot;&gt;Hardware Object Handler (HoH)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2402&quot; data-start=&quot;2336&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2362&quot; data-start=&quot;2336&quot; data-section-id=&quot;10sig5q&quot;&gt;Hardware Object를 추상화한 개념&lt;/li&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2365&quot; data-section-id=&quot;13qkuhr&quot;&gt;CanIf가 PDU를 HoH로 변환하여 CAN Driver 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2503&quot; data-start=&quot;2404&quot; data-section-id=&quot;1tgwuus&quot;&gt;CAN Driver
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2503&quot; data-start=&quot;2419&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2473&quot; data-start=&quot;2419&quot; data-section-id=&quot;czv3p2&quot;&gt;어떤 CAN Controller의 어떤 Hardware Object를 사용할지 설정 정보 보유&lt;/li&gt;
&lt;li data-end=&quot;2503&quot; data-start=&quot;2476&quot; data-section-id=&quot;n8d0s8&quot;&gt;해당 버퍼에 메시지를 할당하여 실제 전송 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/임베디드</category>
      <category>autosar</category>
      <category>AUTOSAR Communication</category>
      <category>BSW</category>
      <category>Can</category>
      <category>CAN Driver</category>
      <category>CanIf</category>
      <category>ECU Abstraction</category>
      <category>MCAL</category>
      <category>RTE</category>
      <category>System Services</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/117</guid>
      <comments>https://xeungcoding.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 24 Mar 2026 09:01:24 +0900</pubDate>
    </item>
    <item>
      <title>[AUTOSAR] OS Task 기반 LED 제어 실습 (TRK-MPC560XB)</title>
      <link>https://xeungcoding.tistory.com/116</link>
      <description>&lt;p data-end=&quot;259&quot; data-start=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 AUTOSAR OS 환경에서 Task를 생성하고, 이를 주기적으로 실행하여 LED를 제어하는 과정을 수행하였다. 단순히 while문으로 LED를 제어하는 것이 아니라, AUTOSAR의 Task와 Alarm 기반 스케줄링 구조를 활용하여 실시간 시스템에서의 동작 흐름을 이해하는 데 목적이 있다.&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;84&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;368&quot; data-start=&quot;261&quot; data-ke-size=&quot;size16&quot;&gt;특히, OS 레벨에서 Task가 어떻게 생성되고 실행되는지, 그리고 해당 Task가 실제 하드웨어 제어로 이어지는 과정을 직접 구현해보며 AUTOSAR 구조에 대한 이해를 높일 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;368&quot; data-start=&quot;261&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;377&quot; data-start=&quot;370&quot; data-ke-size=&quot;size16&quot;&gt;실습 환경&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;479&quot; data-start=&quot;379&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;399&quot; data-start=&quot;379&quot; data-section-id=&quot;1kow2b1&quot;&gt;보드: TRK-MPC560XB&lt;/li&gt;
&lt;li data-end=&quot;417&quot; data-start=&quot;400&quot; data-section-id=&quot;15nd6kw&quot;&gt;MCU: MPC5606B&lt;/li&gt;
&lt;li data-end=&quot;447&quot; data-start=&quot;418&quot; data-section-id=&quot;1tvvclk&quot;&gt;개발 환경: mobilgene C Studio&lt;/li&gt;
&lt;li data-end=&quot;479&quot; data-start=&quot;448&quot; data-section-id=&quot;or6l2s&quot;&gt;AUTOSAR Classic Platform 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;488&quot; data-start=&quot;481&quot; data-ke-size=&quot;size16&quot;&gt;실습 목표&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;601&quot; data-start=&quot;490&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;490&quot; data-section-id=&quot;1ltfclg&quot;&gt;AUTOSAR OS Task 생성 및 설정&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;518&quot; data-section-id=&quot;3db8fz&quot;&gt;Task를 Application에 등록&lt;/li&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;544&quot; data-section-id=&quot;1qbfjz7&quot;&gt;Alarm을 이용한 주기 실행 구조 이해&lt;/li&gt;
&lt;li data-end=&quot;601&quot; data-start=&quot;571&quot; data-section-id=&quot;11xsdp9&quot;&gt;GPIO 레지스터 제어를 통한 LED 토글 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;617&quot; data-start=&quot;603&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task 생성 및 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;672&quot; data-start=&quot;619&quot; data-ke-size=&quot;size16&quot;&gt;AUTOSAR 설정 파일(ARXML)에서 OsTask_LED_Init Task를 생성하였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;726&quot; data-start=&quot;674&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;691&quot; data-start=&quot;674&quot; data-section-id=&quot;xuupx3&quot;&gt;Activation: 1&lt;/li&gt;
&lt;li data-end=&quot;707&quot; data-start=&quot;692&quot; data-section-id=&quot;1r6tlg1&quot;&gt;Priority: 1&lt;/li&gt;
&lt;li data-end=&quot;726&quot; data-start=&quot;708&quot; data-section-id=&quot;kis9r8&quot;&gt;Schedule: FULL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bor36A/dJMcach8fCT/VsCoiaeMa8Lb6hdTgRyGkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bor36A/dJMcach8fCT/VsCoiaeMa8Lb6hdTgRyGkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bor36A/dJMcach8fCT/VsCoiaeMa8Lb6hdTgRyGkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbor36A%2FdJMcach8fCT%2FVsCoiaeMa8Lb6hdTgRyGkK%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;1914&quot; height=&quot;812&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;808&quot; data-start=&quot;728&quot; data-ke-size=&quot;size16&quot;&gt;Task는 AUTOSAR OS에서 관리되는 실행 단위로, 해당 설정을 통해 OS가 Task의 실행 우선순위와 스케줄링 방식을 결정하게 된다.&lt;/p&gt;
&lt;p data-end=&quot;808&quot; data-start=&quot;728&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;810&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;810&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Application 연결&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;861&quot; data-start=&quot;828&quot; data-ke-size=&quot;size16&quot;&gt;생성한 Task는 OsApplication에 등록하였다.&lt;/p&gt;
&lt;p data-end=&quot;959&quot; data-start=&quot;863&quot; data-ke-size=&quot;size16&quot;&gt;이 과정은 매우 중요한 단계로, Task를 생성하는 것만으로는 실행되지 않으며, 반드시 Application에 연결되어야 OS가 해당 Task를 실행 대상으로 인식한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnTbR/dJMcafFVxCv/suDDiBgIVR9xPDkgqpJY5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnTbR/dJMcafFVxCv/suDDiBgIVR9xPDkgqpJY5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnTbR/dJMcafFVxCv/suDDiBgIVR9xPDkgqpJY5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnnTbR%2FdJMcafFVxCv%2FsuDDiBgIVR9xPDkgqpJY5k%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;929&quot; height=&quot;820&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc3xMU/dJMcaiikJ1c/BkvxoyHzkfdSiHhMVkVB51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc3xMU/dJMcaiikJ1c/BkvxoyHzkfdSiHhMVkVB51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc3xMU/dJMcaiikJ1c/BkvxoyHzkfdSiHhMVkVB51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc3xMU%2FdJMcaiikJ1c%2FBkvxoyHzkfdSiHhMVkVB51%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;1536&quot; height=&quot;699&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;970&quot; data-start=&quot;961&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;970&quot; data-start=&quot;961&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1009&quot; data-start=&quot;972&quot; data-ke-size=&quot;size16&quot;&gt;Task 내부에서는 LED를 ON/OFF하는 로직을 구현하였다.&lt;/p&gt;
&lt;p data-end=&quot;1078&quot; data-start=&quot;1011&quot; data-ke-size=&quot;size16&quot;&gt;static 변수를 활용하여 상태를 유지하고, Task가 실행될 때마다 값을 반전시켜 LED가 깜빡이도록 구성하였다.&lt;/p&gt;
&lt;p data-end=&quot;1113&quot; data-start=&quot;1080&quot; data-ke-size=&quot;size16&quot;&gt;GPIO 제어는 레지스터 직접 접근 방식으로 수행하였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1162&quot; data-start=&quot;1115&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1137&quot; data-start=&quot;1115&quot; data-section-id=&quot;1a08ovj&quot;&gt;LED ON: STD_LOW 출력&lt;/li&gt;
&lt;li data-end=&quot;1162&quot; data-start=&quot;1138&quot; data-section-id=&quot;1ayv5mj&quot;&gt;LED OFF: STD_HIGH 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1236&quot; data-start=&quot;1164&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 MCU의 포트를 직접 제어하는 방식과 AUTOSAR 환경에서의 하드웨어 제어 흐름을 동시에 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzRLF/dJMcacPXQN9/wpoatiC9ilmCLgEMNfAXr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzRLF/dJMcacPXQN9/wpoatiC9ilmCLgEMNfAXr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzRLF/dJMcacPXQN9/wpoatiC9ilmCLgEMNfAXr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzRLF%2FdJMcacPXQN9%2FwpoatiC9ilmCLgEMNfAXr1%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;1919&quot; height=&quot;984&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJGz71/dJMcadacNDf/oq5ij1xvR1XwzuTJ1tb8n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJGz71/dJMcadacNDf/oq5ij1xvR1XwzuTJ1tb8n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJGz71/dJMcadacNDf/oq5ij1xvR1XwzuTJ1tb8n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJGz71%2FdJMcadacNDf%2Foq5ij1xvR1XwzuTJ1tb8n1%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;1537&quot; height=&quot;916&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1245&quot; data-start=&quot;1238&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1245&quot; data-start=&quot;1238&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1270&quot; data-start=&quot;1247&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습의 전체 흐름은 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;1315&quot; data-start=&quot;1272&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Alarm &amp;rarr; Task Activate &amp;rarr; Task 실행 &amp;rarr; GPIO 제어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1379&quot; data-start=&quot;1317&quot; data-ke-size=&quot;size16&quot;&gt;즉, AUTOSAR OS가 Task를 스케줄링하고, 해당 Task가 실행되면서 하드웨어를 제어하는 구조이다.&lt;/p&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1381&quot; data-ke-size=&quot;size16&quot;&gt;단순 반복문이 아닌 OS 기반 실행 구조를 사용한다는 점이 핵심이다.&lt;/p&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1381&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;1430&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1430&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실습 결과&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1479&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size16&quot;&gt;Task가 주기적으로 실행되며 LED2가 일정한 주기로 깜빡이는 것을 확인하였다.&lt;/p&gt;
&lt;p data-end=&quot;1550&quot; data-start=&quot;1481&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 AUTOSAR OS의 Task 스케줄링과 실제 하드웨어 제어가 정상적으로 연결되어 동작함을 검증할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OS Task 기반 LED 제어 실습.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IESVB/dJMcacCrfH3/y2xxdjVHt13rrhtP2UZHPK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IESVB/dJMcacCrfH3/y2xxdjVHt13rrhtP2UZHPK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IESVB/dJMcacCrfH3/y2xxdjVHt13rrhtP2UZHPK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/IESVB/dJMcacCrfH3/y2xxdjVHt13rrhtP2UZHPK/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;480&quot; data-filename=&quot;OS Task 기반 LED 제어 실습.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발/임베디드</category>
      <category>Alarm</category>
      <category>autosar</category>
      <category>ECU</category>
      <category>gpio</category>
      <category>MPC5606B</category>
      <category>RTOS</category>
      <category>Task</category>
      <category>TRK_MPC560XB</category>
      <category>임베디드시스템</category>
      <category>차량소프트웨어</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/116</guid>
      <comments>https://xeungcoding.tistory.com/116#entry116comment</comments>
      <pubDate>Fri, 20 Mar 2026 09:20:17 +0900</pubDate>
    </item>
    <item>
      <title>[AUTOSAR] AUTOSAR 기반 소프트웨어 플랫폼과 OS 구조 정리</title>
      <link>https://xeungcoding.tistory.com/115</link>
      <description>&lt;p data-end=&quot;220&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;220&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;자동차 소프트웨어는 점점 더 복잡해지고 있으며, 다양한 제어기와 기능을 효율적으로 통합하기 위해 표준화된 플랫폼이 필수적으로 요구되고 있다. 이러한 흐름 속에서 등장한 것이 AUTOSAR 기반 소프트웨어 플랫폼으로, 하드웨어와 독립적인 구조를 통해 소프트웨어 재사용성과 안전성을 동시에 확보할 수 있도록 한다.&lt;/p&gt;
&lt;p data-end=&quot;220&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;472&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 소프트웨어 플랫폼의 개념과 필요성을 시작으로, AUTOSAR의 구조와 Classic/Adaptive의 차이, 그리고 실제 차량 시스템에서 중요한 역할을 하는 AUTOSAR OS의 핵심 요소(Task, Interrupt, Alarm, Resource 등)를 정리하였다. 특히 실시간 시스템에서 요구되는 스케줄링 방식과 우선순위 관리, 그리고 안정적인 동작을 위한 메커니즘까지 함께 다루며 전체적인 흐름을 이해할 수 있도록 구성하였다.&lt;/p&gt;
&lt;p data-end=&quot;472&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;567&quot; data-start=&quot;474&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 AUTOSAR가 단순한 개발 프레임워크를 넘어, 자동차 소프트웨어의 재사용성, 안전성, 확장성을 모두 고려한 표준 아키텍처임을 이해하는 데 목적이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HkskC/dJMcadg17qQ/URYqxbRXyZtakVnsUuJyE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HkskC/dJMcadg17qQ/URYqxbRXyZtakVnsUuJyE1/img.png&quot; data-alt=&quot;https://kjy1010.tistory.com/42&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HkskC/dJMcadg17qQ/URYqxbRXyZtakVnsUuJyE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHkskC%2FdJMcadg17qQ%2FURYqxbRXyZtakVnsUuJyE1%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;1280&quot; height=&quot;562&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://kjy1010.tistory.com/42&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;12&quot; data-start=&quot;0&quot; data-section-id=&quot;b5dywi&quot; data-ke-size=&quot;size26&quot;&gt;소프트웨어 플랫폼&lt;/h2&gt;
&lt;p data-end=&quot;26&quot; data-start=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 플랫폼 개요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;87&quot; data-start=&quot;28&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;61&quot; data-start=&quot;28&quot; data-section-id=&quot;3qrgd6&quot;&gt;제어계층에서 응용 SW와 HW를 연결해주는 중간 계층&lt;/li&gt;
&lt;li data-end=&quot;87&quot; data-start=&quot;62&quot; data-section-id=&quot;1nlmup4&quot;&gt;표준 인터페이스와 공통 기능 모듈 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;104&quot; data-start=&quot;89&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 플랫폼 개발 배경&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;320&quot; data-start=&quot;106&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;145&quot; data-start=&quot;106&quot; data-section-id=&quot;1kdre9m&quot;&gt;제어기 수량 증가 및 차량 공간 제약으로 인해 제어기 통합 필요&lt;/li&gt;
&lt;li data-end=&quot;182&quot; data-start=&quot;146&quot; data-section-id=&quot;kfbcxm&quot;&gt;제어기 SW 복잡성 증가 &amp;rarr; 플랫폼 공용화 및 표준화 필요&lt;/li&gt;
&lt;li data-end=&quot;219&quot; data-start=&quot;183&quot; data-section-id=&quot;ggdd7m&quot;&gt;차량 변경 시 HW 변경 &amp;rarr; 기능 확장을 위해 플랫폼 필요&lt;/li&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;220&quot; data-section-id=&quot;dcgnbk&quot;&gt;ISO 26262 기능안전 표준 준수 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;320&quot; data-start=&quot;252&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;286&quot; data-start=&quot;252&quot; data-section-id=&quot;1oopuzd&quot;&gt;AUTOSAR는 ISO 26262를 기본적으로 따르므로&lt;/li&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;291&quot; data-section-id=&quot;1rts5jf&quot;&gt;애플리케이션만 검증하면 됨 &amp;rarr; 개발 부담 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;333&quot; data-start=&quot;322&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HKMC 플랫폼 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;445&quot; data-start=&quot;335&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;365&quot; data-start=&quot;335&quot; data-section-id=&quot;1gxnp9f&quot;&gt;최신 차량용 기반 기술의 국제 표준화 및 사양화&lt;/li&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;366&quot; data-section-id=&quot;4hwqa1&quot;&gt;고성능 MCU 기반 &amp;rarr; 다양한 도메인으로 확장 가능&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;399&quot; data-section-id=&quot;c8ulgy&quot;&gt;전 분야 공용 표준화 플랫폼 제공&lt;/li&gt;
&lt;li data-end=&quot;445&quot; data-start=&quot;422&quot; data-section-id=&quot;17urdmi&quot;&gt;차세대 통신 기술 및 기능안전 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;457&quot; data-start=&quot;447&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR 정의&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;522&quot; data-start=&quot;459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;459&quot; data-section-id=&quot;1oz9nn3&quot;&gt;AUTOmotive Open System ARchitecture&lt;/li&gt;
&lt;li data-end=&quot;522&quot; data-start=&quot;499&quot; data-section-id=&quot;lh7tt4&quot;&gt;재사용 가능한 자동차 SW 아키텍처&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;534&quot; data-start=&quot;524&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR 버전&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;593&quot; data-start=&quot;536&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;536&quot; data-section-id=&quot;ui1hur&quot;&gt;Classic AUTOSAR&lt;/li&gt;
&lt;li data-end=&quot;593&quot; data-start=&quot;556&quot; data-section-id=&quot;1vvotvg&quot;&gt;Adaptive AUTOSAR (자율주행, 고성능 시스템 대응)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;610&quot; data-start=&quot;595&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Classic AUTOSAR&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;677&quot; data-start=&quot;612&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;623&quot; data-start=&quot;612&quot; data-section-id=&quot;334kd6&quot;&gt;RTOS 기반&lt;/li&gt;
&lt;li data-end=&quot;632&quot; data-start=&quot;624&quot; data-section-id=&quot;129s607&quot;&gt;C 언어&lt;/li&gt;
&lt;li data-end=&quot;654&quot; data-start=&quot;633&quot; data-section-id=&quot;e5178m&quot;&gt;적용: 샤시, 파워트레인, 진단&lt;/li&gt;
&lt;li data-end=&quot;677&quot; data-start=&quot;655&quot; data-section-id=&quot;1473vza&quot;&gt;특징: 실시간성, 경량, 고신뢰성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;695&quot; data-start=&quot;679&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Adaptive AUTOSAR&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;782&quot; data-start=&quot;697&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;697&quot; data-section-id=&quot;1htpkrl&quot;&gt;POSIX 기반 OS&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;713&quot; data-section-id=&quot;11bwpv3&quot;&gt;C++, 일부 Python&lt;/li&gt;
&lt;li data-end=&quot;754&quot; data-start=&quot;732&quot; data-section-id=&quot;vs320t&quot;&gt;적용: IVI, 자율주행, V2X&lt;/li&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;755&quot; data-section-id=&quot;1ocwyt1&quot;&gt;특징: 고성능 처리, 유연성, OTA 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;797&quot; data-start=&quot;784&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR 개발 과정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;971&quot; data-start=&quot;799&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;823&quot; data-start=&quot;799&quot; data-section-id=&quot;1g22igk&quot;&gt;자동차 SW는 신뢰성과 안전성이 핵심&lt;/li&gt;
&lt;li data-end=&quot;848&quot; data-start=&quot;824&quot; data-section-id=&quot;1mxmhx7&quot;&gt;직접 코딩 최소화 &amp;rarr; 오류 감소 목적&lt;/li&gt;
&lt;li data-end=&quot;893&quot; data-start=&quot;849&quot; data-section-id=&quot;n4ga6j&quot;&gt;설계 기반 자동 코드 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;893&quot; data-start=&quot;872&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;893&quot; data-start=&quot;872&quot; data-section-id=&quot;1y3khjd&quot;&gt;오류 발생 시 설계 문제로 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;971&quot; data-start=&quot;799&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;894&quot; data-section-id=&quot;17imldx&quot;&gt;Top-Down 방식 개발
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;952&quot; data-start=&quot;917&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;928&quot; data-start=&quot;917&quot; data-section-id=&quot;1estp8p&quot;&gt;컴포넌트 정의&lt;/li&gt;
&lt;li data-end=&quot;952&quot; data-start=&quot;933&quot; data-section-id=&quot;1trbxc4&quot;&gt;컴포넌트 간 통신 구조 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;987&quot; data-start=&quot;973&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR 플랫폼 구조&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1045&quot; data-start=&quot;989&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1002&quot; data-start=&quot;989&quot; data-section-id=&quot;15tbm0g&quot;&gt;개발 생산성 향상&lt;/li&gt;
&lt;li data-end=&quot;1020&quot; data-start=&quot;1003&quot; data-section-id=&quot;1rx6fd8&quot;&gt;표준 준수로 안전성 확보&lt;/li&gt;
&lt;li data-end=&quot;1045&quot; data-start=&quot;1021&quot; data-section-id=&quot;jch3zd&quot;&gt;HW 독립 구조 &amp;rarr; SW 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1064&quot; data-start=&quot;1047&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Application Layer&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1232&quot; data-start=&quot;1066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1087&quot; data-start=&quot;1066&quot; data-section-id=&quot;u9ba7b&quot;&gt;HW와 독립적인 응용 SW 정의&lt;/li&gt;
&lt;li data-end=&quot;1116&quot; data-start=&quot;1088&quot; data-section-id=&quot;nc1u96&quot;&gt;AUTOSAR Interface를 통해 통신&lt;/li&gt;
&lt;li data-end=&quot;1150&quot; data-start=&quot;1117&quot; data-section-id=&quot;1nyrvyy&quot;&gt;ECU 독립적인 Interface Mapping 제공&lt;/li&gt;
&lt;li data-end=&quot;1232&quot; data-start=&quot;1151&quot; data-section-id=&quot;18k7wg2&quot;&gt;RTE 표준 인터페이스만 사용하여 SWC 개발 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1232&quot; data-start=&quot;1188&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1207&quot; data-start=&quot;1188&quot; data-section-id=&quot;le75jg&quot;&gt;통신 구조 몰라도 개발 가능&lt;/li&gt;
&lt;li data-end=&quot;1232&quot; data-start=&quot;1212&quot; data-section-id=&quot;s309t2&quot;&gt;통신 구조 변경에도 영향 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1251&quot; data-start=&quot;1234&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AUTOSAR Interface&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1300&quot; data-start=&quot;1253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1276&quot; data-start=&quot;1253&quot; data-section-id=&quot;orf989&quot;&gt;사용자 설정 기반 API 자동 생성&lt;/li&gt;
&lt;li data-end=&quot;1300&quot; data-start=&quot;1277&quot; data-section-id=&quot;1sdx8cv&quot;&gt;포트, 데이터 정의 &amp;rarr; API 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1332&quot; data-start=&quot;1302&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Standardized AUTOSAR Interface&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1373&quot; data-start=&quot;1334&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1355&quot; data-start=&quot;1334&quot; data-section-id=&quot;1vlf2ss&quot;&gt;표준에서 정의된 인터페이스 사용&lt;/li&gt;
&lt;li data-end=&quot;1373&quot; data-start=&quot;1356&quot; data-section-id=&quot;s5su39&quot;&gt;동일한 API 구조 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1395&quot; data-start=&quot;1375&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BSW (Basic Software)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1474&quot; data-start=&quot;1397&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1422&quot; data-start=&quot;1397&quot; data-section-id=&quot;1jnxfvr&quot;&gt;애플리케이션의 직접적인 HW 접근 차단&lt;/li&gt;
&lt;li data-end=&quot;1436&quot; data-start=&quot;1423&quot; data-section-id=&quot;1wu7rj8&quot;&gt;계층 구조로 구성&lt;/li&gt;
&lt;li data-end=&quot;1474&quot; data-start=&quot;1437&quot; data-section-id=&quot;vxdwua&quot;&gt;단점: 함수 호출 증가 &amp;rarr; 실행 시간 증가 &amp;rarr; 실시간성 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1496&quot; data-start=&quot;1476&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;What are the benefit&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1881&quot; data-start=&quot;1498&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1611&quot; data-start=&quot;1498&quot; data-section-id=&quot;11twqvp&quot;&gt;SW Reusability
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1611&quot; data-start=&quot;1521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1538&quot; data-start=&quot;1521&quot; data-section-id=&quot;1k61j8y&quot;&gt;HW 독립적인 SW 설계&lt;/li&gt;
&lt;li data-end=&quot;1562&quot; data-start=&quot;1543&quot; data-section-id=&quot;1d6fc79&quot;&gt;높은 재사용성 &amp;rarr; 비용 절감&lt;/li&gt;
&lt;li data-end=&quot;1583&quot; data-start=&quot;1567&quot; data-section-id=&quot;j3tiev&quot;&gt;SWC 간 안정적 연결&lt;/li&gt;
&lt;li data-end=&quot;1611&quot; data-start=&quot;1588&quot; data-section-id=&quot;1dsozyi&quot;&gt;HW 변경 시에도 SW 재사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1613&quot; data-section-id=&quot;evzhxk&quot;&gt;SW Safety
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1675&quot; data-start=&quot;1631&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1648&quot; data-start=&quot;1631&quot; data-section-id=&quot;15o7s81&quot;&gt;검증된 SW 재사용 가능&lt;/li&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1653&quot; data-section-id=&quot;ld9wop&quot;&gt;표준 프로세스를 통한 안전성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1881&quot; data-start=&quot;1677&quot; data-section-id=&quot;1q43qrf&quot;&gt;Cost Efficiency
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1881&quot; data-start=&quot;1701&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1796&quot; data-start=&quot;1701&quot; data-section-id=&quot;blpk9v&quot;&gt;OEM 측면
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1796&quot; data-start=&quot;1720&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1738&quot; data-start=&quot;1720&quot; data-section-id=&quot;vw463s&quot;&gt;재사용으로 개발 기간 단축&lt;/li&gt;
&lt;li data-end=&quot;1770&quot; data-start=&quot;1747&quot; data-section-id=&quot;xai8xu&quot;&gt;ARXML 기반 명확한 커뮤니케이션&lt;/li&gt;
&lt;li data-end=&quot;1796&quot; data-start=&quot;1779&quot; data-section-id=&quot;12258jg&quot;&gt;다양한 부품사 통합 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1881&quot; data-start=&quot;1801&quot; data-section-id=&quot;j9q9os&quot;&gt;Supplier 측면
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1881&quot; data-start=&quot;1825&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1842&quot; data-start=&quot;1825&quot; data-section-id=&quot;1c0rh0y&quot;&gt;다양한 OEM 대응 가능&lt;/li&gt;
&lt;li data-end=&quot;1881&quot; data-start=&quot;1851&quot; data-section-id=&quot;12m3jkn&quot;&gt;AUTOSAR 기반 &amp;rarr; 타 OEM에도 공급 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2267&quot; data-start=&quot;2254&quot; data-section-id=&quot;82567q&quot; data-ke-size=&quot;size26&quot;&gt;AUTOSAR OS&lt;/h2&gt;
&lt;p data-end=&quot;2280&quot; data-start=&quot;2269&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OSEK/VDX 개요&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2451&quot; data-start=&quot;2282&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2451&quot; data-start=&quot;2282&quot; data-section-id=&quot;my31f3&quot;&gt;Real-time 시스템
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2451&quot; data-start=&quot;2305&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2383&quot; data-start=&quot;2305&quot; data-section-id=&quot;g70qcn&quot;&gt;Hard Real-time
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2383&quot; data-start=&quot;2332&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2358&quot; data-start=&quot;2332&quot; data-section-id=&quot;1x80232&quot;&gt;반드시 지켜야 하는 Deadline 존재&lt;/li&gt;
&lt;li data-end=&quot;2383&quot; data-start=&quot;2367&quot; data-section-id=&quot;2wwos&quot;&gt;미충족 시 시스템 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2451&quot; data-start=&quot;2389&quot; data-section-id=&quot;1v01886&quot;&gt;Soft Real-time
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2451&quot; data-start=&quot;2416&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2428&quot; data-start=&quot;2416&quot; data-section-id=&quot;mht4f9&quot;&gt;성능 저하 허용&lt;/li&gt;
&lt;li data-end=&quot;2451&quot; data-start=&quot;2437&quot; data-section-id=&quot;19p32iv&quot;&gt;예: 영상 스트리밍&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2464&quot; data-start=&quot;2453&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OSEK/VDX OS&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2696&quot; data-start=&quot;2466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2525&quot; data-start=&quot;2466&quot; data-section-id=&quot;1kbkgno&quot;&gt;Task
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2525&quot; data-start=&quot;2479&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2497&quot; data-start=&quot;2479&quot; data-section-id=&quot;1ywj94l&quot;&gt;OS가 관리하는 실행 단위&lt;/li&gt;
&lt;li data-end=&quot;2525&quot; data-start=&quot;2502&quot; data-section-id=&quot;1x2k22s&quot;&gt;복잡한 기능을 여러 Task로 분할&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2696&quot; data-start=&quot;2527&quot; data-section-id=&quot;iph7el&quot;&gt;Task State Model
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2696&quot; data-start=&quot;2552&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2569&quot; data-start=&quot;2552&quot; data-section-id=&quot;1b9rnh0&quot;&gt;Task 상태 변화 존재&lt;/li&gt;
&lt;li data-end=&quot;2604&quot; data-start=&quot;2574&quot; data-section-id=&quot;zm6ra2&quot;&gt;Basic Task / Extended Task&lt;/li&gt;
&lt;li data-end=&quot;2643&quot; data-start=&quot;2610&quot; data-section-id=&quot;zvcz8a&quot;&gt;Basic Task
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2643&quot; data-start=&quot;2633&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2643&quot; data-start=&quot;2633&quot; data-section-id=&quot;1dehgoa&quot;&gt;이벤트 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2696&quot; data-start=&quot;2649&quot; data-section-id=&quot;dltj10&quot;&gt;Extended Task
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2696&quot; data-start=&quot;2675&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2696&quot; data-start=&quot;2675&quot; data-section-id=&quot;yv2yk9&quot;&gt;Event 기반 대기 상태 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2698&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task - Scheduling&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2827&quot; data-start=&quot;2717&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2764&quot; data-start=&quot;2717&quot; data-section-id=&quot;1qj62rj&quot;&gt;Full Preemptive
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2764&quot; data-start=&quot;2741&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2764&quot; data-start=&quot;2741&quot; data-section-id=&quot;y667ne&quot;&gt;높은 우선순위 Task가 즉시 선점&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2808&quot; data-start=&quot;2766&quot; data-section-id=&quot;3qku4h&quot;&gt;Non Preemptive
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2808&quot; data-start=&quot;2789&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2808&quot; data-start=&quot;2789&quot; data-section-id=&quot;17d9kwo&quot;&gt;현재 Task 종료까지 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2827&quot; data-start=&quot;2810&quot; data-section-id=&quot;g4wwph&quot;&gt;우선순위는 개발자가 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2853&quot; data-start=&quot;2829&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task - Context Switching&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3021&quot; data-start=&quot;2855&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2903&quot; data-start=&quot;2855&quot; data-section-id=&quot;16f2b6s&quot;&gt;Context
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2903&quot; data-start=&quot;2871&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2903&quot; data-start=&quot;2871&quot; data-section-id=&quot;1ev7rks&quot;&gt;실행 중 Task 상태 정보 (Register 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2949&quot; data-start=&quot;2905&quot; data-section-id=&quot;1m8gd80&quot;&gt;Context Save
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2949&quot; data-start=&quot;2926&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2949&quot; data-start=&quot;2926&quot; data-section-id=&quot;1muto5l&quot;&gt;현재 Task 상태를 메모리에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2996&quot; data-start=&quot;2951&quot; data-section-id=&quot;1b9l3p5&quot;&gt;Context Load
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2996&quot; data-start=&quot;2972&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2996&quot; data-start=&quot;2972&quot; data-section-id=&quot;1aufqiv&quot;&gt;새로운 Task 상태를 MCU에 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3021&quot; data-start=&quot;2998&quot; data-section-id=&quot;q582v7&quot;&gt;Switching 시간 최소화 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3056&quot; data-start=&quot;3023&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task - PreTaskHook / PostTaskHook&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3103&quot; data-start=&quot;3058&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3083&quot; data-start=&quot;3058&quot; data-section-id=&quot;w3uwwz&quot;&gt;Task 실행 전/후 사용자 정의 루틴&lt;/li&gt;
&lt;li data-end=&quot;3103&quot; data-start=&quot;3084&quot; data-section-id=&quot;1tw434r&quot;&gt;디버깅 및 시간 측정에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-end=&quot;3118&quot; data-start=&quot;3105&quot; data-section-id=&quot;197qq1t&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3118&quot; data-start=&quot;3105&quot; data-section-id=&quot;197qq1t&quot; data-ke-size=&quot;size23&quot;&gt;Interrupt&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3268&quot; data-start=&quot;3120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3180&quot; data-start=&quot;3120&quot; data-section-id=&quot;126yzut&quot;&gt;Interrupt
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3180&quot; data-start=&quot;3138&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3154&quot; data-start=&quot;3138&quot; data-section-id=&quot;e3njqc&quot;&gt;외부 장치 이벤트 발생&lt;/li&gt;
&lt;li data-end=&quot;3180&quot; data-start=&quot;3159&quot; data-section-id=&quot;4fphri&quot;&gt;예: CAN 수신, 타이머 만료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3214&quot; data-start=&quot;3182&quot; data-section-id=&quot;nher4y&quot;&gt;Exception
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3214&quot; data-start=&quot;3200&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3214&quot; data-start=&quot;3200&quot; data-section-id=&quot;mpq56a&quot;&gt;CPU 내부 이벤트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3268&quot; data-start=&quot;3216&quot; data-section-id=&quot;1bjugx0&quot;&gt;Trap
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3268&quot; data-start=&quot;3229&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3243&quot; data-start=&quot;3229&quot; data-section-id=&quot;am7lft&quot;&gt;소프트웨어 인터럽트&lt;/li&gt;
&lt;li data-end=&quot;3268&quot; data-start=&quot;3248&quot; data-section-id=&quot;1f4ocsy&quot;&gt;system call 시 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3282&quot; data-start=&quot;3270&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Interrupt 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3458&quot; data-start=&quot;3284&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3296&quot; data-start=&quot;3284&quot; data-section-id=&quot;lt4vwp&quot;&gt;Task를 선점&lt;/li&gt;
&lt;li data-end=&quot;3372&quot; data-start=&quot;3298&quot; data-section-id=&quot;146wyk4&quot;&gt;Category 1
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3372&quot; data-start=&quot;3317&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3331&quot; data-start=&quot;3317&quot; data-section-id=&quot;7gsolx&quot;&gt;OS 서비스 미사용&lt;/li&gt;
&lt;li data-end=&quot;3342&quot; data-start=&quot;3336&quot; data-section-id=&quot;1uoo4ss&quot;&gt;빠름&lt;/li&gt;
&lt;li data-end=&quot;3372&quot; data-start=&quot;3347&quot; data-section-id=&quot;1b2kgy3&quot;&gt;Task scheduling 영향 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3458&quot; data-start=&quot;3374&quot; data-section-id=&quot;1h7yk64&quot;&gt;Category 2
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3458&quot; data-start=&quot;3393&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3406&quot; data-start=&quot;3393&quot; data-section-id=&quot;lb3g19&quot;&gt;OS 서비스 사용&lt;/li&gt;
&lt;li data-end=&quot;3433&quot; data-start=&quot;3411&quot; data-section-id=&quot;hrdq7w&quot;&gt;Context 저장 필요 &amp;rarr; 느림&lt;/li&gt;
&lt;li data-end=&quot;3458&quot; data-start=&quot;3438&quot; data-section-id=&quot;241rew&quot;&gt;scheduling 영향 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3486&quot; data-start=&quot;3460&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Interrupt와 Task Scheduling&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3541&quot; data-start=&quot;3488&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3511&quot; data-start=&quot;3488&quot; data-section-id=&quot;458gmr&quot;&gt;Cat.2 종료 후 재스케줄링 수행&lt;/li&gt;
&lt;li data-end=&quot;3541&quot; data-start=&quot;3512&quot; data-section-id=&quot;1ws5u96&quot;&gt;모든 interrupt 종료 후 task 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3552&quot; data-start=&quot;3543&quot; data-section-id=&quot;70pw9h&quot; data-ke-size=&quot;size23&quot;&gt;Alarm&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3714&quot; data-start=&quot;3554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3578&quot; data-start=&quot;3554&quot; data-section-id=&quot;1kbkm8k&quot;&gt;Counter 기반 이벤트 발생 객체&lt;/li&gt;
&lt;li data-end=&quot;3651&quot; data-start=&quot;3580&quot; data-section-id=&quot;117i4nb&quot;&gt;특정 시점 도달 시 수행
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3651&quot; data-start=&quot;3602&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3614&quot; data-start=&quot;3602&quot; data-section-id=&quot;j8ekpo&quot;&gt;Task 활성화&lt;/li&gt;
&lt;li data-end=&quot;3631&quot; data-start=&quot;3619&quot; data-section-id=&quot;1azlppx&quot;&gt;Event 설정&lt;/li&gt;
&lt;li data-end=&quot;3651&quot; data-start=&quot;3636&quot; data-section-id=&quot;16f8ncc&quot;&gt;Callback 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3672&quot; data-start=&quot;3653&quot; data-section-id=&quot;100uaog&quot;&gt;주기적 Task 실행에 사용&lt;/li&gt;
&lt;li data-end=&quot;3714&quot; data-start=&quot;3674&quot; data-section-id=&quot;1twbtuw&quot;&gt;1 Tick = 1&amp;mu;s
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3714&quot; data-start=&quot;3695&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3714&quot; data-start=&quot;3695&quot; data-section-id=&quot;cynatk&quot;&gt;10000 Tick = 1초&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3728&quot; data-start=&quot;3716&quot; data-section-id=&quot;125cyq4&quot; data-ke-size=&quot;size23&quot;&gt;Resource&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3804&quot; data-start=&quot;3730&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3747&quot; data-start=&quot;3730&quot; data-section-id=&quot;1xv6cj5&quot;&gt;공유 자원 보호 메커니즘&lt;/li&gt;
&lt;li data-end=&quot;3804&quot; data-start=&quot;3749&quot; data-section-id=&quot;1g1jjwv&quot;&gt;종류
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3804&quot; data-start=&quot;3760&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3772&quot; data-start=&quot;3760&quot; data-section-id=&quot;16lw5xv&quot;&gt;Standard&lt;/li&gt;
&lt;li data-end=&quot;3789&quot; data-start=&quot;3777&quot; data-section-id=&quot;1odez67&quot;&gt;Internal&lt;/li&gt;
&lt;li data-end=&quot;3804&quot; data-start=&quot;3794&quot; data-section-id=&quot;1g8v1ux&quot;&gt;Linked&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3813&quot; data-start=&quot;3806&quot; data-ke-size=&quot;size16&quot;&gt;우선순위 역전&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3844&quot; data-start=&quot;3815&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3844&quot; data-start=&quot;3815&quot; data-section-id=&quot;haiotb&quot;&gt;낮은 우선순위 Task가 자원을 점유하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3871&quot; data-start=&quot;3846&quot; data-ke-size=&quot;size16&quot;&gt;Priority Ceiling Protocol&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3917&quot; data-start=&quot;3873&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3892&quot; data-start=&quot;3873&quot; data-section-id=&quot;1bt1uok&quot;&gt;자원 획득 시 우선순위 상승&lt;/li&gt;
&lt;li data-end=&quot;3917&quot; data-start=&quot;3893&quot; data-section-id=&quot;1nwuxns&quot;&gt;Release 시 원래 우선순위 복귀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3928&quot; data-start=&quot;3919&quot; data-section-id=&quot;6y0hz2&quot; data-ke-size=&quot;size23&quot;&gt;Error&lt;/h3&gt;
&lt;p data-end=&quot;3939&quot; data-start=&quot;3930&quot; data-ke-size=&quot;size16&quot;&gt;ErrorHook&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3965&quot; data-start=&quot;3941&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3965&quot; data-start=&quot;3941&quot; data-section-id=&quot;1u41ks9&quot;&gt;오류 발생 시 사용자 정의 처리 루틴&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/임베디드</category>
      <category>autosar</category>
      <category>ECU</category>
      <category>ISO26262</category>
      <category>OSEK</category>
      <category>RTOS</category>
      <category>기능안전</category>
      <category>소프트웨어플랫폼</category>
      <category>임베디드시스템</category>
      <category>차량소프트웨어</category>
      <category>차량제어</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/115</guid>
      <comments>https://xeungcoding.tistory.com/115#entry115comment</comments>
      <pubDate>Fri, 20 Mar 2026 09:09:15 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 2606: 바이러스</title>
      <link>https://xeungcoding.tistory.com/114</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 백준 2606: 바이러스 &lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;SILVER 3&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2606&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2606&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JdCaF/dJMb99Mkx6r/qKZIm4LADAURAVNihAAMNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JdCaF/dJMb99Mkx6r/qKZIm4LADAURAVNihAAMNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JdCaF/dJMb99Mkx6r/qKZIm4LADAURAVNihAAMNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJdCaF%2FdJMb99Mkx6r%2FqKZIm4LADAURAVNihAAMNK%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;579&quot; height=&quot;477&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;96&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;백준 2606번은 &lt;b&gt;컴퓨터 바이러스 문제&lt;/b&gt;로,&lt;br /&gt;1번 컴퓨터가 바이러스에 감염되었을 때 &lt;b&gt;연결된 다른 컴퓨터가 몇 대 감염되는지&lt;/b&gt; 구하는 문제다.&lt;/p&gt;
&lt;p data-end=&quot;96&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;150&quot; data-start=&quot;98&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터들이 네트워크로 연결되어 있기 때문에, 이를 &lt;b&gt;그래프 탐색 문제&lt;/b&gt;로 볼 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;167&quot; data-start=&quot;152&quot; data-ke-size=&quot;size16&quot;&gt;문제의 핵심은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;194&quot; data-start=&quot;169&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;179&quot; data-start=&quot;169&quot; data-section-id=&quot;djycl9&quot;&gt;컴퓨터 = 노드&lt;/li&gt;
&lt;li data-end=&quot;194&quot; data-start=&quot;180&quot; data-section-id=&quot;3dbn0t&quot;&gt;네트워크 연결 = 간선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;270&quot; data-start=&quot;196&quot; data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;그래프 탐색(DFS 또는 BFS)&lt;/b&gt; 을 이용해서 1번 컴퓨터에서 시작하여 &lt;b&gt;연결된 모든 컴퓨터를 방문&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;p data-end=&quot;316&quot; data-start=&quot;272&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;316&quot; data-start=&quot;272&quot; data-ke-size=&quot;size16&quot;&gt;이번 풀이에서는 &lt;b&gt;DFS(Depth First Search)&lt;/b&gt; 를 사용했다.&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;318&quot; data-ke-size=&quot;size16&quot;&gt;먼저 그래프를 &lt;b&gt;인접 리스트&lt;/b&gt; 형태로 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773208114706&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; graph;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 방문 여부를 확인하기 위해 배열을 사용했다.&lt;/p&gt;
&lt;pre id=&quot;code_1773208126033&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;bool&amp;gt; visited;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS는 다음과 같이 구현했다.&lt;/p&gt;
&lt;pre id=&quot;code_1773208147729&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dfs(int node)
{
    visited[node] = true;

    for (int i = 0; i &amp;lt; graph[node].size(); i++)
    {
        int next = graph[node][i];

        if (!visited[next])
            dfs(next);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;681&quot; data-ke-size=&quot;size16&quot;&gt;1번 컴퓨터부터 DFS를 시작하면 같은 네트워크로 연결된 모든 컴퓨터가 방문된다.&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;730&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 &lt;b&gt;1번 컴퓨터를 제외한 방문된 컴퓨터 수&lt;/b&gt;를 세면 감염된 컴퓨터 수가 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;구현 시 주의할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그래프는 양방향이다.&lt;/li&gt;
&lt;li&gt;마지막 cnt에서 수를 갱신할 때 1번 컴퓨터는 제외하도록 2번 노드부터 for문을 돌린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1773208221289&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; graph;
vector&amp;lt;bool&amp;gt; visited;

void dfs(int node)
{
	visited[node] = true;
	for (int i = 0; i &amp;lt; graph[node].size(); i++)
	{
		int next = graph[node][i];
		if (!visited[next])
			dfs(next);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n = 0, m = 0;
	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;

	graph.resize(n + 1);
	visited.resize(n + 1, false);
	for (int i = 0; i &amp;lt; m; i++)
	{
		int a = 0, b = 0;
		cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;

		graph[a].push_back(b);
		graph[b].push_back(a);
	}

	dfs(1);

	int cnt = 0;
	for (int i = 2; i &amp;lt;= n; i++)
	{
		if (visited[i])
			cnt++;
	}
	cout &amp;lt;&amp;lt; cnt;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>dfs</category>
      <category>구현</category>
      <category>그래프</category>
      <category>그래프탐색</category>
      <category>바이러스</category>
      <category>백준</category>
      <category>백준2606</category>
      <category>승코딩당당당</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/114</guid>
      <comments>https://xeungcoding.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 11 Mar 2026 14:50:34 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 10826: 피보나치 수 4</title>
      <link>https://xeungcoding.tistory.com/113</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 백준 10826: 피보나치 수 4&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;SILVER 5&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10826&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/10826&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pYwgF/dJMb99Mi4l5/hxk6Q5tUMyRGkSi84V0u7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pYwgF/dJMb99Mi4l5/hxk6Q5tUMyRGkSi84V0u7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pYwgF/dJMb99Mi4l5/hxk6Q5tUMyRGkSi84V0u7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpYwgF%2FdJMb99Mi4l5%2Fhxk6Q5tUMyRGkSi84V0u7k%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;611&quot; height=&quot;333&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;84&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;백준 10826번은 &lt;b&gt;N번째 피보나치 수를 출력하는 문제&lt;/b&gt;다.&lt;br /&gt;하지만 일반적인 피보나치 문제와 달리 값의 크기가 매우 커진다.&lt;/p&gt;
&lt;p data-end=&quot;84&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;86&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 N이 커지면 피보나치 값은 &lt;b&gt;수백 자리 이상의 정수&lt;/b&gt;가 되기 때문에long long 같은 기본 정수 타입으로는 저장할 수 없다.&lt;/p&gt;
&lt;p data-end=&quot;258&quot; data-start=&quot;172&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이 문제는 &lt;b&gt;큰 정수(Big Integer)&lt;/b&gt; 를 직접 구현해야 한다.&lt;br /&gt;이를 위해 &lt;b&gt;문자열(string)&lt;/b&gt; 을 이용해서 덧셈을 구현했다.&lt;/p&gt;
&lt;p data-end=&quot;258&quot; data-start=&quot;172&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;277&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;피보나치 점화식은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1773035979115&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;F(n) = F(n-1) + F(n-2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;372&quot; data-start=&quot;315&quot; data-ke-size=&quot;size16&quot;&gt;하지만 문자열끼리 바로 덧셈이 되지 않기 때문에 문자열 덧셈 함수 add()를 만들어 계산했다.&lt;/p&gt;
&lt;p data-end=&quot;372&quot; data-start=&quot;315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;396&quot; data-start=&quot;374&quot; data-ke-size=&quot;size16&quot;&gt;문자열 덧셈의 동작 방식은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;510&quot; data-start=&quot;398&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;435&quot; data-start=&quot;398&quot; data-section-id=&quot;s2jd&quot;&gt;두 문자열을 뒤집어서 &lt;b&gt;1의 자리부터 계산&lt;/b&gt;하도록 만든다.&lt;/li&gt;
&lt;li data-end=&quot;474&quot; data-start=&quot;436&quot; data-section-id=&quot;1rcpryr&quot;&gt;각 자리 숫자를 더하면서 &lt;b&gt;carry(올림)&lt;/b&gt; 를 처리한다.&lt;/li&gt;
&lt;li data-end=&quot;510&quot; data-start=&quot;475&quot; data-section-id=&quot;bzibl8&quot;&gt;결과 문자열을 다시 뒤집어서 정상적인 숫자 형태로 만든다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;544&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 구현하면 매우 큰 숫자도 문제없이 계산할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;544&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;546&quot; data-ke-size=&quot;size16&quot;&gt;이후 피보나치 수열은 &lt;b&gt;DP 방식&lt;/b&gt;으로 계산했다.&lt;/p&gt;
&lt;pre id=&quot;code_1773036002387&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;string&amp;gt; fibo(n + 1, &quot;0&quot;);
fibo[1] = &quot;1&quot;;

for (int i = 2; i &amp;lt;= n; i++)
    fibo[i] = add(fibo[i - 1], fibo[i - 2]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 덧셈을 이용해 이전 두 값을 더하면서 fibo[n]을 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;구현 시 주의할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 0인 경우 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 n이 0이라면 벡터 크기는 &lt;b&gt;1&lt;/b&gt;이 되고 유효한 인덱스는 fibo[0]뿐이다.&lt;br /&gt;그런데 바로 fibo[1] = &quot;1&quot;; 에 접근하면 &lt;b&gt;범위를 벗어나 &lt;span style=&quot;color: #ee2323;&quot;&gt;런타임 에러&lt;/span&gt;&lt;/b&gt;가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;큰 정수 덧셈을 쉽게 구현하기 위해 문자열을 뒤집어서 &lt;b&gt;1의 자리부터 계산&lt;/b&gt;하도록 하는 것이 중요하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대신 마지막에 결과 ret를 리턴할 때도 reverse를 해주어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773036116915&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;reverse(a.begin(), a.end());
reverse(b.begin(), b.end());&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1773036150179&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

string add(string a, string b)
{
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());

	string ret = &quot;&quot;;
	int carry = 0, index = 0;

	while (index &amp;lt; a.size() &amp;amp;&amp;amp; index &amp;lt; b.size())
	{
		int num = (a[index] - '0') + (b[index] - '0') + carry;
		carry = num / 10;
		num %= 10;
		ret += char(num + '0');
		index++;
	}
	while (index &amp;lt; a.size())
	{
		int num = (a[index] - '0') + carry;
		carry = num / 10;
		num %= 10;
		ret += char(num + '0');
		index++;
	}
	while (index &amp;lt; b.size())
	{
		int num = (b[index] - '0') + carry;
		carry = num / 10;
		num %= 10;
		ret += char(num + '0');
		index++;
	}

	if (carry &amp;gt; 0)
		ret += char(carry + '0');

	reverse(ret.begin(), ret.end());
	return ret;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n = 0;
	cin &amp;gt;&amp;gt; n;

	vector&amp;lt;string&amp;gt; fibo(n + 1, &quot;0&quot;);
	if (n != 0)
	{
		fibo[1] = &quot;1&quot;;
		for (int i = 2; i &amp;lt;= n; i++)
			fibo[i] = add(fibo[i - 1], fibo[i - 2]);
	}
	cout &amp;lt;&amp;lt; fibo[n];

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>DP</category>
      <category>구현</category>
      <category>문자열덧셈</category>
      <category>백준</category>
      <category>백준10826</category>
      <category>큰정수</category>
      <category>피보나치수4</category>
      <category>피보나치수열</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/113</guid>
      <comments>https://xeungcoding.tistory.com/113#entry113comment</comments>
      <pubDate>Mon, 9 Mar 2026 15:02:51 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 2749: 피보나치 수 3</title>
      <link>https://xeungcoding.tistory.com/112</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;[C++] 백준 2749: 피보나치 수 3&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;GOLD 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2749&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2749&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ed0xTm/dJMcaf6PJIF/SZrHQKfgLoxBmjkRBxPnGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ed0xTm/dJMcaf6PJIF/SZrHQKfgLoxBmjkRBxPnGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ed0xTm/dJMcaf6PJIF/SZrHQKfgLoxBmjkRBxPnGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fed0xTm%2FdJMcaf6PJIF%2FSZrHQKfgLoxBmjkRBxPnGK%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;704&quot; height=&quot;376&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;접근 방법&lt;/span&gt;&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;67&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;백준 2749번은 &lt;b&gt;N번째 피보나치 수를 1,000,000으로 나눈 나머지&lt;/b&gt;를 구하는 문제다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;173&quot; data-start=&quot;69&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;173&quot; data-start=&quot;69&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제의 핵심은 &lt;b&gt;N의 범위가 매우 크다&lt;/b&gt;는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;N은 최대 10^18까지 주어질 수 있기 때문에, 단순히 피보나치 수열을 N까지 계산하는 방법으로는 해결할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;175&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;175&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 문제를 해결하기 위해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;피사노 주기(Pisano Period)&lt;/b&gt;&lt;/span&gt; 개념을 이용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;피보나치 수열을 어떤 수 &lt;span aria-hidden=&quot;true&quot;&gt;m&lt;/span&gt;으로 나눈 나머지는 &lt;b&gt;반복되는 주기&lt;/b&gt;를 가진다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 반복되는 길이를 &lt;b&gt;피사노 주기&lt;/b&gt;라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 문제를 풀기 전에 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;백준 9471번&lt;/span&gt;&lt;/b&gt; 문제를 먼저 풀고 오는 것을 추천한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;관련 포스팅:&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;303&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://xeungcoding.tistory.com/111&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://xeungcoding.tistory.com/111&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772980402331&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;[C++] 백준 9471: 피사노 주기&quot; data-og-description=&quot;문제[C++] 백준 9471: 피사노 주기 SILVER 4https://www.acmicpc.net/problem/9471 접근 방법백준 9471번은 피사노 주기(Pisano Period) 를 구하는 문제다.피보나치 수열을 어떤 정수 m으로 나눈 나머지를 계속 계산하&quot; data-og-host=&quot;xeungcoding.tistory.com&quot; data-og-source-url=&quot;https://xeungcoding.tistory.com/111&quot; data-og-url=&quot;https://xeungcoding.tistory.com/111&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbPq1T/dJMb9c9vUVV/zhcyO95tHG8w91EE14V5oK/img.png?width=800&amp;amp;height=634&amp;amp;face=0_0_800_634,https://scrap.kakaocdn.net/dn/biBllH/dJMb9cBF9k9/7vH1CEwZPHLvZtfz9oxvV0/img.png?width=800&amp;amp;height=634&amp;amp;face=0_0_800_634,https://scrap.kakaocdn.net/dn/XkqLq/dJMb9hCZmvk/x3TjIkFZZ4npAJknhYznR1/img.jpg?width=1516&amp;amp;height=1516&amp;amp;face=0_0_1516_1516&quot;&gt;&lt;a href=&quot;https://xeungcoding.tistory.com/111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://xeungcoding.tistory.com/111&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbPq1T/dJMb9c9vUVV/zhcyO95tHG8w91EE14V5oK/img.png?width=800&amp;amp;height=634&amp;amp;face=0_0_800_634,https://scrap.kakaocdn.net/dn/biBllH/dJMb9cBF9k9/7vH1CEwZPHLvZtfz9oxvV0/img.png?width=800&amp;amp;height=634&amp;amp;face=0_0_800_634,https://scrap.kakaocdn.net/dn/XkqLq/dJMb9hCZmvk/x3TjIkFZZ4npAJknhYznR1/img.jpg?width=1516&amp;amp;height=1516&amp;amp;face=0_0_1516_1516');&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;[C++] 백준 9471: 피사노 주기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제[C++] 백준 9471: 피사노 주기 SILVER 4https://www.acmicpc.net/problem/9471 접근 방법백준 9471번은 피사노 주기(Pisano Period) 를 구하는 문제다.피보나치 수열을 어떤 정수 m으로 나눈 나머지를 계속 계산하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;xeungcoding.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;
&lt;p data-end=&quot;310&quot; data-start=&quot;305&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예를 들어, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;피보나치 수열을 1,000,000으로 나눈 나머지는 &lt;/span&gt;&lt;b&gt;1,500,000의 주기&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;를 가진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;375&quot; data-start=&quot;373&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;즉, 아래의&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;성질을 이용하면 N이 매우 커도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;주기 범위 안으로 줄여서 계산&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333; text-align: start;&quot;&gt;할 수 있다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;375&quot; data-start=&quot;373&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;F(n) % 1,000,000 = F(n % 1,500,000) % 1,000,000&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;224&quot; data-end=&quot;288&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;503&quot; data-start=&quot;485&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;따라서 풀이 과정은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;577&quot; data-start=&quot;505&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;505&quot; data-section-id=&quot;10nrmfe&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;피사노 주기 계산&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;554&quot; data-start=&quot;518&quot; data-section-id=&quot;19pqkcn&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;n % 주기 로 실제 계산해야 할 피보나치 인덱스 구하기&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;577&quot; data-start=&quot;555&quot; data-section-id=&quot;18gw8qs&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 인덱스까지 피보나치 수열 계산&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;상세 아이디&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1.&amp;nbsp; 피사노 주기 구하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;피사노 주기는 다음 성질을 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772979974755&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k(m) &amp;le; m&amp;sup2; - 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;따라서 다음처럼 반복하면서 다시 (1, 1)이 등장하는 순간을 찾으면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772979988015&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int pisano(LL n)
{
    LL previous = 1, current = 1;
    LL k = 0;

    for (LL i = 0; i &amp;lt; n * n; i++)
    {
        k = (previous + current) % n;
        previous = current;
        current = k;

        if (previous == 1 &amp;amp;&amp;amp; current == 1)
            return i + 1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;m = 1,000,000일 때 피사노 주기가 1,500,000 이기 때문에,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;b&gt;pisano 함수를 사용하지 않고&lt;/b&gt;&amp;nbsp;아래와 같이&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000; text-align: start;&quot;&gt;값을 직접 사용해도 된다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772980159483&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LL k = 1500000;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1180&quot; data-start=&quot;1158&quot; data-section-id=&quot;emvq59&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;2. 실제 계산할 인덱스 구하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1202&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;주기를 이용하면 계산해야 할 인덱스는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1772980219230&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LL index = n % k;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;즉, N번째 피보나치 수를 직접 구할 필요 없이 index번째 피보나치 수만 계산하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;3. 피보나치 계산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772980247056&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;LL&amp;gt; fibo(index + 2, 0);
fibo[1] = 1;

for (LL i = 2; i &amp;lt;= index; i++)
    fibo[i] = (fibo[i - 1] + fibo[i - 2]) % 1000000;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;피보나치 값 자체는 매우 커지므로 항상 % 1000000을 해주면서 계산해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1049&quot; data-end=&quot;1067&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;구현 시 주의할 점&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;N이 최대 10^18이기 때문에 반드시 long long을 사용해야 한다.&lt;/li&gt;
&lt;li&gt;피보나치 값을 그대로 계산하면 안 된다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피보나치 수는 매우 빠르게 커지므로 매 단계마다 &lt;b&gt;mod 연산&lt;/b&gt;을 해줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;피사노 주기를 이용해야 시간 내 해결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;코드&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1772980329820&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

typedef long long LL;

int pisano(LL n)
{
	LL previous = 1, current = 1;
	LL k = 0;
	for (LL i = 0; i &amp;lt; n * n; i++)  // k(m) &amp;lt;= m^2 - 1
	{
		k = (previous + current) % n;
		previous = current;
		current = k;

		if (previous == 1 &amp;amp;&amp;amp; current == 1)
			return i + 1;
	}
	return 0;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	LL n = 0;
	cin &amp;gt;&amp;gt; n;

	LL k = pisano(1000000);  // 반복되는 주기 = 1,500,000
	LL index = n % k;

	vector&amp;lt;LL&amp;gt; fibo(index + 2, 0);
	fibo[1] = 1;
	for (LL i = 2; i &amp;lt;= index; i++)
		fibo[i] = (fibo[i - 1] + fibo[i - 2]) % 1000000;

	cout &amp;lt;&amp;lt; fibo[index];
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>구현</category>
      <category>백준</category>
      <category>백준2749</category>
      <category>수학</category>
      <category>승코딩당당당</category>
      <category>피보나치수3</category>
      <category>피보나치수열</category>
      <category>피사노주기</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/112</guid>
      <comments>https://xeungcoding.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 8 Mar 2026 23:34:01 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 9471: 피사노 주기</title>
      <link>https://xeungcoding.tistory.com/111</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 백준 9471: 피사노 주기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;SILVER 4&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9471&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/9471&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5LxU/dJMcajg27Ds/ZqYcSawLnKbuaE8oVLlM81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5LxU/dJMcajg27Ds/ZqYcSawLnKbuaE8oVLlM81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5LxU/dJMcajg27Ds/ZqYcSawLnKbuaE8oVLlM81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5LxU%2FdJMcajg27Ds%2FZqYcSawLnKbuaE8oVLlM81%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;678&quot; height=&quot;538&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;58&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;백준 9471번은 &lt;b&gt;피사노 주기(Pisano Period)&lt;/b&gt; 를 구하는 문제다.&lt;/p&gt;
&lt;p data-end=&quot;156&quot; data-start=&quot;60&quot; data-ke-size=&quot;size16&quot;&gt;피보나치 수열을 어떤 정수 &lt;span&gt;&lt;span&gt;m&lt;/span&gt;&lt;/span&gt;으로 나눈 나머지를 계속 계산하면 수열이 &lt;b&gt;일정한 주기를 가지고 반복&lt;/b&gt;된다.&lt;br /&gt;이 반복되는 길이를 &lt;b&gt;피사노 주기&lt;/b&gt;라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;164&quot; data-start=&quot;158&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;164&quot; data-start=&quot;158&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 피보나치 수열을 3으로 나눈 나머지를 보면&lt;/p&gt;
&lt;pre id=&quot;code_1772893729657&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 1 2 0 2 2 1 0 1 1 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 특정 구간 이후부터 동일한 패턴이 반복된다.&lt;br /&gt;이 반복되는 길이가 바로 &lt;b&gt;피사노 주기 k(m)&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;상세 아이디&lt;/h2&gt;
&lt;p data-end=&quot;403&quot; data-start=&quot;384&quot; data-ke-size=&quot;size16&quot;&gt;피사노 주기는 다음 성질을 가진다.&lt;/p&gt;
&lt;blockquote data-end=&quot;420&quot; data-start=&quot;405&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;407&quot; data-ke-size=&quot;size16&quot;&gt;k(m) &amp;le; m&amp;sup2; &amp;minus; 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;422&quot; data-ke-size=&quot;size16&quot;&gt;즉, 최대 &lt;span&gt;&lt;span&gt;m^2&lt;/span&gt;&lt;/span&gt;번 정도만 확인하면 반드시 주기가 발견된다.&lt;br /&gt;그래서 반복문을 m * m 범위까지만 돌려서 주기를 찾는다.&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;499&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;499&quot; data-ke-size=&quot;size16&quot;&gt;피보나치 수열을 계속 계산하면서 &lt;b&gt;나머지 값만 유지&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1772893809417&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LL previous = 1, current = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;초기 피보나치 값은 F1 = 1, F2 = 1 이다.&lt;/p&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;이후 다음 값은 아래로 계산한다.&lt;/p&gt;
&lt;pre id=&quot;code_1772893831266&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k = (previous + current) % m;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;그런 후, 아래와 같이 갱신하면서 계속 진행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1772893866440&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;previous = current
current = k&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;주기 판별:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;790&quot; data-start=&quot;757&quot; data-ke-size=&quot;size16&quot;&gt;피사노 주기는 &lt;b&gt;1, 1이 다시 등장하는 순간&lt;/b&gt; 시작된다.&lt;/p&gt;
&lt;p data-end=&quot;811&quot; data-start=&quot;792&quot; data-ke-size=&quot;size16&quot;&gt;따라서 다음 조건을 확인하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1772893892030&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (previous == 1 &amp;amp;&amp;amp; current == 1)
    return i + 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순간이 &lt;b&gt;주기의 길이&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;구현 시 주의할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1221&quot; data-end=&quot;1287&quot;&gt;피보나치 값을 그대로 계산하면 안 된다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1000&quot; data-start=&quot;952&quot;&gt;피보나치 수는 매우 빠르게 커지기 때문에 값 자체를 저장하면 오버플로우가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 타입은 long long으로 해주어야 정상적으로 출력된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에 그냥 int로 했다가 테스트 케이스 4번이 0으로 출력되는 현상이 발생했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1772894012856&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

typedef long long LL;

LL pisano(LL m)
{
	LL previous = 1, current = 1;
	LL k = 0;
	for (LL i = 0; i &amp;lt; m * m; i++)  // k(m) &amp;lt;= m^2 - 1
	{
		k = (previous + current) % m;
		previous = current;
		current = k;

		if (previous == 1 &amp;amp;&amp;amp; current == 1)
			return i + 1;
	}
	return 0;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int p = 0;
	cin &amp;gt;&amp;gt; p;

	for (int i = 0; i &amp;lt; p; i++)
	{
		LL n = 0, m = 0;
		cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;

		cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; pisano(m) &amp;lt;&amp;lt; '\n';
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>구현</category>
      <category>모듈러연산</category>
      <category>백준</category>
      <category>백준9471</category>
      <category>수학</category>
      <category>승코딩당당당</category>
      <category>피보나치수열</category>
      <category>피사노주기</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/111</guid>
      <comments>https://xeungcoding.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 7 Mar 2026 23:33:50 +0900</pubDate>
    </item>
    <item>
      <title>[최적화] 임베디드 C 코드 최적화 전략 정리</title>
      <link>https://xeungcoding.tistory.com/110</link>
      <description>&lt;h3 data-end=&quot;78&quot; data-start=&quot;70&quot; data-ke-size=&quot;size23&quot;&gt;  개요&lt;/h3&gt;
&lt;p data-end=&quot;277&quot; data-start=&quot;80&quot; data-ke-size=&quot;size16&quot;&gt;임베디드 시스템은 제한된 메모리와 낮은 연산 자원을 기반으로 동작하는 경우가 많기 때문에, 동일한 기능을 구현하더라도 &lt;b&gt;코드를 어떻게 작성하느냐에 따라 성능과 자원 사용량이 크게 달라진다.&lt;/b&gt; 특히 MCU 환경에서는 ROM과 RAM이 모두 한정되어 있고, 실행 속도 또한 시스템 안정성과 직결되기 때문에 C 코드 최적화는 선택이 아니라 필수에 가깝다.&lt;/p&gt;
&lt;p data-end=&quot;277&quot; data-start=&quot;80&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;516&quot; data-start=&quot;279&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 임베디드 C 코드 최적화를 &lt;b&gt;메모리 관점, 실행 속도 관점, 데이터 처리 관점, 흐름 제어 관점&lt;/b&gt;으로 나누어 정리하였다. 단순히 &amp;ldquo;빠르게 만드는 방법&amp;rdquo;이 아니라, 메모리 절약과 실행 속도 향상 사이의 균형을 어떻게 잡아야 하는지에 초점을 두고 살펴본다. 또한 자료형 선택, 타입 변환 최소화, 비트 연산 활용, 루프 최적화, 인라인 함수 사용 등 실제 현장에서 자주 적용되는 기법들을 체계적으로 정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;123&quot; data-start=&quot;108&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;임베디드 C 코드 최적화&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p data-end=&quot;145&quot; data-start=&quot;125&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;145&quot; data-start=&quot;125&quot; data-ke-size=&quot;size23&quot;&gt;메모리관점에서의 C코드 최적화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;746&quot; data-start=&quot;147&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;147&quot;&gt;ROM 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;449&quot; data-start=&quot;161&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;208&quot; data-start=&quot;161&quot;&gt;프로그램 코드, 상수, 초기화된 전역 변수와 정적 변수는 ROM 영역에 저장된다.&lt;/li&gt;
&lt;li data-end=&quot;235&quot; data-start=&quot;213&quot;&gt;코드와 상수를 줄이는 것이 핵심이다.&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;240&quot;&gt;방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;449&quot; data-start=&quot;253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;263&quot; data-start=&quot;253&quot;&gt;데드 코드 제거&lt;/li&gt;
&lt;li data-end=&quot;311&quot; data-start=&quot;272&quot;&gt;매크로나 인라인 함수의 무분별한 사용 지양 (코드 크기 증가 가능)&lt;/li&gt;
&lt;li data-end=&quot;339&quot; data-start=&quot;320&quot;&gt;불필요한 전역 변수 초기화 제거&lt;/li&gt;
&lt;li data-end=&quot;371&quot; data-start=&quot;348&quot;&gt;상수나 전역 변수 대신 지역 변수 사용&lt;/li&gt;
&lt;li data-end=&quot;409&quot; data-start=&quot;380&quot;&gt;표현을 간결하게 작성하고 불필요한 중간 연산 생략&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;418&quot;&gt;표준 라이브러리 사용 최소화 (코드 크기 증가 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;451&quot;&gt;RAM 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;746&quot; data-start=&quot;465&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;465&quot;&gt;RAM에는 초기화되지 않은 전역 변수, 정적 변수, 지역 변수, 함수 인자, 함수 호출 시 발생하는 context(Stack/Heap)가 포함된다.&lt;/li&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;554&quot;&gt;Stack 사용량을 줄이는 것이 중요하다.&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;584&quot;&gt;방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;746&quot; data-start=&quot;597&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;613&quot; data-start=&quot;597&quot;&gt;함수 호출 깊이를 줄인다.&lt;/li&gt;
&lt;li data-end=&quot;661&quot; data-start=&quot;622&quot;&gt;작은 함수는 매크로나 인라인으로 대체 (Stack 사용 감소 목적)&lt;/li&gt;
&lt;li data-end=&quot;689&quot; data-start=&quot;670&quot;&gt;구조체나 배열 대신 포인터 활용&lt;/li&gt;
&lt;li data-end=&quot;709&quot; data-start=&quot;698&quot;&gt;비트 플래그 활용&lt;/li&gt;
&lt;li data-end=&quot;746&quot; data-start=&quot;718&quot;&gt;값이 변하지 않는 전역 변수는 const로 선언&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;775&quot; data-start=&quot;753&quot; data-ke-size=&quot;size23&quot;&gt;실행속도 관점에서의 C코드 최적화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1072&quot; data-start=&quot;777&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1072&quot; data-start=&quot;777&quot;&gt;실행시간을 줄이는 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1072&quot; data-start=&quot;797&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;849&quot; data-start=&quot;797&quot;&gt;인라인 함수 사용&lt;br /&gt;&amp;rarr; 함수 호출 오버헤드 제거 (단, 코드 크기 증가 가능)&lt;/li&gt;
&lt;li data-end=&quot;879&quot; data-start=&quot;854&quot;&gt;참조 테이블(Lookup Table) 활용&lt;/li&gt;
&lt;li data-end=&quot;897&quot; data-start=&quot;884&quot;&gt;인라인 어셈블리 활용&lt;/li&gt;
&lt;li data-end=&quot;969&quot; data-start=&quot;902&quot;&gt;전역 변수 사용&lt;br /&gt;&amp;rarr; 함수 호출 시 파라미터 전달 오버헤드 감소&lt;br /&gt;(단, 모듈화 저하 가능)&lt;/li&gt;
&lt;li data-end=&quot;1017&quot; data-start=&quot;974&quot;&gt;폴링 방식 활용&lt;br /&gt;&amp;rarr; 인터럽트 대비 오버헤드가 적은 경우 존재&lt;/li&gt;
&lt;li data-end=&quot;1072&quot; data-start=&quot;1022&quot;&gt;정수 연산 활용&lt;br /&gt;&amp;rarr; 부동소수점 연산을 고정소수점 또는 정수 연산으로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1108&quot; data-start=&quot;1079&quot; data-ke-size=&quot;size23&quot;&gt;실행속도 vs 메모리 관점에서의 C코드 최적화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1225&quot; data-start=&quot;1110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1194&quot; data-start=&quot;1110&quot;&gt;실행속도를 높이는 최적화와 메모리를 절약하는 최적화는 서로 충돌할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1194&quot; data-start=&quot;1159&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1194&quot; data-start=&quot;1159&quot;&gt;예: 인라인 함수는 실행속도는 증가시키지만 코드 크기는 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1225&quot; data-start=&quot;1195&quot;&gt;시스템 요구사항에 맞춰 균형을 잡는 것이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;1256&quot; data-start=&quot;1232&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Data Handling (데이터 처리)&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1282&quot; data-start=&quot;1258&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1282&quot; data-start=&quot;1258&quot; data-ke-size=&quot;size23&quot;&gt;Data handling 관련 방법들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1456&quot; data-start=&quot;1284&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1302&quot; data-start=&quot;1284&quot;&gt;Data Types Usage&lt;/li&gt;
&lt;li data-end=&quot;1326&quot; data-start=&quot;1303&quot;&gt;Avoid Type Conversion&lt;/li&gt;
&lt;li data-end=&quot;1347&quot; data-start=&quot;1327&quot;&gt;Unsigned Advantage&lt;/li&gt;
&lt;li data-end=&quot;1364&quot; data-start=&quot;1348&quot;&gt;Float &amp;amp; Double&lt;/li&gt;
&lt;li data-end=&quot;1386&quot; data-start=&quot;1365&quot;&gt;Constant &amp;amp; Volatile&lt;/li&gt;
&lt;li data-end=&quot;1427&quot; data-start=&quot;1387&quot;&gt;Data Alignment &amp;ndash; Arrangement &amp;amp; Packing&lt;/li&gt;
&lt;li data-end=&quot;1447&quot; data-start=&quot;1428&quot;&gt;Pass by Reference&lt;/li&gt;
&lt;li data-end=&quot;1456&quot; data-start=&quot;1448&quot;&gt;Others&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1497&quot; data-start=&quot;1463&quot; data-ke-size=&quot;size23&quot;&gt;Data type 사용 / Type conversion&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1793&quot; data-start=&quot;1499&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1659&quot; data-start=&quot;1499&quot;&gt;Data Types Usage
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1659&quot; data-start=&quot;1522&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1570&quot; data-start=&quot;1522&quot;&gt;적절한 Data Type 선택은 재귀 연산이나 대규모 배열 처리에서 매우 중요하다.&lt;/li&gt;
&lt;li data-end=&quot;1611&quot; data-start=&quot;1575&quot;&gt;불필요하게 큰 타입을 사용하면 메모리와 처리 시간이 증가한다.&lt;/li&gt;
&lt;li data-end=&quot;1659&quot; data-start=&quot;1616&quot;&gt;예) 변수 범위가 0~200이면 unsigned char 사용이 적절하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1793&quot; data-start=&quot;1661&quot;&gt;Avoid Type Conversion
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1793&quot; data-start=&quot;1689&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1719&quot; data-start=&quot;1689&quot;&gt;가능한 동일한 타입의 변수끼리 연산하도록 설계한다.&lt;/li&gt;
&lt;li data-end=&quot;1752&quot; data-start=&quot;1724&quot;&gt;타입 변환은 추가적인 CPU 사이클을 소모한다.&lt;/li&gt;
&lt;li data-end=&quot;1793&quot; data-start=&quot;1757&quot;&gt;Signed와 Unsigned는 서로 다른 타입으로 간주된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1838&quot; data-start=&quot;1800&quot; data-ke-size=&quot;size23&quot;&gt;Signed &amp;amp; Unsigned / Float &amp;amp; Double&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2089&quot; data-start=&quot;1840&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1937&quot; data-start=&quot;1840&quot;&gt;Signed &amp;amp; Unsigned 구분
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1937&quot; data-start=&quot;1867&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1909&quot; data-start=&quot;1867&quot;&gt;Unsigned: 몫/나머지 연산, loop counter, 배열 인덱싱&lt;/li&gt;
&lt;li data-end=&quot;1937&quot; data-start=&quot;1914&quot;&gt;Signed: 음수 연산이 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2089&quot; data-start=&quot;1939&quot;&gt;Float &amp;amp; Double
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2089&quot; data-start=&quot;1960&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1983&quot; data-start=&quot;1960&quot;&gt;Float 최대값: 0x7f7fffff&lt;/li&gt;
&lt;li data-end=&quot;2020&quot; data-start=&quot;1988&quot;&gt;Double 최대값: 0x7f7fffffffffffff&lt;/li&gt;
&lt;li data-end=&quot;2089&quot; data-start=&quot;2025&quot;&gt;float 상수는 &amp;lsquo;f&amp;rsquo;를 명시하여 불필요한 double 변환 방지&lt;br /&gt;예) x = y + 0.2f;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2118&quot; data-start=&quot;2096&quot; data-ke-size=&quot;size23&quot;&gt;Constant와 volatile&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2335&quot; data-start=&quot;2120&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2232&quot; data-start=&quot;2120&quot;&gt;Constant
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2232&quot; data-start=&quot;2135&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2159&quot; data-start=&quot;2135&quot;&gt;const로 선언하면 ROM에 저장된다.&lt;/li&gt;
&lt;li data-end=&quot;2199&quot; data-start=&quot;2164&quot;&gt;상수 데이터를 RAM에 중복 저장하지 않도록 하기 위함이다.&lt;/li&gt;
&lt;li data-end=&quot;2232&quot; data-start=&quot;2204&quot;&gt;읽기 전용 데이터는 반드시 const 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2234&quot;&gt;Volatile
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2335&quot; data-start=&quot;2249&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2267&quot; data-start=&quot;2249&quot;&gt;컴파일러의 최적화를 방지한다.&lt;/li&gt;
&lt;li data-end=&quot;2307&quot; data-start=&quot;2272&quot;&gt;인터럽트에 의해 변경되는 변수, I/O 레지스터에 사용한다.&lt;/li&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2312&quot;&gt;항상 메모리에서 값을 읽도록 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2384&quot; data-start=&quot;2342&quot; data-ke-size=&quot;size23&quot;&gt;Data Alignment - Arrangement &amp;amp; Packing&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2479&quot; data-start=&quot;2386&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2479&quot; data-start=&quot;2386&quot;&gt;구조체 설계 시 메모리 정렬 고려
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2479&quot; data-start=&quot;2411&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2440&quot; data-start=&quot;2411&quot;&gt;32비트 MCU에서는 32비트 단위 정렬이 효율적&lt;/li&gt;
&lt;li data-end=&quot;2479&quot; data-start=&quot;2445&quot;&gt;char 등 작은 타입은 묶어서 선언하면 패딩 최소화 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2507&quot; data-start=&quot;2486&quot; data-ke-size=&quot;size23&quot;&gt;Pass by Reference&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2574&quot; data-start=&quot;2509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2542&quot; data-start=&quot;2509&quot;&gt;함수 인자가 많아질수록 push/pop 동작이 증가한다.&lt;/li&gt;
&lt;li data-end=&quot;2574&quot; data-start=&quot;2543&quot;&gt;구조체를 포인터로 전달하면 오버헤드를 줄일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2599&quot; data-start=&quot;2581&quot; data-ke-size=&quot;size23&quot;&gt;Initialization&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2663&quot; data-start=&quot;2601&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2635&quot; data-start=&quot;2601&quot;&gt;적절한 메모리 할당 방식 사용 시 RAM 사용량 감소 가능&lt;/li&gt;
&lt;li data-end=&quot;2663&quot; data-start=&quot;2636&quot;&gt;초기화 전략은 메모리 배치에 큰 영향을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2682&quot; data-start=&quot;2670&quot; data-ke-size=&quot;size23&quot;&gt;Return 값&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2752&quot; data-start=&quot;2684&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2711&quot; data-start=&quot;2684&quot;&gt;함수의 Return 값은 레지스터에 저장된다.&lt;/li&gt;
&lt;li data-end=&quot;2752&quot; data-start=&quot;2712&quot;&gt;반환값이 필요 없다면 void로 선언하여 불필요한 오버헤드를 줄인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2772&quot; data-start=&quot;2759&quot; data-ke-size=&quot;size23&quot;&gt;비트 플래그 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2840&quot; data-start=&quot;2774&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2806&quot; data-start=&quot;2774&quot;&gt;상태 플래그를 char로 선언하면 최소 1byte 사용&lt;/li&gt;
&lt;li data-end=&quot;2840&quot; data-start=&quot;2807&quot;&gt;여러 상태는 비트 단위로 묶어 관리하면 메모리 절약 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;2880&quot; data-start=&quot;2847&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Flow Control Handling (흐름제어 처리)&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2914&quot; data-start=&quot;2882&quot; data-ke-size=&quot;size23&quot;&gt;Flow Control Handling 관련 방법들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3017&quot; data-start=&quot;2916&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2941&quot; data-start=&quot;2916&quot;&gt;Use of switch statement&lt;/li&gt;
&lt;li data-end=&quot;2959&quot; data-start=&quot;2942&quot;&gt;Inline function&lt;/li&gt;
&lt;li data-end=&quot;2976&quot; data-start=&quot;2960&quot;&gt;Loop unrolling&lt;/li&gt;
&lt;li data-end=&quot;2992&quot; data-start=&quot;2977&quot;&gt;Loop Hoisting&lt;/li&gt;
&lt;li data-end=&quot;3008&quot; data-start=&quot;2993&quot;&gt;Loop Overhead&lt;/li&gt;
&lt;li data-end=&quot;3017&quot; data-start=&quot;3009&quot;&gt;Others&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3040&quot; data-start=&quot;3024&quot; data-ke-size=&quot;size23&quot;&gt;If vs switch&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3133&quot; data-start=&quot;3042&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3070&quot; data-start=&quot;3042&quot;&gt;하나의 변수로 분기할 경우 switch가 효율적&lt;/li&gt;
&lt;li data-end=&quot;3104&quot; data-start=&quot;3071&quot;&gt;switch는 lookup table 방식으로 동작 가능&lt;/li&gt;
&lt;li data-end=&quot;3133&quot; data-start=&quot;3105&quot;&gt;if는 조건에 따라 실행 시간이 달라질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3156&quot; data-start=&quot;3140&quot; data-ke-size=&quot;size23&quot;&gt;Inline 코드 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3226&quot; data-start=&quot;3158&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3176&quot; data-start=&quot;3158&quot;&gt;함수 호출을 코드 복사로 대체&lt;/li&gt;
&lt;li data-end=&quot;3189&quot; data-start=&quot;3177&quot;&gt;호출 오버헤드 제거&lt;/li&gt;
&lt;li data-end=&quot;3203&quot; data-start=&quot;3190&quot;&gt;작은 함수에서 효과적&lt;/li&gt;
&lt;li data-end=&quot;3226&quot; data-start=&quot;3204&quot;&gt;큰 함수는 코드 크기 증가 문제 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3250&quot; data-start=&quot;3233&quot; data-ke-size=&quot;size23&quot;&gt;Loop Hoisting&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3292&quot; data-start=&quot;3252&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3270&quot; data-start=&quot;3252&quot;&gt;루프 내부 계산을 외부로 이동&lt;/li&gt;
&lt;li data-end=&quot;3292&quot; data-start=&quot;3271&quot;&gt;반복 연산 감소 &amp;rarr; 실행 시간 단축&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3316&quot; data-start=&quot;3299&quot; data-ke-size=&quot;size23&quot;&gt;Loop overhead&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3374&quot; data-start=&quot;3318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3345&quot; data-start=&quot;3318&quot;&gt;MCU는 0 비교 분기에 최적화된 경우가 많음&lt;/li&gt;
&lt;li data-end=&quot;3374&quot; data-start=&quot;3346&quot;&gt;&amp;ldquo;0이 아닌지 검사&amp;rdquo;가 특정 값 비교보다 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3394&quot; data-start=&quot;3381&quot; data-ke-size=&quot;size23&quot;&gt;If - else&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3411&quot; data-start=&quot;3396&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3411&quot; data-start=&quot;3396&quot;&gt;불필요한 else는 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3434&quot; data-start=&quot;3418&quot; data-ke-size=&quot;size23&quot;&gt;함수 인자의 개수 제한&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3481&quot; data-start=&quot;3436&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3453&quot; data-start=&quot;3436&quot;&gt;함수 인자는 4개 이내 권장&lt;/li&gt;
&lt;li data-end=&quot;3481&quot; data-start=&quot;3454&quot;&gt;그 이상은 stack 사용 &amp;rarr; 성능 저하 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;3512&quot; data-start=&quot;3488&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Other Handling (기타 처리)&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3539&quot; data-start=&quot;3514&quot; data-ke-size=&quot;size23&quot;&gt;Other Handling 관련 방법들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3631&quot; data-start=&quot;3541&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3559&quot; data-start=&quot;3541&quot;&gt;Use of operators&lt;/li&gt;
&lt;li data-end=&quot;3573&quot; data-start=&quot;3560&quot;&gt;Use formula&lt;/li&gt;
&lt;li data-end=&quot;3591&quot; data-start=&quot;3574&quot;&gt;Inline Assembly&lt;/li&gt;
&lt;li data-end=&quot;3622&quot; data-start=&quot;3592&quot;&gt;Fixed point &amp;amp; Floating point&lt;/li&gt;
&lt;li data-end=&quot;3631&quot; data-start=&quot;3623&quot;&gt;Others&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3658&quot; data-start=&quot;3638&quot; data-ke-size=&quot;size23&quot;&gt;Use of operators&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3678&quot; data-start=&quot;3660&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3678&quot; data-start=&quot;3660&quot;&gt;기본 연산자를 효율적으로 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3736&quot; data-start=&quot;3685&quot; data-ke-size=&quot;size23&quot;&gt;Replacing: Integer Division with Multiplication&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3798&quot; data-start=&quot;3738&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3761&quot; data-start=&quot;3738&quot;&gt;정수 나눗셈은 가장 느린 연산 중 하나&lt;/li&gt;
&lt;li data-end=&quot;3778&quot; data-start=&quot;3762&quot;&gt;가능한 경우 곱셈으로 대체&lt;/li&gt;
&lt;li data-end=&quot;3798&quot; data-start=&quot;3779&quot;&gt;오버플로 발생 여부 반드시 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3823&quot; data-start=&quot;3805&quot; data-ke-size=&quot;size23&quot;&gt;Use of Formula&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3877&quot; data-start=&quot;3825&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3843&quot; data-start=&quot;3825&quot;&gt;Horner&amp;rsquo;s Rule 적용&lt;/li&gt;
&lt;li data-end=&quot;3853&quot; data-start=&quot;3844&quot;&gt;인수분해 활용&lt;/li&gt;
&lt;li data-end=&quot;3877&quot; data-start=&quot;3854&quot;&gt;덧셈으로 곱셈을 대체 가능한 경우 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3903&quot; data-start=&quot;3884&quot; data-ke-size=&quot;size23&quot;&gt;Inline assembly&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3964&quot; data-start=&quot;3905&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3931&quot; data-start=&quot;3905&quot;&gt;asm 키워드를 활용하여 어셈블리 코드 삽입&lt;/li&gt;
&lt;li data-end=&quot;3942&quot; data-start=&quot;3932&quot;&gt;속도 향상 목적&lt;/li&gt;
&lt;li data-end=&quot;3964&quot; data-start=&quot;3943&quot;&gt;C와 어셈블리를 혼합하여 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;3986&quot; data-start=&quot;3971&quot; data-ke-size=&quot;size23&quot;&gt;부동소수점 연산 제거&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4039&quot; data-start=&quot;3988&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4010&quot; data-start=&quot;3988&quot;&gt;실수 대신 정수/고정소수점 사용 권장&lt;/li&gt;
&lt;li data-end=&quot;4039&quot; data-start=&quot;4011&quot;&gt;예) 평균 계산 후 마지막 단계에서만 변환 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;4057&quot; data-start=&quot;4046&quot; data-ke-size=&quot;size23&quot;&gt;조건문 최적화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4080&quot; data-start=&quot;4059&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4080&quot; data-start=&quot;4059&quot;&gt;조건문 대신 bit 연산 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  마무리 정리&lt;/h3&gt;
&lt;p data-end=&quot;619&quot; data-start=&quot;537&quot; data-ke-size=&quot;size16&quot;&gt;임베디드 C 코드 최적화는 단순히 코드를 줄이거나 빠르게 만드는 기술이 아니라, &lt;b&gt;시스템 자원을 전략적으로 사용하는 설계 능력&lt;/b&gt;과 연결된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;745&quot; data-start=&quot;621&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;640&quot; data-start=&quot;621&quot;&gt;ROM을 줄이기 위한 최적화&lt;/li&gt;
&lt;li data-end=&quot;662&quot; data-start=&quot;641&quot;&gt;RAM 사용량을 최소화하는 설계&lt;/li&gt;
&lt;li data-end=&quot;681&quot; data-start=&quot;663&quot;&gt;실행 시간을 단축하는 구조&lt;/li&gt;
&lt;li data-end=&quot;703&quot; data-start=&quot;682&quot;&gt;불필요한 연산과 타입 변환 제거&lt;/li&gt;
&lt;li data-end=&quot;745&quot; data-start=&quot;704&quot;&gt;인터럽트, I/O, 비트 연산 등 하드웨어 특성을 고려한 코드 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;889&quot; data-start=&quot;747&quot; data-ke-size=&quot;size16&quot;&gt;이러한 요소들은 서로 영향을 주며 때로는 상충하기도 한다. 예를 들어 인라인 함수는 속도를 높일 수 있지만 코드 크기를 증가시킬 수 있다. 따라서 최적화는 &amp;ldquo;무조건 빠르게&amp;rdquo;가 아니라, &lt;b&gt;시스템 요구사항에 맞는 균형점(Balance)을 찾는 과정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;973&quot; data-start=&quot;891&quot; data-ke-size=&quot;size16&quot;&gt;결국 좋은 임베디드 코드는&lt;br /&gt;✔ 자원을 낭비하지 않고&lt;br /&gt;✔ 예측 가능한 실행 시간을 가지며&lt;br /&gt;✔ 하드웨어 특성을 이해하고 작성된 코드이다.&lt;/p&gt;
&lt;p data-end=&quot;1047&quot; data-start=&quot;975&quot; data-ke-size=&quot;size16&quot;&gt;최적화는 마지막 단계에서 억지로 하는 작업이 아니라, &lt;b&gt;설계 단계부터 고려되어야 하는 기본 역량&lt;/b&gt;임을 기억하는 것이 중요하다.&lt;/p&gt;</description>
      <category>개발/임베디드</category>
      <category>BitOperation</category>
      <category>C언어</category>
      <category>datahandling</category>
      <category>flowcontrol</category>
      <category>inline</category>
      <category>MCU</category>
      <category>메모리최적화</category>
      <category>실행속도</category>
      <category>임베디드</category>
      <category>코드최적화</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/110</guid>
      <comments>https://xeungcoding.tistory.com/110#entry110comment</comments>
      <pubDate>Tue, 3 Mar 2026 17:13:02 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 11725: 트리의 부모 찾기</title>
      <link>https://xeungcoding.tistory.com/109</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 백준 11725: 트리의 부모 찾기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;SILVER 2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11725&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/11725&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk3S0u/dJMcah4BWsV/obKKvwbBmTubwzTaoNYkn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk3S0u/dJMcah4BWsV/obKKvwbBmTubwzTaoNYkn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk3S0u/dJMcah4BWsV/obKKvwbBmTubwzTaoNYkn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk3S0u%2FdJMcah4BWsV%2FobKKvwbBmTubwzTaoNYkn1%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;693&quot; height=&quot;232&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;83&quot; data-start=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 루트가 1번인 트리가 주어졌을 때, &lt;b&gt;각 노드의 부모를 출력&lt;/b&gt;하는 문제다.&lt;/p&gt;
&lt;p data-end=&quot;158&quot; data-start=&quot;85&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;158&quot; data-start=&quot;85&quot; data-ke-size=&quot;size16&quot;&gt;트리는 사이클이 없는 연결 그래프이기 때문에,&lt;br /&gt;1번 노드를 기준으로 &lt;b&gt;DFS를 한 번만 돌면서 부모를 기록&lt;/b&gt;해주면 해결된다.&lt;/p&gt;
&lt;p data-end=&quot;174&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;174&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;구현 아이디어는 간단하다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;256&quot; data-start=&quot;176&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;204&quot; data-start=&quot;176&quot;&gt;graph : 인접 리스트 (양방향 그래프)&lt;/li&gt;
&lt;li data-end=&quot;233&quot; data-start=&quot;205&quot;&gt;ret[i] : i번 노드의 부모 노드 번호&lt;/li&gt;
&lt;li data-end=&quot;256&quot; data-start=&quot;234&quot;&gt;visited[i] : 방문 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;263&quot; data-start=&quot;258&quot; data-ke-size=&quot;size16&quot;&gt;DFS에서&lt;/p&gt;
&lt;pre id=&quot;code_1772520484456&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dfs(int before, int now)
{
    visited[now] = true;
    ret[now] = before; // now의 부모는 before

    for (int i = 0; i &amp;lt; graph[now].size(); i++)
    {
        int next = graph[now][i];

        if (!visited[next])
            dfs(now, next);  // 현재 노드(now)를 다음 노드(next)의 부모로 넘김
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;639&quot; data-start=&quot;566&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 현재 노드의 부모를 before 파라미터로 받도록 해서, 재귀 호출을 할 때마다 자연스럽게 부모&amp;ndash;자식 관계를 채운다.&lt;/p&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;루트 노드인 1번에서 시작할 때는 부모가 없으므로 dfs(0, 1); 처럼 0을 넘겨서 시작한다. (0은 단순한 더미 값)&lt;/p&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;717&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;717&quot; data-ke-size=&quot;size16&quot;&gt;DFS가 끝난 뒤에는&lt;/p&gt;
&lt;pre id=&quot;code_1772520523432&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 2; i &amp;lt;= n; i++)
    cout &amp;lt;&amp;lt; ret[i] &amp;lt;&amp;lt; '\n';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 노드부터 N번 노드까지의 부모만 출력하면 된다.&lt;br /&gt;(1번은 루트라 부모가 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;구현 시 주의할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트리 입력은 간선이 양방향으로 주어지므로 양쪽 모두에 넣어줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772520572423&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;graph[index].push_back(val);
graph[val].push_back(index);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1140&quot; data-start=&quot;995&quot;&gt;DFS에서 부모를 찾을 때, 바로 이전 노드만 부모라고 단정할 수 없으므로 &lt;b&gt;visited 배열로 이미 방문한 노드를 다시 타고 들어가지 않게 해야&lt;/b&gt; 한다.&lt;br /&gt;그렇지 않으면 부모&amp;ndash;자식 관계가 꼬이거나 무한 재귀가 발생할 수 있다.&lt;/li&gt;
&lt;li data-end=&quot;1220&quot; data-start=&quot;1141&quot;&gt;인덱스는 1부터 N까지 사용하므로, graph, visited, ret는 모두 n + 1 크기로 잡는 것이 안전하다.&lt;/li&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1221&quot;&gt;루트(1번 노드)의 부모는 의미가 없으니 출력에서 제외하고, 2번 노드부터 출력해야 한다는 점을 잊지 말기.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1772520637063&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; graph;
vector&amp;lt;int&amp;gt; ret;
vector&amp;lt;bool&amp;gt; visited;
int n;

void dfs(int before, int now)
{
	visited[now] = true;
	ret[now] = before;

	for (int i = 0; i &amp;lt; graph[now].size(); i++)
	{
		int next = graph[now][i];

		if (!visited[next])
			dfs(now, next);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin &amp;gt;&amp;gt; n;

	graph.resize(n + 1);
	visited.resize(n + 1, false);
	ret.resize(n + 1, 0);
	for (int i = 1; i &amp;lt; n; i++)
	{
		int index = 0, val = 0;
		cin &amp;gt;&amp;gt; index &amp;gt;&amp;gt; val;

		graph[index].push_back(val);
		graph[val].push_back(index);
	}
	dfs(0, 1);

	for (int i = 2; i &amp;lt;= n; i++)
		cout &amp;lt;&amp;lt; ret[i] &amp;lt;&amp;lt; '\n';
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>dfs</category>
      <category>구현</category>
      <category>그래프</category>
      <category>백준</category>
      <category>백준11725</category>
      <category>승코딩당당당</category>
      <category>트리</category>
      <category>트리의부모찾기</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/109</guid>
      <comments>https://xeungcoding.tistory.com/109#entry109comment</comments>
      <pubDate>Tue, 3 Mar 2026 15:50:50 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 백준 1850: 최소공약수</title>
      <link>https://xeungcoding.tistory.com/108</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[C++] 백준 1850: 최소공약수 &lt;span style=&quot;color: #7e98b1;&quot;&gt;&lt;b&gt;SILVER 1&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1850&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1850&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCFqxR/dJMcaca9APp/mdkkRkklocB9WfwH0MYNjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCFqxR/dJMcaca9APp/mdkkRkklocB9WfwH0MYNjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCFqxR/dJMcaca9APp/mdkkRkklocB9WfwH0MYNjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCFqxR%2FdJMcaca9APp%2FmdkkRkklocB9WfwH0MYNjk%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;681&quot; height=&quot;293&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p data-end=&quot;117&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;백준 1850번은 두 정수 A와 B가 주어졌을 때, 각각이 &lt;b&gt;1로만 이루어진 수(1111&amp;hellip; 형태)&lt;/b&gt; 라고 생각하고&lt;br /&gt;그 둘의 &lt;b&gt;최대공약수에 해당하는 1의 개수&lt;/b&gt;를 출력하는 문제다.&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;119&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;135&quot; data-start=&quot;119&quot; data-ke-size=&quot;size16&quot;&gt;핵심 아이디어는 다음과 같다.&lt;/p&gt;
&lt;blockquote data-end=&quot;198&quot; data-start=&quot;137&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;p data-end=&quot;198&quot; data-start=&quot;139&quot; data-ke-size=&quot;size16&quot;&gt;111&amp;hellip;(A개) 와 111&amp;hellip;(B개)의 최대공약수는&lt;br /&gt;1이 GCD(A, B)개 있는 수가 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;202&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;202&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;247&quot; data-start=&quot;204&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;224&quot; data-start=&quot;204&quot;&gt;두 수의 최대공약수를 먼저 구하고&lt;/li&gt;
&lt;li data-end=&quot;247&quot; data-start=&quot;225&quot;&gt;그 개수만큼 1을 출력하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;323&quot; data-start=&quot;249&quot; data-ke-size=&quot;size16&quot;&gt;따라서 문제의 본질은 &lt;b&gt;두 수의 최대공약수(GCD)를 구하는 것&lt;/b&gt;이다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;유클리드 호제법&lt;/b&gt;&lt;/span&gt;을 이용하면 효율적으로 계산할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1772443756826&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int GCD(ll a, ll b)
{
    if (a % b == 0)
        return b;
    else
        return GCD(b, a % b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대공약수를 구한 뒤,&lt;/p&gt;
&lt;pre id=&quot;code_1772443769786&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ll gcd = GCD(a, b);
for (ll i = 0; i &amp;lt; gcd; i++)
    cout &amp;lt;&amp;lt; 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 gcd번 반복하면서 1을 출력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;구현 시 주의할 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1154&quot; data-end=&quot;1200&quot;&gt;반드시 long long 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-start=&quot;1154&quot; data-end=&quot;1200&quot;&gt;문제에서 A와 B의 범위가 매우 크기 때문에 int로는 처리할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실제로 큰 수를 만들지 않는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1111&amp;hellip; 같은 수를 직접 문자열이나 숫자로 만들면 메모리와 시간 모두 감당할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1772443842575&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

typedef long long ll;

int GCD(ll a, ll b)
{
	if (a % b == 0)
		return b;
	else
		return GCD(b, a % b);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	ll a = 0, b = 0;
	cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;

	ll gcd = GCD(a, b);
	for (ll i = 0; i &amp;lt; gcd; i++)
		cout &amp;lt;&amp;lt; 1;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/BOJ</category>
      <category>boj</category>
      <category>c++</category>
      <category>long long</category>
      <category>구현</category>
      <category>백준</category>
      <category>백준1850</category>
      <category>수학</category>
      <category>승코딩당당당</category>
      <category>유클리드호제법</category>
      <category>최대공약수</category>
      <author>승코딩당당당</author>
      <guid isPermaLink="true">https://xeungcoding.tistory.com/108</guid>
      <comments>https://xeungcoding.tistory.com/108#entry108comment</comments>
      <pubDate>Mon, 2 Mar 2026 18:30:48 +0900</pubDate>
    </item>
  </channel>
</rss>