<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>한량처럼 살고 싶다</title>
    <link>https://tooyoung.tistory.com/</link>
    <description>어쩌다보니 하고 싶은 분야들을 순서 없이 하고 있습니다. HAPPY CODING HAPPY HELLO WORLD!</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 01:54:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>투영</managingEditor>
    <image>
      <title>한량처럼 살고 싶다</title>
      <url>https://tistory1.daumcdn.net/tistory/5135841/attach/b8b05e3f4699476298db67fdeb52d097</url>
      <link>https://tooyoung.tistory.com</link>
    </image>
    <item>
      <title>맨날 까먹는 prettier + eslint 설정법</title>
      <link>https://tooyoung.tistory.com/416</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 json파일을 직접 건드려야 할 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에어비엔비 코드 컨벤션 사용 기준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.eslintrc&lt;/p&gt;
&lt;pre id=&quot;code_1745367854524&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;parser&quot;: &quot;@typescript-eslint/parser&quot;,
    &quot;extends&quot;: [
      &quot;plugin:react/recommended&quot;,
      &quot;plugin:@typescript-eslint/recommended&quot;
    ]
  }&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.eslintrc.json&lt;/p&gt;
&lt;pre id=&quot;code_1745367871188&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;root&quot;: true,
  &quot;env&quot;: {
    &quot;browser&quot;: true,
    &quot;es2021&quot;: true,
    &quot;node&quot;: true
  },
  &quot;extends&quot;: [
    &quot;airbnb&quot;,
    &quot;airbnb/hooks&quot;,
    &quot;plugin:@typescript-eslint/recommended&quot;,
    &quot;plugin:prettier/recommended&quot;
  ],
  &quot;parser&quot;: &quot;@typescript-eslint/parser&quot;,
  &quot;parserOptions&quot;: {
    &quot;ecmaVersion&quot;: &quot;latest&quot;,
    &quot;sourceType&quot;: &quot;module&quot;,
    &quot;ecmaFeatures&quot;: {
      &quot;jsx&quot;: true
    },
    &quot;project&quot;: &quot;./tsconfig.json&quot;
  },
  &quot;plugins&quot;: [&quot;react&quot;, &quot;@typescript-eslint&quot;, &quot;prettier&quot;],
  &quot;rules&quot;: {
    &quot;prettier/prettier&quot;: [&quot;error&quot;],
    &quot;react/react-in-jsx-scope&quot;: &quot;off&quot;,
    &quot;react/jsx-filename-extension&quot;: [
      &quot;warn&quot;,
      { &quot;extensions&quot;: [&quot;.tsx&quot;, &quot;.ts&quot;, &quot;.jsx&quot;, &quot;.js&quot;] }
    ],
    &quot;import/no-extraneous-dependencies&quot;: [&quot;error&quot;, { &quot;devDependencies&quot;: true }],
    &quot;no-console&quot;: &quot;warn&quot;,
    &quot;no-unused-vars&quot;: &quot;warn&quot;,
    &quot;@typescript-eslint/no-unused-vars&quot;: &quot;warn&quot;
  },
  &quot;settings&quot;: {
    &quot;react&quot;: {
      &quot;version&quot;: &quot;detect&quot;
    },
    &quot;import/resolver&quot;: {
      &quot;typescript&quot;: {},
      &quot;node&quot;: {
        &quot;extensions&quot;: [&quot;.js&quot;, &quot;.jsx&quot;, &quot;.ts&quot;, &quot;.tsx&quot;]
      }
    }
  }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.prettierrc&lt;/p&gt;
&lt;pre id=&quot;code_1745367931214&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;singleQuote&quot;: true,
  &quot;trailingComma&quot;: &quot;all&quot;,
  &quot;printWidth&quot;: 80,
  &quot;tabWidth&quot;: 2,
  &quot;semi&quot;: true
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eslint.config.js&lt;/p&gt;
&lt;pre id=&quot;code_1745367889627&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'

export default tseslint.config(
  { ignores: ['dist'] },
  {
    extends: [js.configs.recommended, ...tseslint.configs.recommended],
    files: ['**/*.{ts,tsx}'],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
    },
    plugins: {
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    rules: {
      ...reactHooks.configs.recommended.rules,
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
    },
  },
)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 vscode 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file 탭 클릭 -&amp;gt; preference 클릭 -&amp;gt; settings 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 저장버튼 누를 때마다 자동 포맷팅하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색창에 format on save 를 입력하면 Editor: Format On Save 나와있다. 체크해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nZRKT/btsNvGTDV17/WoNZVTtGNr30hdQJudiXS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nZRKT/btsNvGTDV17/WoNZVTtGNr30hdQJudiXS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nZRKT/btsNvGTDV17/WoNZVTtGNr30hdQJudiXS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZRKT%2FbtsNvGTDV17%2FWoNZVTtGNr30hdQJudiXS0%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;891&quot; height=&quot;304&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;2) default formatter 설정하기&lt;b&gt;&lt;/b&gt;&lt;/p&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;b&gt;저장(컨트롤s)했는데도 prettier 가 작동을 안 해요! =&amp;gt; default formatter 설정을 해주면 해결된다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings 에서 default formatter 를 검색한 뒤, 아래 사진처럼 prettier를 골라주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 이게 되어 있는데도 저장 시 포맷팅이 안 된다면 다른 문제일 수 있다 ㅜ&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQ7tf/btsNwoxY0po/mO5i1mYWILv0LxRfKvYwY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQ7tf/btsNwoxY0po/mO5i1mYWILv0LxRfKvYwY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQ7tf/btsNwoxY0po/mO5i1mYWILv0LxRfKvYwY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQ7tf%2FbtsNwoxY0po%2FmO5i1mYWILv0LxRfKvYwY0%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;884&quot; height=&quot;480&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;3) javascript/typescript format&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 javascript format 검색한 뒤 enable/disable 부분에 체크 해제해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부턴 개인 설정으로 format 하기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVViGf/btsNuX3lyNN/qTqGttj7IjMcwGwdWpUgH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVViGf/btsNuX3lyNN/qTqGttj7IjMcwGwdWpUgH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVViGf/btsNuX3lyNN/qTqGttj7IjMcwGwdWpUgH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVViGf%2FbtsNuX3lyNN%2FqTqGttj7IjMcwGwdWpUgH0%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;897&quot; height=&quot;198&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typescript format 도 검색해서 체크 해제해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRYeff/btsNuEJJcQx/odwApKnl9quCulkyQiXuE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRYeff/btsNuEJJcQx/odwApKnl9quCulkyQiXuE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRYeff/btsNuEJJcQx/odwApKnl9quCulkyQiXuE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRYeff%2FbtsNuEJJcQx%2FodwApKnl9quCulkyQiXuE0%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;890&quot; height=&quot;197&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;새로운 환경에서 vscode 쓸 때마다 삽질하지 않길&amp;nbsp;&lt;/p&gt;</description>
      <category>프론트엔드</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/416</guid>
      <comments>https://tooyoung.tistory.com/416#entry416comment</comments>
      <pubDate>Wed, 23 Apr 2025 09:35:22 +0900</pubDate>
    </item>
    <item>
      <title>CAN Frame 타입</title>
      <link>https://tooyoung.tistory.com/415</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Single Frame&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 길이가 7바이트 이하일 경우 single frame 을 사용하여 데이터 전송이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 형태가&amp;nbsp;&lt;b&gt;0x06OOOOOOO &lt;/b&gt;라면, 해당 프레임은 싱글 프레임이면서 데이터의 길이는 2인 것이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 93.0233%; height: 35px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 15.6977%; text-align: center; height: 18px;&quot;&gt;Bit offset&lt;/td&gt;
&lt;td style=&quot;width: 19.8837%; text-align: center; height: 18px;&quot;&gt;7 .. 4 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 19.3023%; text-align: center; height: 18px;&quot;&gt;3 .. 0 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 23.8605%; text-align: center; height: 18px;&quot;&gt;15 .. 8 (byte 1)&lt;/td&gt;
&lt;td style=&quot;width: 21.2428%; text-align: center; height: 18px;&quot;&gt;23 .. 16 (byte 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 15.6977%; text-align: center; height: 17px;&quot;&gt;single&lt;/td&gt;
&lt;td style=&quot;width: 19.8837%; text-align: center; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 19.3023%; text-align: center; height: 17px;&quot;&gt;size (0 .. 7)&lt;/td&gt;
&lt;td style=&quot;width: 23.8605%; text-align: center; height: 17px;&quot;&gt;Data A&lt;/td&gt;
&lt;td style=&quot;width: 21.2428%; text-align: center; height: 17px;&quot;&gt;Data B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Multi Frame&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 길이가 7바이트를 초과할 경우 multi frame 을 이용하여 데이터 전송이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 프레임에는 2가지 종류가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티 프레임을 전송한다는 의미를 담은 가장 첫 번째 프레임인 First Frame과&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후에 오는 프레임이라는 내용을 담은 Consecutive Frame 두 가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 CAN 프레임은 데이터의 길이를 12bit로 표현해야 하므로 전송 가능한 최대 byte 수가 4095이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 넘어설 경우 CAN FD 프로토콜 혹은 사용자 정의 프로토콜을 사용해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 93.0233%; height: 52px;&quot; border=&quot;1&quot; data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.1977%; height: 18px; text-align: center;&quot;&gt;Bit offset&lt;/td&gt;
&lt;td style=&quot;width: 18.1337%; height: 18px; text-align: center;&quot;&gt;7 .. 4 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 20.4273%; height: 18px; text-align: center;&quot;&gt;3 .. 0 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 20.9855%; height: 18px; text-align: center;&quot;&gt;15 .. 8 (byte 1)&lt;/td&gt;
&lt;td style=&quot;width: 21.2428%; height: 18px; text-align: center;&quot;&gt;23 .. 16 (byte 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.1977%; height: 17px; text-align: center;&quot;&gt;First Frame&lt;/td&gt;
&lt;td style=&quot;width: 18.1337%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 41.4128%; height: 17px; text-align: center;&quot; colspan=&quot;2&quot;&gt;size (12bit)&lt;/td&gt;
&lt;td style=&quot;width: 21.2428%; height: 17px; text-align: center;&quot;&gt;Data A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 19.1977%; text-align: center; height: 17px;&quot;&gt;Consecutive Frame&lt;/td&gt;
&lt;td style=&quot;width: 18.1337%; text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20.4273%; text-align: center; height: 17px;&quot;&gt;index (0..15)&lt;/td&gt;
&lt;td style=&quot;width: 20.9855%; text-align: center; height: 17px;&quot;&gt;Data A&lt;/td&gt;
&lt;td style=&quot;width: 21.2428%; text-align: center; height: 17px;&quot;&gt;Data B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 First Frame 이 이런 형태로 들어온다면:&amp;nbsp;&lt;b&gt;0x1009OOOOOO&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 상위 4비트가 1 이며 이어오는 12bit 가 009 이기 때문에 이 프레임은 First frame 이자 총 데이터의 길이가 9 라는 뜻이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 이번 프레임이 오고 나서 2로 시작되는 다른 프레임이 온다는 것까지 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consecutive Frame 은 20, 21, 22, 23 ... 2F 이런 식으로 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스가 0부터 15까지이며 만약 16개의 연속된 Consecutive Frame 을 전송했는데 데이터가 남아있을 경우 다시 20부터 순환하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 첫 번째 Consecutive Frame (CF)는 0x21부터 시작하고, 2F까지 증가한 후, 다음 프레임에서는 다시 0x20으로 순환하는 구조라는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21 22 .. 2F 까지 다 돈 뒤에 그 다음에 오는 Consecutive가 20 부터 시작된다는 의미이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Flow Control Frame&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;can 통신에서는 여러 프레임을 연속적으로 보낼 때 상대방으로부터 Flow Control Frame 을 받은 뒤에 보낸다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 13.3838%; height: 18px; text-align: center;&quot;&gt;Bit offset&lt;/td&gt;
&lt;td style=&quot;width: 13.5987%; height: 18px; text-align: center;&quot;&gt;7 .. 4 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 25.4274%; height: 18px; text-align: center;&quot;&gt;3 .. 0 (byte 0)&lt;/td&gt;
&lt;td style=&quot;width: 24.4738%; height: 18px; text-align: center;&quot;&gt;15 .. 8 (byte 1)&lt;/td&gt;
&lt;td style=&quot;width: 23.1033%; height: 18px; text-align: center;&quot;&gt;23 .. 16 (byte 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.3838%; height: 17px; text-align: center;&quot;&gt;description&lt;/td&gt;
&lt;td style=&quot;width: 13.5987%; height: 17px; text-align: center;&quot;&gt;type&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center; width: 25.4274%;&quot;&gt;if the transfer is allowed&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 24.4738%;&quot;&gt;Block Size&lt;/td&gt;
&lt;td style=&quot;width: 23.1033%; height: 17px; text-align: center;&quot;&gt;Separation time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 13.3838%; height: 17px; text-align: center;&quot;&gt;Single&lt;/td&gt;
&lt;td style=&quot;width: 13.5987%; height: 17px; text-align: center;&quot;&gt;type = 3&lt;/td&gt;
&lt;td style=&quot;width: 25.4274%; height: 17px; text-align: center;&quot; rowspan=&quot;2&quot;&gt;0: Continue to send&lt;br /&gt;1: Wait&lt;br /&gt;2: Overflow/abort&lt;/td&gt;
&lt;td style=&quot;width: 24.4738%; height: 17px; text-align: center;&quot;&gt;0: flow control frame 혹은 delay 없이 consecutive 전송&lt;/td&gt;
&lt;td style=&quot;width: 23.1033%; height: 17px; text-align: center;&quot;&gt;Separation time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3838%; text-align: center;&quot;&gt;Single&lt;/td&gt;
&lt;td style=&quot;width: 13.5987%; text-align: center;&quot;&gt;type = 3&lt;/td&gt;
&lt;td style=&quot;width: 24.4738%; text-align: center;&quot;&gt;&amp;gt; 0: 다음 Flow Control Frame을 기다리기 전 보낼 Consecutive Frame 수&lt;/td&gt;
&lt;td style=&quot;width: 23.1033%; text-align: center;&quot;&gt;0xF1 ~ 0xF9&lt;br /&gt;100~900 의 마이크로초&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상위 4비트는 3으로 고정되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 4비트는 0일 경우 Consecutive 전송, 1일 경우 다음 Flow Control Frame 을 기다린다는 의미, 2일 경우 중단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Block Size 가 0일 경우 Flow Control Frame / Delay 없이 Consecutive Message를 전송한다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 0보다 큰 값이 올 경우 다음 Flow Control Frame 을 기다리기 전 보낼 Consecutive Frame 수를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CAN통신</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/415</guid>
      <comments>https://tooyoung.tistory.com/415#entry415comment</comments>
      <pubDate>Tue, 25 Feb 2025 10:42:48 +0900</pubDate>
    </item>
    <item>
      <title>Bitbake 의존성 소개</title>
      <link>https://tooyoung.tistory.com/414</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;빌드타임 의존성(DEPENDS)과 런타임 의존성(RDEPENDS_${PN}) 두 개로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드타임 의존성은 Depends에 정의되며, 컴포넌트 빌드 시 의존성이 있는 빌드가 언제 수행되어야 할 지 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Depends 안의 변수값은 의존성 있는 레시피 이름으로 정의된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임 의존성은 RDEPENDS_PN 은 패키지 단위로 정의되므로 뒤에 PN이 추가된다.&lt;/p&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;/p&gt;</description>
      <category>Yocto/처음 시작하는 Yocto 프로젝트</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/414</guid>
      <comments>https://tooyoung.tistory.com/414#entry414comment</comments>
      <pubDate>Sat, 22 Feb 2025 13:52:31 +0900</pubDate>
    </item>
    <item>
      <title>Bitbake 소개</title>
      <link>https://tooyoung.tistory.com/413</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bitbake 소개&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bitbake 는 실행엔진으로, 쉘과 파이썬 태스크를 효율적이고 병렬적으로 실행할 수 있게 만들어준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 Bitbake 는 태스크 단위로 실행되는데 태스크에는 do_fetch, do_unpack 등이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 마지막에 do_rootfs 를 실행한 뒤 이미지를 만드는 do_image를 실행하면 bitbake 의 업무가 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Bitbake 디렉토리 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;${DL_DIR} &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 다운로드 원본이 저장되는 위치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 컴포넌트가 이 위치를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bitbake.conf 파일에 설정 가능하다.&lt;/p&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;b&gt; ${S} &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 된 소스코드의 압축이 풀리는 위치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${WORKDIR} 하위에 위치하며 default name은 레시피이름-버전이다.&lt;/p&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;b&gt; ${B} &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${B} 디렉토리에는 빌드 과정 중 생성된 결과물이 저장된다.&lt;/p&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;b&gt; ${D} &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${D} 디렉토리에는 최종 빌드 산출물이 저장된다.&lt;/p&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;b&gt;bitbake curl -c listtasks&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;:&amp;nbsp;&lt;/b&gt;특정 레시피 (curl)의 실행 가능한 태스크 목록을 확인하는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;자주 사용하는 Bitbake 태스크 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DO_FETCH&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SRC_URI 변수에 소스 위치를 정의&lt;/li&gt;
&lt;li&gt;소스가 다운로드 되면 DL_DIR 변수로 설정된 곳에 저장됨&lt;/li&gt;
&lt;li&gt;git, svn, ftp, http, repo 등 다양한 프로토콜 지원함&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DO_UNPACK&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;do_fetch 에서 받은 소스코드가 S 디렉토리에 압축 해제&lt;/li&gt;
&lt;li&gt;SRC_URI에 링크만 적어주면 알아서 압축 해제하여 S 하위에 저장한다.&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;&lt;b&gt;DO_PATCH&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;patch 나 diff 확장자를 가진 파일이 SRC_URI 에 있으면 패치 파일로 인식한다.&lt;/li&gt;
&lt;li&gt;Patch level 을 지정할 수 있으며 기본은 -p1 이다.&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;&lt;b&gt;DO_POPULATE_LIC&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;license 와 lic_files_chksum 에 정의된 라이센스 체크&lt;/li&gt;
&lt;li&gt;라이센스 변수에 사용하는 라이센스를 넣어주면 된다&lt;/li&gt;
&lt;li&gt;내부 라이센스 사용 시 CLOSED 를 추가해주면 스킵됨&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;&lt;b&gt;DO_CONFIGURE&lt;/b&gt;&lt;/p&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;do_configure 함수를 직접 만들거나 autotools.bbclass 등을 inherit 하여 사용한다&lt;/li&gt;
&lt;li&gt;inherit 할 경우 EXTRA_OECONF 등의 변수를 사용하여 커스터마이즈 가능&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;&lt;b&gt;DO_COMPILE&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&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;do_configure 과 비슷하게 직접 정의하거나 사전 정의된 클래스를 inherit 하여 사용한다&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;&lt;b&gt;DO_INSTALL&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드 후 산출물을 원하는 디렉토리에 설치하는 task&lt;/li&gt;
&lt;li&gt;D 변수와 함께 사용해야 한다&lt;/li&gt;
&lt;li&gt;D = ${WORKDIR}/image&amp;nbsp;&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;&lt;b&gt;DO_PACKAGE&lt;/b&gt;&lt;/p&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;최종 이미지를 만들 때는 패키지 단위로 설치가 진행된다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Yocto/처음 시작하는 Yocto 프로젝트</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/413</guid>
      <comments>https://tooyoung.tistory.com/413#entry413comment</comments>
      <pubDate>Sat, 22 Feb 2025 13:48:10 +0900</pubDate>
    </item>
    <item>
      <title>Yocto 프로젝트 용어 소개</title>
      <link>https://tooyoung.tistory.com/412</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Metadata vs Bitbake&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make 와 makefile 의 차이라고 간단하게 설명 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make는 빌드하는 도구이고, makefile은 빌드하는 내용물이 정의되어 있는 메타데이터들.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bitbake는 파이썬으로 만들어져있는 yocto를 빌드하는 핵심 도구이자 엔진.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;metadata는 빌드를 하는 방법을 정의한 파일들 (.bb 파일들 위주)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 컴포넌트는 자신만의 bb 파일이 있으며 그 안에는 소스 다운로드 방법부터 빌드 방법까지 전부 정의되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yocto 시스템은 계층구조로 이뤄져있고 이를 메타데이터로 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층 구조는 아래와 같다.&lt;/p&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&gt;layer: 비슷한 기능을 하는 컴포넌트의 레이어를 모아놓은 것&lt;/li&gt;
&lt;li&gt;recipes: .bb 로 이뤄져있으며 각 컴포넌트가 어떻게 빌드되는지 정의함&lt;/li&gt;
&lt;li&gt;machine: bsp 관련 레시피를 모아둠&lt;/li&gt;
&lt;li&gt;distro: 배포판의 설정 및 관련 컴포넌트를 모아둔 것&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;위의 메타데이터들을 bitbake라는 엔진을 사용해 custom linux image를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Distro&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포판의 약자로, 빌드 전체를 구성하는 정책을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포판의 ipv6, 키보드, nfs 등과 같은 어떤 특성을 지원하는지 + 배포판 이름과 버전을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;u&gt;conf/distro.conf&lt;/u&gt;&lt;/span&gt;&lt;/b&gt; 에 정의되어있고 local.conf에 distro 변수를 넣어 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poky 가 레퍼런스 배포판이고, poky-agl + pelux + tizen 같은 다양한 커스텀 리눅스 배포판이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;MACHINE&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yocto 이미지가 빌드되는 대상 디바이스 또는 SoC를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;machine 은 bsp 레이어의 &lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;u&gt;machine이름.conf 파일&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;이 존재하며 local.conf 파일에 machine 이름을 넣어 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poky에서는 3가지 레퍼런스 머신을 제공하는데 x86, bedgerouter, beaglebone 제공 중이며 qemu 도 지원한다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Layers&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 레이어의 조합으로 구성. 여기서 레이어는 레시피의 조합으로 구성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 oe-core (OpenEmbedded Core)를 기반으로 한다.&lt;/p&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&gt;poky (oe-core)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 빌드 시스템 제공 (bitbake)&lt;/li&gt;
&lt;li&gt;패키지 및 리눅스 배포에 필요한 기본 레시피를 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;poky (meta-yocto)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Yocto 프로젝트에서 제공하는 기본 메타 데이터가 포함된 레이어&lt;/li&gt;
&lt;li&gt;meta-yocto 레이어는 기본적인 빌드 설정 및 예제 머신 구성을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hardware-Specific BSP Layer (하드웨어별 BSP 레이어)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 하드웨어 보드에 맞춘 BSP (Board Support Package) 관련 구성 요소&lt;/li&gt;
&lt;li&gt;예를 들어 meta-raspberrypi 레이어가 이에 해당됨&lt;/li&gt;
&lt;li&gt;주로 부트로더, 커널, 하드웨어 드라이버 관련 설정이 포함됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UI Specific Layer (UI 레이어)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI (User Interface) 관련 설정 및 패키지를 포함하는 레이어&lt;/li&gt;
&lt;li&gt;Qt 기반의 UI 어플리케이션을 포함하는 레이어&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;최상위 레이어, 개발자가 추가하는 애플리케이션, 사용자 설정, 커스텀 스크립트 등이 포함됨&lt;/li&gt;
&lt;li&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-ke-size=&quot;size16&quot;&gt;결론적으로 하위 레이어일수록 공통적인 기능을 제공하며 상위 레이어로 갈수록 특정 제품 또는 개발자 맞춤 설정이 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어는 독립적이며 필요에 따라 추가/삭제 될 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어와 소프트웨어를 분리하여 유지보수가 용이하며 커스텀 배포판을 손쉽게 관리할 수 있음&lt;/p&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Layers 예시&lt;/h3&gt;
&lt;p data-end=&quot;129&quot; data-start=&quot;105&quot; data-ke-size=&quot;size16&quot;&gt;1. Poky (기본 레이어)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;304&quot; data-start=&quot;133&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;176&quot; data-start=&quot;133&quot;&gt;Poky는 Yocto 프로젝트의 기본적인 메타데이터가 포함된 레이어&lt;/li&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;180&quot;&gt;예시: curl_7.82.0.bb
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;304&quot; data-start=&quot;208&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;272&quot; data-start=&quot;208&quot;&gt;meta/recipes-support/curl/ 디렉터리 내에 curl_7.82.0.bb 파일이 존재&lt;/li&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;278&quot;&gt;curl 패키지를 빌드하는 레시피 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;353&quot; data-start=&quot;306&quot; data-ke-size=&quot;size16&quot;&gt;2. meta BSP Layer (예: Raspberry Pi BSP)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;538&quot; data-start=&quot;357&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;357&quot;&gt;특정 하드웨어(보드)에 맞는 &lt;b&gt;Board Support Package (BSP)&lt;/b&gt; 를 포함하는 레이어&lt;/li&gt;
&lt;li data-end=&quot;538&quot; data-start=&quot;425&quot;&gt;예시: linux-raspberry_5.10.bb
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;538&quot; data-start=&quot;462&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;462&quot;&gt;recipes-kernel/linux/ 디렉터리에 위치.&lt;/li&gt;
&lt;li data-end=&quot;538&quot; data-start=&quot;503&quot;&gt;Raspberry Pi 보드용 리눅스 커널을 정의한 레시피.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;581&quot; data-start=&quot;540&quot; data-ke-size=&quot;size16&quot;&gt;3. meta custom layer (사용자 정의 레이어)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;867&quot; data-start=&quot;585&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;585&quot;&gt;개발자가 기존 레시피를 수정할 때, &lt;b&gt;기본 파일을 직접 변경하는 것이 아니라 .bbappend 파일을 이용하여 추가 및 오버라이드&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;867&quot; data-start=&quot;672&quot;&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;867&quot; data-start=&quot;683&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;769&quot; data-start=&quot;683&quot;&gt;meta/recipes-support/curl/curl_%.bbappend
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;769&quot; data-start=&quot;736&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;769&quot; data-start=&quot;736&quot;&gt;curl 패키지에 대한 사용자 정의 수정 사항 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;867&quot; data-start=&quot;775&quot;&gt;recipes-kernel/linux/linux-raspberry_%.bbappend
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;867&quot; data-start=&quot;834&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;867&quot; data-start=&quot;834&quot;&gt;Raspberry Pi용 커널 레시피에 대한 추가 수정.&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Recipe 에서 쓰는 변수 종류&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 55.1163%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;SRC_URI&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;컴포넌트 소스 주소 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;LICENSE&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;라이센스 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;PN&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;패키지 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;PV&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;패키지 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;DEPENDS&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;빌드 타임 의존성 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.4651%;&quot;&gt;RDEPENDS&lt;/td&gt;
&lt;td style=&quot;width: 34.6512%;&quot;&gt;런타임 의존성 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Class&lt;/h3&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;Meta 레이어의 classes 디렉토리 밑에 존재&lt;/li&gt;
&lt;li&gt;bbclass 확장자&lt;/li&gt;
&lt;li&gt;레시피에서 inherit 지시어와 함께 사용 (inherit cmake)&lt;/li&gt;
&lt;li&gt;Conf 파일에서 INHERIT 지시어와 함께 사용&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Poky/meta/classes/base.bbclass 가 yocto 의 기본 태스트가 정의된 기본 class&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;레시피 전개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739689161094&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;5 Writing a New Recipe &amp;mdash; The Yocto Project &amp;reg; dev documentation&quot; data-og-description=&quot;Recipes (.bb files) are fundamental components in the Yocto Project environment. Each software component built by the OpenEmbedded build system requires a recipe to define the component. This section describes how to create, write, and test a new recipe. 5&quot; data-og-host=&quot;docs.yoctoproject.org&quot; data-og-source-url=&quot;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&quot; data-og-url=&quot;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bmfiwY/hyYcSQ277l/vaVFaruwAaFkosrW54pEN0/img.png?width=571&amp;amp;height=923&amp;amp;face=0_0_571_923&quot;&gt;&lt;a href=&quot;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.yoctoproject.org/dev/dev-manual/new-recipe.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bmfiwY/hyYcSQ277l/vaVFaruwAaFkosrW54pEN0/img.png?width=571&amp;amp;height=923&amp;amp;face=0_0_571_923');&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;5 Writing a New Recipe &amp;mdash; The Yocto Project &amp;reg; dev documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Recipes (.bb files) are fundamental components in the Yocto Project environment. Each software component built by the OpenEmbedded build system requires a recipe to define the component. This section describes how to create, write, and test a new recipe. 5&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.yoctoproject.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfCQR8/btsMi4Qswow/8K00qPK5iNLqOocSbfD2S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfCQR8/btsMi4Qswow/8K00qPK5iNLqOocSbfD2S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfCQR8/btsMi4Qswow/8K00qPK5iNLqOocSbfD2S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfCQR8%2FbtsMi4Qswow%2F8K00qPK5iNLqOocSbfD2S1%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;571&quot; height=&quot;923&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1223&quot; data-start=&quot;88&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;155&quot; data-start=&quot;88&quot;&gt;&lt;b&gt;레시피 작성 (Establish the Recipe)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;155&quot; data-start=&quot;128&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;155&quot; data-start=&quot;128&quot;&gt;새로운 레시피(.bb 파일)를 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;263&quot; data-start=&quot;157&quot;&gt;&lt;b&gt;소스 파일 가져오기 (Fetch Source Files)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;263&quot; data-start=&quot;199&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;263&quot; data-start=&quot;199&quot;&gt;원격 저장소(Git, SVN 등)에서 소스 파일을 다운로드하거나, 로컬 경로를 지정하여 소스 파일을 가져옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;265&quot;&gt;&lt;b&gt;소스 파일 압축 해제 (Unpack Source Files)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;337&quot; data-start=&quot;309&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;309&quot;&gt;가져온 소스 파일이 압축되어 있다면 해제합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;339&quot;&gt;&lt;b&gt;소스 파일 패치 적용 (Patching Source Files)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;425&quot; data-start=&quot;385&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;385&quot;&gt;Yocto에서 요구하는 빌드 환경에 맞게 패치를 적용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;427&quot;&gt;&lt;b&gt;라이선스 정보 추가 (Add Licensing Information)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;512&quot; data-start=&quot;476&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;476&quot;&gt;패키지의 라이선스 정보를 LICENSE 변수에 정의합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;514&quot;&gt;&lt;b&gt;설정 추가 (Add Configurations)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;587&quot; data-start=&quot;551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;551&quot;&gt;빌드 설정(do_configure 함수 등)을 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;589&quot;&gt;&lt;b&gt;컴파일 수행 (Compilation)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;658&quot; data-start=&quot;620&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;620&quot;&gt;do_compile 함수를 통해 실제 소스 코드를 빌드합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;660&quot;&gt;&lt;b&gt;Autotools 또는 CMake 사용 여부 확인&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;789&quot; data-start=&quot;698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;747&quot; data-start=&quot;698&quot;&gt;&lt;b&gt;Yes&lt;/b&gt; &amp;rarr; 자동으로 do_install 단계에서 필요한 작업이 수행됨.&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;751&quot;&gt;&lt;b&gt;No&lt;/b&gt; &amp;rarr; do_install 함수를 직접 작성해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;940&quot; data-start=&quot;791&quot;&gt;&lt;b&gt;추가적인 서비스(예: 데몬, 백그라운드 프로세스)가 필요한가?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;940&quot; data-start=&quot;836&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;900&quot; data-start=&quot;836&quot;&gt;&lt;b&gt;Yes&lt;/b&gt; &amp;rarr; 서비스 초기화 스크립트(예: systemd 또는 init.d 스크립트)를 설치해야 함.&lt;/li&gt;
&lt;li data-end=&quot;940&quot; data-start=&quot;904&quot;&gt;&lt;b&gt;No&lt;/b&gt; &amp;rarr; 추가적인 설치 작업 없이 패키징 단계로 이동.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1019&quot; data-start=&quot;942&quot;&gt;&lt;b&gt;패키징 (Packaging)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1019&quot; data-start=&quot;970&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1019&quot; data-start=&quot;970&quot;&gt;빌드된 결과물을 .ipk, .rpm, .deb 등의 패키지 형식으로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1130&quot; data-start=&quot;1021&quot;&gt;&lt;b&gt;설치 후 스크립트 제공 (Provide Post-Installation Scripts)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1130&quot; data-start=&quot;1082&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1130&quot; data-start=&quot;1082&quot;&gt;패키지 설치 후 실행해야 하는 후처리 스크립트(예: 환경 설정)를 추가할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1132&quot;&gt;&lt;b&gt;런타임 테스트 수행 (Perform Runtime Testing)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1223&quot; data-start=&quot;1181&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1181&quot;&gt;실제 환경에서 실행 테스트를 진행하여 레시피가 올바르게 동작하는지 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Packagegroup &amp;amp; Image&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Packagegroup: 다양한 패키지들의 번들 모음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Image: yocto 최상위 레시피, 다양한 이미지를 제공하기 위해 기본 제공되는 이미지. .bb 를 실행하면 이미지가 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 core-image-minimal.bb를 상속받아 개발을 시작함&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Yocto/처음 시작하는 Yocto 프로젝트</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/412</guid>
      <comments>https://tooyoung.tistory.com/412#entry412comment</comments>
      <pubDate>Sun, 16 Feb 2025 16:11:50 +0900</pubDate>
    </item>
    <item>
      <title>Yocto 프로젝트 소개</title>
      <link>https://tooyoung.tistory.com/411</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;임베디드 리눅스 시스템 소개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베디드 하드웨어 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 부트로더 + 리눅스 커널과 드라이버 + 미들웨어 + 어플리케이션 +&amp;nbsp;&lt;b&gt;툴체인&lt;/b&gt;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 소스코드를 실제 임베디드 시스템 내에서 실행 가능한 바이너리 코드로 바꿔주는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 컴파일러, 코어 라이브러리 등이 포함되어 있음&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;임베디드 리눅스 부팅 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부트로더
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DTB 로딩, 커널을 램에 적재, 커널 시작&lt;/li&gt;
&lt;li&gt;u-boot 이 임베디드 시스템에서 자주 사용되는 오픈소스 부트로더&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;커널
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부트로더는 더 이상 사용되지 않고, 메모리를 회수&lt;/li&gt;
&lt;li&gt;부트로더에서 커널로 제어권이 넘어갈 때, 하드웨어의 세부사항 + 커널 커맨드 정보가 함께 넘어감&lt;/li&gt;
&lt;li&gt;운영체제에 가장 핵심적인 역할을 하며, 커널이 시작되면 루프 파일 시스템 마운트와 동시에 init 어플리케이션 시작&lt;/li&gt;
&lt;li&gt;init은 최근 systemd 가 많이 사용되는 추세
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;sbin/init: 사용자 공간 서비스 및 애플리케이션 시작&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;임베디드 리눅스 빌드 시스템&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈소스 컴포넌트 + 자체개발 컴포넌트 + 외부 업체 개발 컴포넌트 = 임베디드 리눅스 빌드 시스템&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 산출물: 툴체인, 부트로더 이미지, 커널 이미지, 루트파일 시스템 이미지&amp;nbsp;&lt;/p&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Yocto 프로젝트 소개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 상관 없이,&amp;nbsp;&lt;b&gt;커스텀 임베디드 리눅스 시스템을 생성하는데 도움을 주는 오픈소스 프로젝트&lt;/b&gt;&lt;/p&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&gt;Poky: Yocto 프로젝트 레퍼런스 배포판 (Yocto 프로젝트의 하위 프로젝트)&lt;/li&gt;
&lt;li&gt;OpenEmbedded: Poky 의 핵심 부분을 차지하는 빌드 엔진과 Yocto 호환 메타데이터&lt;/li&gt;
&lt;li&gt;Yocto 프로젝트: 최상위 오픈 소스 프로젝트&amp;nbsp;&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;윈드리버, 인텔이 아주 오랫동안 yocto platinum member 로 참여되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yocto 산하 프로젝트 소개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: bitbake, openembbed core, poky, toaster, auto builder&amp;nbsp;&lt;/p&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Yocto 프로젝트 작업 흐름&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설정 파일 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) User Configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 사용자 설정(병렬 빌드, 머신, 디스트로 설정), 빌드 레이어 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Machine BSP Configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 하드웨어 관련 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Policy Configuration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 배포판 관련 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Meta&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전역 설정은 보통 확장자가 .conf 로 이루어져 있음 / 개별 컴포넌트 확장자는 .bb&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; yocto 에서 파일 확장자가 .conf 면 전역 설정이다.&lt;/p&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;빌드 프로세스 (Build Process)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스, 패치 파일 등의 위치가 정의되어 있기 때문에, 각 컴포넌트별로 정의된 우선순위에 맞게 다운로드 받음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SRC_URI 변수에 정의되어 있음
&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;MIRROR 사이트도 접근하여 진행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Patch 를 통한 소스 수정을 지원한다.&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;Autotools, cmake, qmake, scons 등 다양한 빌드 도구를 지원하는데, cmake를 잘 사용하는 편&lt;/li&gt;
&lt;li&gt;EXTRA_OEMAKE 등과 같은 변수로 추가 설정 지원&lt;/li&gt;
&lt;li&gt;pseudo 를 사용하여 특별한 파일, 권한 및 소유자/그룹을 설정함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정해진 규칙에 따라 package 생성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤더파일이 포함된 dev 패키지 + 디버그 심볼 들어간 debug 패키지 생성&lt;/li&gt;
&lt;li&gt;rpm, deb, ipk 패키지 등 중 한 개를 선택하여 최종 산출물 만들 수 있음&amp;nbsp;&lt;/li&gt;
&lt;li&gt;패키지가 생성되면 제대로 생성됐는지 확인 -&amp;gt; QA 체크 (sanity check)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;yocto reference 를 읽으면 새니티 체크 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Yocto/처음 시작하는 Yocto 프로젝트</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/411</guid>
      <comments>https://tooyoung.tistory.com/411#entry411comment</comments>
      <pubDate>Sat, 15 Feb 2025 18:14:43 +0900</pubDate>
    </item>
    <item>
      <title>부팅 비교</title>
      <link>https://tooyoung.tistory.com/410</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정리 (비교표)&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;NFS Boot&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;네트워크에서 파일 시스템 마운트&lt;/td&gt;
&lt;td&gt;저장장치 부담 없음, 실시간 코드 변경 가능&lt;/td&gt;
&lt;td&gt;네트워크 없으면 부팅 불가&lt;/td&gt;
&lt;td&gt;개발 중 테스트 및 디버깅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;RAM Boot&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;RAM에 파일 시스템 로드 후 부팅&lt;/td&gt;
&lt;td&gt;빠른 부팅, 저장장치 필요 없음&lt;/td&gt;
&lt;td&gt;RAM 부족 시 문제, 재부팅 시 데이터 초기화&lt;/td&gt;
&lt;td&gt;복구 모드, 디스크 없는 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;U-Boot&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;임베디드 시스템 부트로더&lt;/td&gt;
&lt;td&gt;다양한 부팅 방식 지원, 유연한 설정 가능&lt;/td&gt;
&lt;td&gt;설정 실수 시 부팅 불가&lt;/td&gt;
&lt;td&gt;Yocto 등 임베디드 OS 부팅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;NFS Boot&lt;/b&gt; &amp;rarr; 네트워크 기반으로 파일 시스템 실행 (개발 중 편리)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RAM Boot&lt;/b&gt; &amp;rarr; RAM에 올려서 부팅 (빠르지만 휘발성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;U-Boot&lt;/b&gt; &amp;rarr; 다양한 부팅 방식을 설정하고 실행하는 부트로더&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>임베디드</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/410</guid>
      <comments>https://tooyoung.tistory.com/410#entry410comment</comments>
      <pubDate>Mon, 10 Feb 2025 21:49:33 +0900</pubDate>
    </item>
    <item>
      <title>메모리 종류</title>
      <link>https://tooyoung.tistory.com/409</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;메모리는 크게 ROM 과 RAM 으로 분류된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAM 은 읽고 쓰기가 가능한 메모리이고 ROM은 쓰기에 제약이 있는 메모리이다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;Flash Memory 타입은 보통 10만번 정도를 쓸 수 있으며 쓰기 수명이 긴 것들이 일반적으로 쓰기 속도도 빠르다.&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;ROM 알아보기&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Masking ROM&lt;/h4&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;/p&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;OTP ROM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 데이터를 쓸 수는 있지만 한 번 쓰면 수정이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 보안에서 유용하게 사용되기 때문에 대부분의 SoC가 내부에 OTP ROM을 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 주요한 데이터(암호화 키, 시리얼 넘버 등)를 OTP ROM에 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OTP ROM 또한 마스킹 롬처럼 비휘발성 메모리이자 데이터 보존성이 뛰어난 메모리이다.&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;EEPROM (Electrically Erasable Programmable Rom)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽고 쓸 수 있는 ROM 들 중 가장 오래된 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 플래쉬 메모리 라고 생각하면 된다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 EPROM (지우고 재작성 가능한 메모리) 와 EEPROM (전기적으로 지울 수 있는 메모리) 에서 발전된 형태이다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;NOR Flash vs NAND Flash&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 비휘발성 메모리인 플레쉬 메모리이다. (전원이 없어도 보존이 가능한 메모리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 셀 구조 및 데이터 접근 방식에서 차이를 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOR Flash&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 기반 읽기 (Random Access)
&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;실행 코드 저장 및 실행에 적합하다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;느린 쓰기와 삭제 + 빠른 읽기&lt;/li&gt;
&lt;li&gt;낮은 저장 밀도 (저장 용량은 낮고 가격은 비쌈)&lt;/li&gt;
&lt;li&gt;데이터 정확도가 높음&lt;/li&gt;
&lt;li&gt;펌웨어 저장 (IoT 디바이스, 자동차 전자장치, 임베디드 시스템)&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;NAND Flash&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록 기반 읽기 (Sequential Access)
&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;단순 데이터 저장에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빠른 쓰기와 삭제 + 느린 읽기&lt;/li&gt;
&lt;li&gt;높은 저장 밀도 (저장 용량은 크고 가격이 쌈)&lt;/li&gt;
&lt;li&gt;낮은 신뢰성&amp;nbsp;
&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;오류 수정 알고리즘 (Error Correction Code, ECC) 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템에서 데이터를 실행하려면 복사가 필요함&lt;/li&gt;
&lt;li&gt;SSD, USB 메모리, SD 카드, 스마트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;eMMC (Embedded Multi-Media Controller)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAND 플래쉬 메모리에 NAND 컨트롤러를 내장한 메모리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOR 와 NAND 모두 해당 플래쉬를 제어할 수 있는 컨트롤러를 칩셋 (SoC) 에서 지원해줘야 했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eMMC 는 컨트롤러를 내장하여 최적화된 성능을 갖는다.&lt;/p&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;SSD (Solid State Disk)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eMMC 보다 용량이 크고 빠른 메모리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDD + 플래쉬 메모리 + RAM 이 다 섞인 디스크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 저장 장치는 플래쉬가 사용되며, 이를 제어하는 컨트롤러가 있으며 RAM 버퍼를 사용하여 성능을 높이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크처럼 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDD 메모리를 대체하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDD 메모리는 PVR 이나 DVR 처럼 녹화된 영상과 같이 대용량의 데이터 저장이 필요한 기기에서 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;RAM 알아보기&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SRAM -&amp;gt; DRAM(요즘 쓰이는 RAM의 원형) -&amp;gt; SDRAM&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;DDR SDRAM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 가장 많이 쓰이는 메모리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 클락 신호의 상승 및 하강 엣지에서 데이터를 동시에 전송하여 SDRAM (single data rate dram) 보다 2배의 데이터 전송을 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 ddr은 double date ram 의 줄임말이기도 하다&lt;/p&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&gt;휘발성: 전원이 꺼지면 저장된 데이터가 모두 사라진다.&lt;/li&gt;
&lt;li&gt;고속 등장: 클록 신호의 상승 및 하강 엣지에서 데이터를 전송하여 고속 처리가 가능하다&lt;/li&gt;
&lt;li&gt;동기화: CPU의 클록 신호와 동기화되어 동작합니다.&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;NVRAM (Non-Volatile Random Access Memory)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전원이 꺼져도 데이터를 유지할 수 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DRAM 과 같이 빠른 엑세스 속도를 가지면서도 플래시 메모리처럼 데이터를 영구히 보존한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램임에도 불구하고 비휘발성인 점에서 효율적이다.&lt;/p&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&gt;비휘발성&amp;nbsp;&lt;/li&gt;
&lt;li&gt;빠른 속도&lt;/li&gt;
&lt;li&gt;내구성 -&amp;gt; 쓰기 및 읽기에서&lt;/li&gt;
&lt;li&gt;에너지 효율 -&amp;gt; 데이터 유지에 전력이 필요 없거나 매우 적음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>임베디드</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/409</guid>
      <comments>https://tooyoung.tistory.com/409#entry409comment</comments>
      <pubDate>Mon, 10 Feb 2025 21:46:20 +0900</pubDate>
    </item>
    <item>
      <title>디바이스 드라이버 vs 커널 모듈</title>
      <link>https://tooyoung.tistory.com/408</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gpio 관련 기능 개발 하다가, 내가 만든 기능이 디바이스 드라이버인지 커널 모듈인지 헷갈려 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하자면 둘 다에 해당했음.&lt;/p&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-ke-size=&quot;size16&quot;&gt;디바이스 드라이버는 컴퓨터 프로그램이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터에서 device(기기)를 동작시키거나 조종하는 프로그램인 것이다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 디바이스 드라이버는 파일을 컨트롤하기 위한 프로그램을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널은 application 과 소통하기 위해 VFS를 거치고, 그 이후에 시스템 콜을 거친다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 디바이스 드라이버 역시 VFS의 형식에 맞게 작성되어야 한다.&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;1) character device driver&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이트 단위로 데이터를 순차적으로 받아오기 때문에 버퍼와 캐시를 갖지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로는 키보드, 마우스, 시리얼 포트 등등이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2) block device driver&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일정 크기의 버퍼 (블록 단위) 를 통해 데이터를 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 내부의 파일 시스템에서 관리하고 예시로는 하드 디스크, 램 디스크 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) network device driver&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 계층과 연결되어 네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이더넷 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;커널 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널의 기능을 동적으로 확장하거나 변경할 수 있는 독립적인 코드 조각이다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 실행 중인 커널에 동적으로 추가하거나 제거가 가능한 코드이다.&lt;/p&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;/p&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-ke-size=&quot;size16&quot;&gt;드라이버를 커널 모듈 형태로 구현하며, 커널이 실행 중일 때 동적으로 로드 및 언로드 될 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 중에 insmod 와 rmmod를 통해 추가와 제거가 가능하다.&lt;/li&gt;
&lt;li&gt;디바이스 드라이버에 변경 사항이 생겨도 전체 커널을 다시 빌드하지 않아도 된다.&lt;/li&gt;
&lt;li&gt;커널 이미지 (vmlinuz)와 별도로 드라이버를 관리할 수 있다.&lt;/li&gt;
&lt;li&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;정적 디바이스 드라이버로 제작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이버 코드를 커널 소스에 포함시켜 커널 빌드 시 함께 컴파일 한다. 그리고 커널 이미지 (vmlinuz)에 통합되어 부팅 시 로드된다.&lt;/p&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&gt;커널 부팅 시점에 드라이버가 자동으로 초기화된다.&lt;/li&gt;
&lt;li&gt;드라이버 로드 실패나 의존성 문제를 방지할 수 있다.&lt;/li&gt;
&lt;li&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;p data-ke-size=&quot;size16&quot;&gt;내 안에선 둘 다 그냥 커널에 들어가는 하나의 프로그램인데 왜 나눠놨는지 궁금했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 직관적으로 이해가 된 건 아니지만 의존성 문제인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 많이 해보면 알겠지&lt;/p&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-ke-size=&quot;size16&quot;&gt;커널 모듈&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;동적 로드 및 언로드 가능: insmod, rmmod 명령을 통해 실행 중인 커널에 기능(드라이버 포함)을 추가하거나 제거 가능&lt;/li&gt;
&lt;li&gt;목적
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 하드웨어나 기능을 커널 재부팅 없이도 추가 가능함&lt;/li&gt;
&lt;li&gt;개발 및 디버깅이 편리함 -&amp;gt; 모듈만 교체하면 되니까&lt;/li&gt;
&lt;li&gt;필요하지 않을 때 메모리에서 해제하여 자원 절약 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;커널에 포함: 커널이 부팅될 때 로드되며 실행 중에는 제거할 수 없음&lt;/li&gt;
&lt;li&gt;목적
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부팅에 필수적인 하드웨어를 지원해야 할 때 사용 (루트파일 시스템, 초기화 과정에서 필요한 장치)&lt;/li&gt;
&lt;li&gt;성능과 안정성이 중요한 환경 (정적으로 포함되어 있어 로드 속도가 빠르고 의존성 문제 없음)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&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-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 것을 동적 드라이버 혹은 커널 모듈로 만들지 않은 이유가 궁금했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;성능&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 드라이버는 커널에 이미 포함되어 있기 때문에 부팅 시점부터 바로 사용할 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부팅 초기에는 동적 모듈을 로드할 수 있는 사용자 공간 도구 (udev 등) 이 아직 실행되지 않은 경우가 많다&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;안전성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 추가/제거되는 커널 모듈은 실시간으로 시스템에 영향을 줄 수 있음&lt;/p&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;정적 드라이버는 부팅 시 검증된 상태에서 로드되므로 안정성이 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;의존성 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 모듈은 종종 다른 모듈에 의존한다&lt;/p&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;정적 드라이버는 커널 빌드 시 이미 필요한 모든 의존성이 해결된 상태로 포함된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;부팅 시간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부팅 시점에 동적 로드를 처리하려면 추가 작업 (모듈 검색 및 로드) 이 필요하기 때문에 시간이 더 걸릴 수 있다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;특수 환경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 임베디드 시스템이나 리얼타임 시스템에서는 모든 것이 정적으로 설정되어야만 성능과 안정성이 보장된다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하자면 커널 모듈은 유연성과 확장성, 개발 편의성을 제공하기 위해 만들고 정적 드라이버는 안정성, 성능, 초기화 요구사항을 보장하기 위해 만든다.&lt;/p&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;/p&gt;</description>
      <category>리눅스 커널/혼자 분석한 내용</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/408</guid>
      <comments>https://tooyoung.tistory.com/408#entry408comment</comments>
      <pubDate>Mon, 20 Jan 2025 11:56:09 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드 스튜디오] auto-health 개발 완료 (90프로 쯤)</title>
      <link>https://tooyoung.tistory.com/407</link>
      <description>&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;auto-health 개발이 얼추 완료됐다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;색깔이랑 아이콘 같은 것 이것저것 넣다보니 업로드가 느렸다&lt;br /&gt;기능 자체는 한달 정도 계속 써보면서 테스트를 해봤는데 크게 문제는 없는듯?&lt;br /&gt;네이버 OCR이 인식률이 대단히 좋다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;90프로라 적은 이유는 계속 업데이트가 될 수도 있기 때문에~&lt;br /&gt;&amp;nbsp;&lt;br /&gt;리드미를 적어야되는데 귀찮아서 나중에 적을란다.&lt;br /&gt;오늘 할 일 너무 많이 남음&lt;br /&gt;&amp;nbsp;&lt;br /&gt;개발하면서 아쉬웠던 점은 헬스 커넥트가 생각보다 삼성헬스와 빨리 동기화가 안 된다는 점이다.&lt;br /&gt;이거 속도를 잘 모르겠음&lt;br /&gt;&amp;nbsp;&lt;br /&gt;동기화버튼을 눌러주자마자 바로 들어갈 때도 있고&lt;br /&gt;버튼 안 눌러도 바로 들어가져있을 때도 있고&lt;br /&gt;버튼을 눌러도 30분 뒤에서야 들어갈 때도 있고&lt;br /&gt;&amp;nbsp;&lt;br /&gt;음식 입력 시간도 수정되게 하고 싶은데,&lt;br /&gt;또 뭔가 수정하는 폼을 넣어야 되어서 귀찮아서 담주로 미루겠다&lt;br /&gt;담주에 리드미 수정할 때 추가해야지&lt;br /&gt;&amp;nbsp;&lt;br /&gt;여튼 이제 성분표 보면서 하나하나 입력 안해도 되어서 참 좋다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;홍보 해볼까? 싶다가도 네이버 클라우드 가입 방법이나 ocr 사용을 위한 토큰 발급 방법이나..&lt;br /&gt;가이드를 적어야되어서 고민할 게 많다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;개발을 하는 사람이면 쉽게 할 텐데 개발을 안 접해본 사람들은 아무래도 번거로우니까 걍 안 쓰실듯&lt;br /&gt;이거 앱 쓴다고 가이드 읽으랴 어디 가입하랴 나같아도 걍 앱 안 쓰고 성분표 보고 하나하나 적을 것 같음 (사실 조금만 귀찮으면 되는 일이라서)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그래서 저 부분 생각하면 배포까지 욕심이 나는데 OCR이 한달에 100회까지만 무료라 아마 못할 것 같다&lt;br /&gt;욕심이 많다 많아 돈이 많아지면 좋겠다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;아니 왜 영상 첨부하니까 다깨지고 작아지고 ?&lt;br /&gt;기록용이니까 파일 통째로 올린다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/px924/btsL1BHkMA6/EWRKbAeYDc6C2KuCyrK7Hk/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/px924/btsL1BHkMA6/EWRKbAeYDc6C2KuCyrK7Hk/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4179%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/px924/btsL1BHkMA6/EWRKbAeYDc6C2KuCyrK7Hk/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpx924%2FbtsL1BHkMA6%2FEWRKbAeYDc6C2KuCyrK7Hk%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRSoG/btsL1D6GorM/Awf6r2akIGARby2BBs3ySK/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRSoG/btsL1D6GorM/Awf6r2akIGARby2BBs3ySK/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4179%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRSoG/btsL1D6GorM/Awf6r2akIGARby2BBs3ySK/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRSoG%2FbtsL1D6GorM%2FAwf6r2akIGARby2BBs3ySK%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVynM4/btsL4drcVAm/L78QqdGdL1nTK9RJTqid80/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVynM4/btsL4drcVAm/L78QqdGdL1nTK9RJTqid80/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5572%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVynM4/btsL4drcVAm/L78QqdGdL1nTK9RJTqid80/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVynM4%2FbtsL4drcVAm%2FL78QqdGdL1nTK9RJTqid80%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIibn/btsL1j1f7ql/eUlb1kExa1BMZkYTKEw9e0/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIibn/btsL1j1f7ql/eUlb1kExa1BMZkYTKEw9e0/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5572%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIibn/btsL1j1f7ql/eUlb1kExa1BMZkYTKEw9e0/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIibn%2FbtsL1j1f7ql%2FeUlb1kExa1BMZkYTKEw9e0%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blopEe/btsL3PjTVZk/FdREddUtguoZ3aeNckuGX0/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blopEe/btsL3PjTVZk/FdREddUtguoZ3aeNckuGX0/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5572%; margin-top: 10px;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blopEe/btsL3PjTVZk/FdREddUtguoZ3aeNckuGX0/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblopEe%2FbtsL3PjTVZk%2FFdREddUtguoZ3aeNckuGX0%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2cK9l/btsL4dY2rES/gQC86O79gWrUD8yKDBFKnk/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2cK9l/btsL4dY2rES/gQC86O79gWrUD8yKDBFKnk/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4179%; margin-right: 10px; margin-top: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2cK9l/btsL4dY2rES/gQC86O79gWrUD8yKDBFKnk/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2cK9l%2FbtsL4dY2rES%2FgQC86O79gWrUD8yKDBFKnk%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhbKEo/btsL2GBlMh0/4kK1e6kfk5wuPSHLrtZZw0/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhbKEo/btsL2GBlMh0/4kK1e6kfk5wuPSHLrtZZw0/tfile.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2640&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4179%; margin-top: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhbKEo/btsL2GBlMh0/4kK1e6kfk5wuPSHLrtZZw0/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhbKEo%2FbtsL2GBlMh0%2F4kK1e6kfk5wuPSHLrtZZw0%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;2640&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://github.com/Hayeon-Lee/auto-health&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://github.com/Hayeon-Lee/auto-health&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;GitHub - Hayeon-Lee/auto-health: 삼성 헬스에 등록되지 않은 음식을 편리하게 추가시켜보자&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;삼성 헬스에 등록되지 않은 음식을 편리하게 추가시켜보자. Contribute to Hayeon-Lee/auto-health development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Hayeon-Lee/auto-health&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3Fp4P/hyX4unAr7h/oUPktBD4rwQ9z8JYAwJSak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/YQDog/hyX4lqEaM3/4RQKrTds3u7iWhMl7dKmT0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot; data-og-url=&quot;https://github.com/Hayeon-Lee/auto-health&quot;&gt;&lt;a href=&quot;https://github.com/Hayeon-Lee/auto-health&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Hayeon-Lee/auto-health&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3Fp4P/hyX4unAr7h/oUPktBD4rwQ9z8JYAwJSak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/YQDog/hyX4lqEaM3/4RQKrTds3u7iWhMl7dKmT0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - Hayeon-Lee/auto-health: 삼성 헬스에 등록되지 않은 음식을 편리하게 추가시켜보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;삼성 헬스에 등록되지 않은 음식을 편리하게 추가시켜보자. Contribute to Hayeon-Lee/auto-health development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cXtPOg/btsLSzB7prq/ebrpQdD1H7AuWSQLZrmF20/%EC%8B%A4%ED%96%89%20%EC%98%81%EC%83%81.mp4?attach=1&amp;amp;knm=tfile.mp4&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;실행 영상.mp4&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;5.30MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 개발/auto-health</category>
      <author>투영</author>
      <guid isPermaLink="true">https://tooyoung.tistory.com/407</guid>
      <comments>https://tooyoung.tistory.com/407#entry407comment</comments>
      <pubDate>Sun, 19 Jan 2025 15:14:51 +0900</pubDate>
    </item>
  </channel>
</rss>