<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Engineering Agit</title>
    <link>https://engineering-agit.tistory.com/</link>
    <description>임베디드 시스템 설계를 공부하고 정리하는 공간입니다. (깃허브 주소: https://github.com/sean9595)
[Since 2020.02.06]</description>
    <language>ko</language>
    <pubDate>Thu, 2 Jul 2026 16:04:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Sean_Kim95</managingEditor>
    <image>
      <title>Engineering Agit</title>
      <url>https://tistory1.daumcdn.net/tistory/3654652/attach/26eb61daaef442b69250cd711cf68c13</url>
      <link>https://engineering-agit.tistory.com</link>
    </image>
    <item>
      <title>LLM for Research 01 - Claude Code용 하네스(Harness) 플러그인으로 나만의 연구 워크플로우를 팀 아키텍처로 제작</title>
      <link>https://engineering-agit.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B1jxT/dJMcabRsECh/RDl8v6jpU0S7clycjlJVFK/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B1jxT/dJMcabRsECh/RDl8v6jpU0S7clycjlJVFK/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B1jxT/dJMcabRsECh/RDl8v6jpU0S7clycjlJVFK/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB1jxT%2FdJMcabRsECh%2FRDl8v6jpU0S7clycjlJVFK%2Ftfile.svg&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;revfactory/harness&lt;/code&gt; 플러그인을 써서, 내가 매주 반복하던 연구 워크플로우를 &lt;strong&gt;에이전트 팀 + 스킬&lt;/strong&gt; 구조로 자동화했다.&lt;/li&gt;
&lt;li&gt;도메인 설명 한 번으로 &lt;strong&gt;에이전트 8명 + 스킬 9개 + 오케스트레이터 1개&lt;/strong&gt;가 몇 분 만에 구축됐다.&lt;/li&gt;
&lt;li&gt;가장 큰 수확은 &amp;quot;코드 자동화&amp;quot;가 아니라, &lt;strong&gt;내 워크플로우가 어디서 분기되고 어디서 실패 감지되는지를 문서처럼 드러낸 것&lt;/strong&gt;이었다.&lt;/li&gt;
&lt;li&gt;연구 내용 자체는 민감 영역이라 이 글에서는 기술적 세부는 블러 처리한다. 중심은 &amp;quot;하네스 구축 경험 그 자체&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;1. 배경 — 왜 &amp;quot;하네스&amp;quot;가 필요했나&lt;/h2&gt;
&lt;p&gt;나는 로봇 제어 쪽 연구를 한다. 주기적으로 도는 루프가 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;실기 시연(Kinesthetic demonstration) 데이터 수집·전처리&lt;/li&gt;
&lt;li&gt;데이터 상관/인과 분석&lt;/li&gt;
&lt;li&gt;Signal/Case config 설계&lt;/li&gt;
&lt;li&gt;정책 학습 (여러 case 병렬)&lt;/li&gt;
&lt;li&gt;시뮬레이션 regression 검증&lt;/li&gt;
&lt;li&gt;실기 배포 및 안전 감시&lt;/li&gt;
&lt;li&gt;주간 보고 / 논문 업데이트&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;문제는, 이걸 매주 반복하는데도 &lt;strong&gt;매번 &amp;quot;어디서부터 다시 돌려야 하지?&amp;quot;&lt;/strong&gt; 로 시작한다는 것이다. 일부 산출물만 바꿔도 뒷 단계가 실패하고, 실패 원인을 찾다가 한 주가 간다.&lt;/p&gt;
&lt;p&gt;LLM 에이전트를 도입해볼까 싶어서 이것저것 시도했지만, 결국 &lt;strong&gt;&amp;quot;에이전트가 여러 명 있는 구조를 내가 직접 설계하는 것&amp;quot;&lt;/strong&gt; 에서 막혔다. 에이전트 정의 파일을 수작업으로 쓰고, 스킬 파일 구조 맞추고, 서로가 부르는 프로토콜을 정하고… 이걸 할 시간이 있으면 연구를 하지.&lt;/p&gt;
&lt;p&gt;그러다 발견한 게 &lt;strong&gt;&lt;a href=&quot;https://github.com/revfactory/harness&quot;&gt;revfactory/harness&lt;/a&gt;&lt;/strong&gt; 다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. revfactory/harness 가 하는 일&lt;/h2&gt;
&lt;p&gt;한 줄 요약하면 이렇다 [HIGH, 공식 README 기반]:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;하네스 구성해줘&amp;quot;&lt;/strong&gt; 한 문장이면, 내 도메인 설명을 &lt;strong&gt;에이전트 팀 + 스킬&lt;/strong&gt; 로 변환한다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;조금 더 풀어쓰면 이런 포지션이다 (공식 README 인용, 일부 축약):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code 생태계의 &lt;strong&gt;L3 Meta-Factory&lt;/strong&gt; 중 &lt;strong&gt;Team-Architecture Factory&lt;/strong&gt; 서브 층&lt;/li&gt;
&lt;li&gt;사전 정의된 &lt;strong&gt;6가지 팀 아키텍처 패턴&lt;/strong&gt; 중 하나를 골라줌&lt;ul&gt;
&lt;li&gt;파이프라인 / 팬아웃·팬인 / 전문가 풀 / 생성-검증 / 감독자 / 계층적 위임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;출력물: &lt;code&gt;.claude/agents/&lt;/code&gt; 에이전트 정의 + &lt;code&gt;.claude/skills/&lt;/code&gt; 스킬 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;LangGraph 같은 상태 그래프&amp;quot;나 &amp;quot;Archon 같은 런타임 결정성 도구&amp;quot;와는 층이 다르다.&lt;/strong&gt; LangGraph는 장기 실행·상태 복구가 핵심이고, Archon은 런타임 설정을 결정적으로 뽑는 도구다. Harness는 &lt;strong&gt;팀 아키텍처를 설계&lt;/strong&gt;하는 층이다. 이 구분은 README의 &amp;quot;공존&amp;quot; 테이블에 정리돼 있다. [MEDIUM — 개인적 해석 포함]&lt;/p&gt;
&lt;p&gt;실제로 공식 저장소에서 제시한 자체 A/B 측정 결과 [MEDIUM — n=15 self-reported, 제3자 재현은 진행 중이라고 명시]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;평균 품질: 49.5 → 79.3 (+60%)&lt;/li&gt;
&lt;li&gt;15/15 승률&lt;/li&gt;
&lt;li&gt;출력 분산 −32%&lt;/li&gt;
&lt;li&gt;과제 난이도가 높을수록 개선 폭 증가 (Basic +23.8 / Advanced +29.6 / Expert +36.2)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;수치는 저자 self-reported라는 점은 README에 명시돼 있으니 과대 해석하지 말자. &lt;strong&gt;내가 믿은 건 &amp;quot;수치&amp;quot;보다 &amp;quot;구조화된 팀 아키텍처를 반복 가능하게 뽑아주는 공정&amp;quot; 그 자체&lt;/strong&gt;였다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;3. 구축 준비 — 내가 먼저 한 일&lt;/h2&gt;
&lt;p&gt;Harness 플러그인을 그냥 부른다고 끝나지 않는다. &lt;strong&gt;도메인 설명을 쓰는 것은 내 몫&lt;/strong&gt;이다. 이게 이 플러그인의 가장 정직한 부분이다 — &amp;quot;네 워크플로우를 네가 모르면 아무도 대신 못 해준다.&amp;quot;&lt;/p&gt;
&lt;p&gt;나는 하네스를 부르기 전에 &lt;strong&gt;드래프트 템플릿&lt;/strong&gt; 부터 혼자 썼다. 형식은 이렇다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 도메인 / 목적
2. 입력 / 출력 (경로 / 포맷까지)
3. 주요 서브태스크 (의존성 · 매칭 패턴 · 긴급도)
4. 제약 / 선호 (기존 자산, 언어 톤, 금기 사항)
5. 체크리스트 — 확정 전 검토
6. 불확실 / 추측 사항 (분리)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;여기서 배운 팁 3가지:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;구체 &amp;gt; 추상&amp;quot;&lt;/strong&gt; — &amp;quot;정책 학습&amp;quot; 같은 말은 쓰지 말고, &amp;quot;특정 config JSON 기반으로 N개의 case를 병렬로 학습&amp;quot; 처럼 &lt;strong&gt;파일 경로와 숫자까지 내려와야&lt;/strong&gt; 한다. 그래야 뒤에서 에이전트가 자동화할 여지가 생긴다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실패 사례 &amp;gt; 성공 사례&lt;/strong&gt; — 내 경우 과거에 3가지 고질적 실패 패턴이 있었다. 이걸 &amp;quot;재발 방지 규칙&amp;quot;으로 템플릿에 적어두니, 그대로 Deploy/QA 에이전트의 감시 항목이 됐다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;범위 밖을 명시하라&lt;/strong&gt; — &amp;quot;이건 이 하네스가 안 한다&amp;quot; 목록을 쓰는 게 &lt;strong&gt;범위 안 목록 쓰는 것보다 더 중요했다.&lt;/strong&gt; 다른 연구 트랙(PPLM-DOB, 외부 공동연구 등)이 잘못 트리거되면 하네스가 안 쓰느니만 못해진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;드래프트가 다 쓰여지니, 오히려 &lt;strong&gt;&amp;quot;나는 내가 이 워크플로우를 이 정도로 명확히 알고 있었나?&amp;quot;&lt;/strong&gt; 라는 깨달음이 왔다. 하네스 구축의 절반은 사실 이 단계였다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 실제 구축 — Harness 6 Phase 워크플로우&lt;/h2&gt;
&lt;p&gt;Harness 스킬이 공식적으로 제시하는 워크플로우는 6 Phase다 [HIGH, 공식 README]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Phase 1: 도메인 분석
Phase 2: 팀 아키텍처 설계 (에이전트 팀 vs 서브 에이전트)
Phase 3: 에이전트 정의 생성 (.claude/agents/)
Phase 4: 스킬 생성 (.claude/skills/)
Phase 5: 통합 및 오케스트레이션
Phase 6: 검증 및 테스트&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;내 경우 각 Phase에서 어떻게 결정했는지, 블러 처리한 예시와 함께 정리한다.&lt;/p&gt;
&lt;h3&gt;Phase 1 — 도메인 분석&lt;/h3&gt;
&lt;p&gt;드래프트 템플릿을 그대로 먹였다. 하네스는 이걸 읽고 다음을 확정한다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;서브태스크 N개&lt;/strong&gt; → 내 경우 &lt;strong&gt;7개&lt;/strong&gt; (데이터 전처리 / 통계 분석 / config 설계 / 메인 학습 / 대안 알고리즘 정찰 / 제어기 관리 / 배포·안전 QA / 주간 보고)&lt;/li&gt;
&lt;li&gt;의존성 그래프&lt;/li&gt;
&lt;li&gt;각 태스크의 &amp;quot;긴급도&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 하네스의 가이드가 좋았던 건, &lt;strong&gt;&amp;quot;평소엔 유휴인데 특정 트리거에서만 활성화되는 에이전트&amp;quot;&lt;/strong&gt; 를 명시적으로 허용한다는 점이었다. 내 워크플로우에는 &amp;quot;현재 알고리즘이 안 되면 대안 알고리즘을 시험하는&amp;quot; 에이전트가 필요했는데, 이걸 상시 돌리면 오버엔지니어링이고, 아예 없애면 분기점에서 수동 전환이 필요하다. &lt;strong&gt;&amp;quot;유휴 상태 + 트리거 조건 3종&amp;quot;&lt;/strong&gt; 으로 정의해두니 깔끔해졌다.&lt;/p&gt;
&lt;h3&gt;Phase 2 — 팀 아키텍처 설계&lt;/h3&gt;
&lt;p&gt;핵심 결정 포인트는 &lt;strong&gt;&amp;quot;에이전트 팀&amp;quot;(동시 협업) vs &amp;quot;서브 에이전트&amp;quot;(단발 호출)&lt;/strong&gt; 였다. Harness의 판단 기준은 대략:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;권장 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;에이전트 팀&lt;/td&gt;
&lt;td&gt;2명 이상, 실시간 협업 · 메시지 교환 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서브 에이전트&lt;/td&gt;
&lt;td&gt;단발성 작업, 통신 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;내 워크플로우에서 &lt;strong&gt;데이터→학습→배포&lt;/strong&gt; 구간은 실시간 피드백 루프(학습 실패 → config 재설계 → 재학습)가 자주 일어난다. 여기는 &lt;strong&gt;에이전트 팀&lt;/strong&gt;. 반면 &lt;strong&gt;주간 보고&lt;/strong&gt; 는 앞 산출물만 모아서 한 번 쓰면 끝나는 작업이라 &lt;strong&gt;서브 에이전트&lt;/strong&gt;. 결국 &lt;strong&gt;하이브리드(3 팀 + 1 서브)&lt;/strong&gt; 로 갔다.&lt;/p&gt;
&lt;p&gt;복합 패턴 조합은 다음처럼 권장됐다 [MEDIUM — 내 도메인 특성 반영]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;파이프라인 (A → B → C → D)
  × 팬아웃/팬인 (B 단계에서 N개 case 병렬)
  × 생성-검증 (B ↔ C, 학습 ↔ 배포 반복)
  × 경량 감독자 (D, 파일 기반 수집)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZw6AB/dJMcafGlKf5/9JFoEMbasY6IFIgtNNRK91/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZw6AB/dJMcafGlKf5/9JFoEMbasY6IFIgtNNRK91/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZw6AB/dJMcafGlKf5/9JFoEMbasY6IFIgtNNRK91/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZw6AB%2FdJMcafGlKf5%2F9JFoEMbasY6IFIgtNNRK91%2Ftfile.svg&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 조합이 README의 &amp;quot;team-examples.md&amp;quot; 에 나와 있는 실전 예시와 비슷한 형태였다. 공식 패턴 카탈로그를 참고 자료로 계속 열어두는 게 좋다.&lt;/p&gt;
&lt;h3&gt;Phase 3 — 에이전트 정의 생성&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.claude/agents/{name}.md&lt;/code&gt; 파일이 에이전트별로 하나씩 생성됐다. 구조는 대체로 이렇다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
name: &amp;lt;agent-name&amp;gt;
description: &amp;lt;언제 이 에이전트가 호출되는지&amp;gt;
model: opus
---

# 역할
# 주 스킬
# 입력 / 출력 계약
# 금기 사항&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;여기서 비로소 느낀 점&lt;/strong&gt; — &amp;quot;에이전트 정의&amp;quot; 는 &lt;strong&gt;페르소나가 아니라 계약&lt;/strong&gt; 이다. &amp;quot;너는 친절한 분석가야&amp;quot; 같은 거 쓰는 게 아니라, &lt;strong&gt;&amp;quot;너는 어떤 파일을 읽어서 어떤 파일을 내보내는지&amp;quot;&lt;/strong&gt; 를 쓴다. 이건 기존 LLM 프롬프트 엔지니어링과 결이 다르다.&lt;/p&gt;
&lt;h3&gt;Phase 4 — 스킬 생성&lt;/h3&gt;
&lt;p&gt;스킬은 &lt;strong&gt;Progressive Disclosure&lt;/strong&gt; 패턴을 따른다 [HIGH, 공식 SKILL-writing-guide]. 즉, &lt;code&gt;SKILL.md&lt;/code&gt; 는 500줄 이내로 유지하고, 세부 레퍼런스는 &lt;code&gt;references/&lt;/code&gt; 하위로 뺀다. 컨텍스트 효율 때문이다.&lt;/p&gt;
&lt;p&gt;내가 만든 스킬 구조 (이름만 일반화):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.claude/skills/
├── &amp;lt;main&amp;gt;-orchestrator/SKILL.md   ← 메인 진입점
├── data-pipeline/SKILL.md
├── stats-analysis/SKILL.md
├── config-design/SKILL.md
├── train-multi/SKILL.md
├── alt-scout/SKILL.md
├── controller-sync/SKILL.md
├── deploy-qa/SKILL.md
└── weekly-report/SKILL.md&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;각 스킬의 &lt;strong&gt;description&lt;/strong&gt; 필드가 가장 중요하다. 이게 &lt;strong&gt;&amp;quot;이 스킬이 언제 자동 로드될지&amp;quot;&lt;/strong&gt; 를 결정한다. 여기를 소홀히 쓰면 에이전트가 안 부른다. 반대로 너무 광범위하게 쓰면 엉뚱한 상황에 끼어든다. &lt;strong&gt;실전 팁&lt;/strong&gt;: description에 &amp;quot;should trigger 예시 10개 + should NOT trigger 근접 경계 예시 5개&amp;quot; 를 미리 적어두고, 이걸 디스크립션 작성 기준으로 삼았다.&lt;/p&gt;
&lt;h3&gt;Phase 5 — 통합·오케스트레이션&lt;/h3&gt;
&lt;p&gt;가장 중요한 파일이 &lt;code&gt;&amp;lt;main&amp;gt;-orchestrator/SKILL.md&lt;/code&gt; 다. 이 스킬은:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Phase 0: 컨텍스트 확인&lt;/strong&gt; — &lt;code&gt;_workspace/&lt;/code&gt; 에 이전 실행이 남아있는지 보고, 신규 / 부분 재실행 / 전체 재실행을 구분.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase A/B/C/D: 각 팀 호출&lt;/strong&gt; — &lt;code&gt;TeamCreate&lt;/code&gt; → &lt;code&gt;TaskCreate&lt;/code&gt; → 실시간 &lt;code&gt;SendMessage&lt;/code&gt; → &lt;code&gt;TeamDelete&lt;/code&gt; 까지 한 사이클.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 5: 정리&lt;/strong&gt; — 산출물 경로 보고, 감사 로그 보존.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;여기서 Harness가 강조하는 규칙 중 특히 유용했던 2개 [HIGH]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;모든 Agent/TeamCreate 호출은 &lt;code&gt;model: &amp;quot;opus&amp;quot;&lt;/code&gt; 명시 필수&amp;quot;&lt;/strong&gt; — 안 그러면 팀 구성원마다 모델이 다른 엣지 케이스가 생김.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;후속 작업 키워드를 description에 반드시 넣어라&amp;quot;&lt;/strong&gt; — &amp;quot;재실행&amp;quot;, &amp;quot;업데이트&amp;quot;, &amp;quot;부분&amp;quot;, &amp;quot;다시&amp;quot;, &amp;quot;이전 결과&amp;quot; 같은 말이 들어가야 사용자가 두 번째 대화에서 &amp;quot;그거 다시 돌려줘&amp;quot; 했을 때 자동 로드된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Phase 6 — 검증 및 테스트&lt;/h3&gt;
&lt;p&gt;Harness의 검증 체계는 3층이다 [HIGH, 공식 skill-testing-guide]:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;트리거 검증&lt;/strong&gt; — should-trigger 예시 N개, should-NOT-trigger 근접 경계 예시 M개&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;드라이런 테스트&lt;/strong&gt; — 실제 에이전트 호출 없이 의사(pseudo) 실행 시나리오&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;With-skill vs Without-skill 비교&lt;/strong&gt; — 스킬이 있을 때/없을 때 결과 차이 측정&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;나는 시간상 2번까지만 했다. 3번은 다음 주차 사이클 끝나고 시도할 예정.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 결과물 — 하루 만에 나온 것&lt;/h2&gt;
&lt;p&gt;드래프트 쓰는 데 반나절, 하네스 돌리는 데 2시간, 검증 체크리스트 돌리는 데 1시간. 총 &lt;strong&gt;약 1 working day&lt;/strong&gt; 만에 다음이 나왔다:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;project/
├── CLAUDE.md                      # 트리거 규칙 + 변경 이력
├── .claude/
│   ├── HARNESS_README.md          # 하네스 개요 문서 (자동 생성)
│   ├── agents/                    # 8 에이전트
│   └── skills/                    # 9 스킬 (오케스트레이터 1 + 개별 8)
├── _workspace/                    # 사이클 산출물 (실행 시 자동 생성)
├── harness_template_draft.md      # 내가 쓴 도메인 드래프트
└── ref/harness/                   # 참고용 공식 repo 스냅샷&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;중요&lt;/strong&gt;: 파일 자체보다 &lt;strong&gt;&amp;quot;내가 앞으로 한 사이클 돌리려면 이 하나의 트리거만 부르면 된다&amp;quot;&lt;/strong&gt; 는 사실이 가장 컸다. 예:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;이번 주 새 시연 데이터 들어왔어. 전체 사이클 돌려줘.&amp;quot; → 신규 실행&lt;/li&gt;
&lt;li&gt;&amp;quot;특정 case만 재학습해줘.&amp;quot; → 부분 재실행 (이전 산출물 그대로 참조)&lt;/li&gt;
&lt;li&gt;&amp;quot;실기에서 XX 문제 또 났어. 재배포 루프 돌려줘.&amp;quot; → Phase C부터 재실행 + 피벗 트리거 판정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;6. 예상치 못했던 수확&lt;/h2&gt;
&lt;p&gt;세 가지가 컸다.&lt;/p&gt;
&lt;h3&gt;(a) 내가 몰랐던 &amp;quot;분기점&amp;quot;이 드러났다&lt;/h3&gt;
&lt;p&gt;드래프트에 서브태스크 의존성을 그려보니, &lt;strong&gt;&amp;quot;학습 실패 → config 재설계&amp;quot; 루프&lt;/strong&gt; 가 내가 기존에 생각하던 것보다 훨씬 빈번한 경로였다는 게 보였다. 기존에는 이걸 &amp;quot;예외 처리&amp;quot; 정도로 취급했는데, 하네스는 이걸 &lt;strong&gt;&amp;quot;생성-검증 패턴의 정식 경로&amp;quot;&lt;/strong&gt; 로 정의하라고 요구했다. 그 결과, 이 경로가 워크플로우의 정식 부분이 됐고, 그 부분의 산출물을 별도 관리하게 됐다.&lt;/p&gt;
&lt;h3&gt;(b) &amp;quot;범위 밖&amp;quot; 목록의 가치&lt;/h3&gt;
&lt;p&gt;나는 다른 연구 트랙도 병행 중인데, 하네스 구축 전에는 Claude한테 뭔가 부탁할 때마다 &amp;quot;이건 트랙 A인지 트랙 B인지&amp;quot;를 내가 매번 썼다. 이제는 하네스 트리거 description에 &amp;quot;should NOT trigger&amp;quot; 경계를 명시해놨기 때문에, 다른 트랙 관련 질문을 하면 &lt;strong&gt;이 하네스가 알아서 비켜준다&lt;/strong&gt;. 이게 생각보다 멘탈 코스트를 많이 줄였다.&lt;/p&gt;
&lt;h3&gt;(c) 주간 보고가 덤으로 정리됐다&lt;/h3&gt;
&lt;p&gt;마지막 Phase D (서브 에이전트 &amp;quot;주간 보고&amp;quot;) 가 앞 Phase 산출물을 그냥 읽어서 정리한다. &lt;strong&gt;주간 보고를 따로 작성하지 않아도, 앞 작업을 하네스 위에서 굴리기만 하면 보고 초안이 자동으로 붙어나온다.&lt;/strong&gt; 이건 원래 노렸던 기능인데도, 실제로 동작하는 걸 보니 감동이었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;7. 안 좋았던 점 / 주의할 점&lt;/h2&gt;
&lt;p&gt;공평하게 쓴다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;드래프트 없이는 하네스가 빛이 안 난다.&lt;/strong&gt; 초반에 대충 &amp;quot;내 워크플로우 이런 거야&amp;quot; 하고 넘기면, 에이전트 정의가 두루뭉술하게 나온다. 결국 드래프트를 제대로 쓰는 데 드는 시간이 하네스 절약 시간의 상당 부분을 잡아먹는다. (그래도 나는 남는다고 본다. 드래프트는 한 번 쓰면 자산이 되니까.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;팀 모드&amp;quot;는 아직 실험적이다.&lt;/strong&gt; &lt;code&gt;CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1&lt;/code&gt; 환경변수가 필요하다. 실행 환경에 따라 동작이 살짝씩 다를 수 있다 [MEDIUM — 공식 링크 기반]. 서브 에이전트 모드는 더 안정적인 듯.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자동 스킬 생성은 아직 &amp;quot;초안&amp;quot;이다.&lt;/strong&gt; Harness가 만든 각 SKILL.md는 사람이 한번 훑어야 한다. 특히 description 필드. 이게 LLM이 쓴 그대로면 트리거 정확도가 떨어질 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연구용이라면 &amp;quot;외부 제출/배포 자동화 금지&amp;quot; 룰을 반드시 심어라.&lt;/strong&gt; 나는 논문 submit, git push, 외부 이메일 발송을 사용자 명시 승인 없이는 절대 수행하지 않도록 CLAUDE.md에 못 박아놨다. 이건 Harness 자체 기능이 아니라 내가 덧붙인 룰이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;8. 정리 — 이게 결국 뭐였나&lt;/h2&gt;
&lt;p&gt;Harness가 나한테 준 건 두 가지다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(도구로서)&lt;/strong&gt; &amp;quot;내 도메인 설명 → 에이전트 팀 + 스킬&amp;quot; 변환 공정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(문서로서)&lt;/strong&gt; 내 연구 워크플로우를 &lt;strong&gt;분기/의존성/실패 경로까지&lt;/strong&gt; 일관되게 기술하는 포맷&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;개인적인 결론:&lt;/strong&gt; 반복되는 멀티 스텝 워크플로우가 있고, 그 워크플로우가 &lt;strong&gt;매번 같은 실패 패턴&lt;/strong&gt;을 겪는다면, 하네스 한 번 써볼 만하다. 그게 연구든 콘텐츠 제작이든 소프트웨어 리뷰든.&lt;/p&gt;
&lt;p&gt;특히 연구자 관점에서, &lt;strong&gt;&amp;quot;내가 매주 뭘 하고 있는지&amp;quot; 를 파일로 굳히는 강제력&lt;/strong&gt; 이 있다는 게 크다. 논문 1편보다 이 인프라 문서가 미래의 나에게 더 많은 시간을 돌려줄 수도 있겠다, 는 생각.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;9. 참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;revfactory/harness&lt;/strong&gt;: &lt;a href=&quot;https://github.com/revfactory/harness&quot;&gt;https://github.com/revfactory/harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;공식 Harness 100 (10 도메인 × 100 하네스 예시)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/revfactory/harness-100&quot;&gt;https://github.com/revfactory/harness-100&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;논문 (저자 self-reported A/B 측정)&lt;/strong&gt;: &lt;em&gt;Hwang, M. (2026). Harness: Structured Pre-Configuration for Enhancing LLM Code Agent Output Quality.&lt;/em&gt; [MEDIUM — 개인 self-reported 연구]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Teams 공식 가이드 (Anthropic)&lt;/strong&gt;: &lt;a href=&quot;https://code.claude.com/docs/en/agent-teams&quot;&gt;https://code.claude.com/docs/en/agent-teams&lt;/a&gt; [HIGH]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;이 글의 기술 도구·수치는 인용 근거와 정확도 라벨([HIGH/MEDIUM/LOW])을 병기했다. 연구 도메인 관련 구체 내용은 의도적으로 블러 처리했다. 이상한 내용이나 잘못 사용하는 것이 있다면 의견부탁합니다...ㅎㅎ&lt;/em&gt;&lt;/p&gt;</description>
      <category>Personal Study/LLM</category>
      <category>Agent</category>
      <category>Claude-code</category>
      <category>harness</category>
      <category>llm</category>
      <category>research-workflow</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/38</guid>
      <comments>https://engineering-agit.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 22 Apr 2026 13:48:37 +0900</pubDate>
    </item>
    <item>
      <title>[2021 Motor Controller Study 03] - Main principles to control BLDC motor 02</title>
      <link>https://engineering-agit.tistory.com/37</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◆ 여는 글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 게시물은 이전 글 내용에서 이어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engineering-agit.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.07.12 - [Projects/2021 Motor Controller] - [2021 Motor Controller Study 02] - Main principles to control BLDC motor 01&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626098559136&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;[2021 Motor Controller Study 02] - Main principles to control BLDC motor 01&quot; data-og-description=&quot;1. BLDC 1. 정의 &amp;nbsp;DC(직류) motor의 일종. Commutator(정류자)와 brush에 의해 전류의 방향이 변화하는 Brushed DC motor와는 달리 'closed loop controller(IC를 이용할 수도 있고 microcontroller를 이용할 수..&quot; data-og-host=&quot;engineering-agit.tistory.com&quot; data-og-source-url=&quot;https://engineering-agit.tistory.com/36&quot; data-og-url=&quot;https://engineering-agit.tistory.com/36&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWdrG7/hyKRQdt3WW/GFYmVy15c7Qsmxx0dnxyHK/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/ezqfE/hyKRPr5OSm/yGwVj88RoYqmOXkwv1xhK1/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/bgjkjl/hyKRG9Mqjp/97KrnfkSih6lZWOyTuFL90/img.png?width=2014&amp;amp;height=1242&amp;amp;face=0_0_2014_1242&quot;&gt;&lt;a href=&quot;https://engineering-agit.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engineering-agit.tistory.com/36&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWdrG7/hyKRQdt3WW/GFYmVy15c7Qsmxx0dnxyHK/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/ezqfE/hyKRPr5OSm/yGwVj88RoYqmOXkwv1xhK1/img.png?width=800&amp;amp;height=493&amp;amp;face=0_0_800_493,https://scrap.kakaocdn.net/dn/bgjkjl/hyKRG9Mqjp/97KrnfkSih6lZWOyTuFL90/img.png?width=2014&amp;amp;height=1242&amp;amp;face=0_0_2014_1242');&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;[2021 Motor Controller Study 02] - Main principles to control BLDC motor 01&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. BLDC 1. 정의 &amp;nbsp;DC(직류) motor의 일종. Commutator(정류자)와 brush에 의해 전류의 방향이 변화하는 Brushed DC motor와는 달리 'closed loop controller(IC를 이용할 수도 있고 microcontroller를 이용할 수..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;engineering-agit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Feedback methods&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;BLDC motor의 position control은 기본적으로 폐루프 제어 방식을 택한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;이 폐루프 제어 방식에도 크게 세 가지가 있는데, 하나는 Hall-effect sensor 세 개를 BLDC의 stator에 등간격(60도 혹은 120도)으로 부착하는 방식, 다음은 Rotary encoder를 사용하는 방식 그리고 마지막 하나는 별도의 센서 없이 EMF(ElectroMotive Force)를 측정하는 방식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Hall-Effect Sensor&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Hall-effect sensor에 대해 언급하기 전에 Hall-effect가 무엇인가 집고 넘어갈 필요가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Hall-Effect:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Hall-effect는 전도체에 흐르는 전류와 이에 수직하게 작용하는 자기장 의해 전도체에 발생하는 전압차를 의미한다. 이를 그림으로 나타내면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;1000&quot; width=&quot;600&quot; height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNHID8/btq9xLgbGIS/SQLEyLUokXPN23ExKm9Ivk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNHID8/btq9xLgbGIS/SQLEyLUokXPN23ExKm9Ivk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1&amp;amp;amp;gt; Configuration hall-effect&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNHID8/btq9xLgbGIS/SQLEyLUokXPN23ExKm9Ivk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNHID8%2Fbtq9xLgbGIS%2FSQLEyLUokXPN23ExKm9Ivk%2Fimg.png&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;1000&quot; width=&quot;600&quot; height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1&amp;gt; Configuration hall-effect&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;전도체 평판에 위와 같이 전압원에 의해 전류가 흐른다고 가정하자. 전류는 전형적으로 전하운반자들(전자, 정공, 이온)의 움직임을 내포한다. 위의 그림은 이 중 전자의 움직임을 전류의 흐름으로 보았다. 이때 평판에 수직하강방향으로 자기장이 걸리면 'Lorentz force'에 의해 전자움직임이 직선방향에서 오른쪽으로 치우친 방향으로 변화한다. 이에 의해 B-B' 에 전자가 쌓이고 평판에는 A-A'와 B-B' 사이에 전압차가 발생한다. 이 전압차를 활용한 것이 Hall-effect sensor이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Sensor가 내장되어 있는 BLDC motor는 각각의 hall-effect sensor가 switch와 결합되어있다. 이 switch는 'Logic high(특정 자극에서)' 혹은 'Logic low(특정 자극의 반대에서)' 신호를 생성한다. Commutation sequence는 hall-effect sensor 나오는 logic signal들의 조합으로 결정된다. 다음 그림은 Hall-effect sensor의 부착위치를 나타내기 위한 그림(U상이 High, V상이 Low 그리고 W상이 Float일 때)과 60도 간격으로 설치된 hall-effect sensor(a,b,c)의 BLDC motor 반시계회전에 따른 타이밍 선도이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1105&quot; width=&quot;600&quot; height=&quot;663&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brlBwH/btq9NR7o2iv/KN0sGxTEsF49KXQGl5s2i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brlBwH/btq9NR7o2iv/KN0sGxTEsF49KXQGl5s2i0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 2&amp;amp;amp;gt; Schematic diagram of the BLDC motor w/ Hall-effect sensor(a,b,c)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brlBwH/btq9NR7o2iv/KN0sGxTEsF49KXQGl5s2i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrlBwH%2Fbtq9NR7o2iv%2FKN0sGxTEsF49KXQGl5s2i0%2Fimg.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1105&quot; width=&quot;600&quot; height=&quot;663&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 2&amp;gt; Schematic diagram of the BLDC motor w/ Hall-effect sensor(a,b,c)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;730&quot; width=&quot;650&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhUToj/btq9KnMQbFP/7LxLrgyoFT8zvUwGWGb3F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhUToj/btq9KnMQbFP/7LxLrgyoFT8zvUwGWGb3F0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 3&amp;amp;amp;gt; Hall-effect sensor logic switch output and winding status timing diagram for three-phase BLDC motor driven anti-clockwise [1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhUToj/btq9KnMQbFP/7LxLrgyoFT8zvUwGWGb3F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhUToj%2Fbtq9KnMQbFP%2F7LxLrgyoFT8zvUwGWGb3F0%2Fimg.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;730&quot; width=&quot;650&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 3&amp;gt; Hall-effect sensor logic switch output and winding status timing diagram for three-phase BLDC motor driven anti-clockwise [1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Quadrature encoder&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Quadrature encoder는 Rotary encoder(혹은 Shaft encoder; Electro-mechanical device의 일종. Shaft나 axle의 각위치 혹은 움직임을 아날로그 혹은 디지털 신호로 변환.) 중 'Incremental encoder'에 해당한다. 참고로 rotary encoder는 'Absolute encoder'와 'Incremental encoder' 이렇게 크게 나뉜다. Incremental encoder는 실시간 위치 정보를 보장하므로 rotary encoder 중에서 널리 사용되는 encoder이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;180&quot; width=&quot;500&quot; height=&quot;321&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u28WF/btq9NSepTu4/OCkKDkfDE9rt1hpHmtFN6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u28WF/btq9NSepTu4/OCkKDkfDE9rt1hpHmtFN6K/img.jpg&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 4&amp;amp;amp;gt; Output form of the quadrature encoder for each direction [2]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u28WF/btq9NSepTu4/OCkKDkfDE9rt1hpHmtFN6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu28WF%2Fbtq9NSepTu4%2FOCkKDkfDE9rt1hpHmtFN6K%2Fimg.jpg&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;180&quot; width=&quot;500&quot; height=&quot;321&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 4&amp;gt; Output form of the quadrature encoder for each direction [2]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;위의 그림과 같이 quadrature wave form으로 신호가 생성되므로 Quadrature encoder라고 부른다. 이 encoder는 두가지 신호를 내보내는데 만약에 시계방향으로 도는 경우 Channel A의 신호가 Channel B의 신호보다 앞섦을 통해 현재 모터가 시계방향으로 돌고 있음을 체크할 수 있다. 그리고 wave length를 통해 어떠한 속도로 돌고 있는지도 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Absolute encoder는 정확히 어느 각도에 있는지 알 수 있는 반면 incremental encoder 자체로는 정확한 각도를 알 수 없다. 이를 보완하기 위해 'Bi-directional electronic encoder'를 포함하여 절대적인 각도를 트랙킹한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. EMF&amp;nbsp;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;EMF는 'ElectroMotive Force'의 약자이다. BLDC에서 발생하는 EMF는 전자기 유도에 의해 발생하므로 'Induced Electromotive force(유도기전력)'라고 부르는 것이 더 정확하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;748&quot; width=&quot;600&quot; height=&quot;396&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9lzNj/btq9HKI73Tv/4nPM8apYUaFJjM5gKfcG20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9lzNj/btq9HKI73Tv/4nPM8apYUaFJjM5gKfcG20/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 5&amp;amp;amp;gt; Induced EMF [3]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9lzNj/btq9HKI73Tv/4nPM8apYUaFJjM5gKfcG20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9lzNj%2Fbtq9HKI73Tv%2F4nPM8apYUaFJjM5gKfcG20%2Fimg.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;748&quot; width=&quot;600&quot; height=&quot;396&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 5&amp;gt; Induced EMF [3]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;위의 그림을 보면 전류원이나 전압원이 없는 코일 도선에 자석을 가까이 하면서 자기력선속의 변화를 주면 이를 상쇄시키는 방향으로 유도전류가 발생한다. 이 전류를 EMF에 의해 생성된 전기에너지이다. 이를 설명하는 법칙은 'Lenz의 법칙'이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Lenz%27s_law&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Lenz%27s_law&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626423661221&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;Lenz's law - Wikipedia&quot; data-og-description=&quot;Lenz's law tells the direction of a current in a conductor loop induced indirectly by the change in magnetic flux through the loop. Scenarios a, b, c, d and e are possible. Scenario f is impossible due to the law of conservation of energy. The charges (ele&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/Lenz%27s_law&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/Lenz%27s_law&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEmW3X/hyKTXcJPYD/9CKmKq3taOFVnLUmiku4Ck/img.png?width=1191&amp;amp;height=800&amp;amp;face=0_0_1191_800&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Lenz%27s_law&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/Lenz%27s_law&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEmW3X/hyKTXcJPYD/9CKmKq3taOFVnLUmiku4Ck/img.png?width=1191&amp;amp;height=800&amp;amp;face=0_0_1191_800');&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;Lenz's law - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Lenz's law tells the direction of a current in a conductor loop induced indirectly by the change in magnetic flux through the loop. Scenarios a, b, c, d and e are possible. Scenario f is impossible due to the law of conservation of energy. The charges (ele&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;EMF는 motor의 회전을 방해하는 경향이 있어서 'Back' EMF라고 불러진다. Winding 수와 magnetic flux(rotator의 PM)가 일정하다면 EMF는 rotor의 각속도에 비례한다. 이 back EMF를 monitoring함으로써 stator와 rotor의 위치를 hall-effect sensor 없이 알 수 있다. 이 방식은 sensor를 부착하는 것이 아니므로 motor 설계를 단순화하고 연결선의 추가가 필요하지 않아 비용을 줄일 수 있다. 이는 곧 신뢰성을 향상시킨다. 하지만 정지되어있는 motor는 back EMF를 생성하지 않아 motor 동작시작점에서의 위치를 알기 어렵다. 이를 해결하기 위한 방법으로 충분한 EMF가 발생하기 전까지는 개루프로 동작을 시작하고 이후에 EMF측정을 이용한 폐루프 제어를 하는 것이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1560&quot; width=&quot;600&quot; height=&quot;446&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5XGtJ/btq9NsAfT7Z/vO0HHFQ6dc84FeopbnuQyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5XGtJ/btq9NsAfT7Z/vO0HHFQ6dc84FeopbnuQyk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 6&amp;amp;amp;gt; Hall-effect sensor logic switch output compared with windind Back EMF for a BLDC motor driven anti-clockwise [1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5XGtJ/btq9NsAfT7Z/vO0HHFQ6dc84FeopbnuQyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5XGtJ%2Fbtq9NsAfT7Z%2FvO0HHFQ6dc84FeopbnuQyk%2Fimg.png&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;1560&quot; width=&quot;600&quot; height=&quot;446&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 6&amp;gt; Hall-effect sensor logic switch output compared with windind Back EMF for a BLDC motor driven anti-clockwise [1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;위의 그림은 이전에 알아본 BLDC motor가 반시계방향으로 회전시 Hall-effect sensor의 출력값과 Back EMF 출력값을 비교한 타이밍 선도이다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;2. BLDC motor controlling system design&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;686&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwUBw7/btq9OH4EzoF/UycvJSiXQjTI70T8ttfQl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwUBw7/btq9OH4EzoF/UycvJSiXQjTI70T8ttfQl0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 7&amp;amp;amp;gt; A complete closed-loop control system for sensored three-phase BLDC motor [1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwUBw7/btq9OH4EzoF/UycvJSiXQjTI70T8ttfQl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwUBw7%2Fbtq9OH4EzoF%2FUycvJSiXQjTI70T8ttfQl0%2Fimg.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;686&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 7&amp;gt; A complete closed-loop control system for sensored three-phase BLDC motor [1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Sensor 부분에서 언급했듯 BLDC motor는 폐루프제어에 의해 작동한다. 위의 그림은 BLDC motor 폐루프제어 설계의 한 예시이다. Speed control input에서 설정된 아날로드 신호를 MSP430이 ADC를 이용하여 디지털 신호로 변환하고 해당 아날로그 값에 해당하는 BLDC motor의 속도를 만들기 위한 폐루프제어를 MSP430이 처리하는 system이다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;[1] 'How to power and control brushless DC motor' - Digi-key's North American editors, Digi-key, 2016.12.07&lt;br /&gt;[2] 'Quadrature encoder overview' - DYNAPAR&lt;br /&gt;[3] '유도기전력(induced electromotive force)이란?' - 네이버블로그'한국순환학회, 인아랑, 순환법칙, 사상물리학/화학', applepop, 2016.04.11&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Projects/2021 Motor Controller</category>
      <category>back emf</category>
      <category>bldc</category>
      <category>closed loop control</category>
      <category>EMF</category>
      <category>encoder</category>
      <category>hall effect</category>
      <category>ROTARY ENCODER</category>
      <category>모터 제어</category>
      <category>엔코더</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/37</guid>
      <comments>https://engineering-agit.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 16 Jul 2021 20:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[2021 Motor Controller Study 02] - Main principles to control BLDC motor 01</title>
      <link>https://engineering-agit.tistory.com/36</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. BLDC&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 정의&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;DC(직류) motor의 일종. Commutator(정류자)와 brush에 의해 전류의 방향이 변화하는 Brushed DC motor와는 달리 'closed loop controller(IC를 이용할 수도 있고 microcontroller를 이용할 수도 있음)'를 이용하여 motor winding에 가해지는 DC 전류를 스위칭하여 motor가 회전한다. BLDC에서 전류가 흐르는 코일부인 winding은 stator가 되고 영구자석은 rotator의 일부가 된다. Stator의 winding에 전류를 가하면 자기장이 발생하는데 rotator의 영구자석이 이 자기장을 따라 정렬한다. Controller에서 DC 전류의 phase와 amplitude를 조절하여 motor 회전 속도와 torque를 제어할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;2. 3-Phase BLDC motor Structure &amp;amp; Control schemes&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3-Phase BLDC motor Structure&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1242&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCQDPj/btq9jv47wdz/FQKbSKcRhKMvgZza3de2U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCQDPj/btq9jv47wdz/FQKbSKcRhKMvgZza3de2U1/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1&amp;amp;amp;gt; 3-Phase BLDC motor structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCQDPj/btq9jv47wdz/FQKbSKcRhKMvgZza3de2U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCQDPj%2Fbtq9jv47wdz%2FFQKbSKcRhKMvgZza3de2U1%2Fimg.png&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1242&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1&amp;gt; 3-Phase BLDC motor structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;3-Phase BLDC motor는 전형적으로 위의 그림과 같이 3쌍의 MOSFET들이 'Bridge' 구조로 정렬한 구조와 controller의 PWM signal에 의해 작동한다. PWM frequency는 고주파에서 발생하는 'Switching loss'와 저주파에서 발생하는 'Ripple current'사이에서 trade-off가 존재한다.&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 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Control schemes&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Control 방식은 세 가지 방식이 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;Trapezoidal control:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;세 가지 control 방식 중에 가장 간단한 방식. 각 step에서 6개의 winding 중 두 개의 winding에 전류를 흘리고 다른 winding들은 floating 상태로 둔다. 해당 방식의 단점은 step된 commutation이 torque를 맥동하게 만든다는 점이고 이는 느린 속도에서 뚜렸하게 나타난다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;Sinusoidal control:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Control 방식이 복잡하지만 trapezoidal control 방식에서의 문제였던 'Torque ripple'을 줄일 수 있다. Control 중, motor의 세 coil 전부 전류가 흐르는데 각각의 전류는 각각 120도의 위상각을 갖는다. 해당 control 방식의 결과는 trapezoidal control보다 부드러운 동력전달이 가능하다는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;FOC (Field-Oriented Control):&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;FOC는 stator 전류를 측정하고 인가해서 rotor와 stator의 flux (여기서는 magnetic flux(Wb/m^2))가 항상 90도의 각을 이루도록 하는 방식이다. 해당 방식은 sinusoidal control 방식보다 고속에서 효과적이며 dynamic load가 변하는 상황에서 위의 두 방식보다 나은 성능을 낸다. 고속이나 저속 상관없이 모든 속도에서 사실상 torque ripple이 없고, 부드러우며 정확한 motor control이 가능하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;'How to power and control brushless DC motor' - Digi-key's North American editors, Digi-key, 2016-12-07&lt;/blockquote&gt;</description>
      <category>Projects/2021 Motor Controller</category>
      <category>bldc</category>
      <category>BLDC 모터제어</category>
      <category>motor control</category>
      <category>모터제어</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/36</guid>
      <comments>https://engineering-agit.tistory.com/36#entry36comment</comments>
      <pubDate>Mon, 12 Jul 2021 00:55:03 +0900</pubDate>
    </item>
    <item>
      <title>[2021 Motor Controller Study 01] - Reference</title>
      <link>https://engineering-agit.tistory.com/35</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◆ 여는 글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 study의 목적은 실제로 판매 중인 BLDC motor driver를 기반으로 설계 포인트를 알아보고자 함이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.&amp;nbsp; STEVAL-SPIN3204&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626005232187&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;STEVAL-SPIN3204 - STMicroelectronics&quot; data-og-description=&quot;STEVAL-SPIN3204 - Six-step brushless motor driver evaluation board for applications based on the STSPIN32F0B BLDC controller, STEVAL-SPIN3204, STMicroelectronics&quot; data-og-host=&quot;www.st.com&quot; data-og-source-url=&quot;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&quot; data-og-url=&quot;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blkrau/hyKRGgyE18/gUE3VmWiiL5HwhyxucJsbk/img.png?width=750&amp;amp;height=560&amp;amp;face=0_0_750_560,https://scrap.kakaocdn.net/dn/dLiil4/hyKQtpBjK4/iZzD8Cpfou8mmeBXyXCt9k/img.jpg?width=1000&amp;amp;height=591&amp;amp;face=0_0_1000_591,https://scrap.kakaocdn.net/dn/iTdVk/hyKQoIAzVK/sk4OzIioAMIsBhOKpGDwTK/img.jpg?width=426&amp;amp;height=250&amp;amp;face=0_0_426_250&quot;&gt;&lt;a href=&quot;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.st.com/content/st_com/en/products/evaluation-tools/solution-evaluation-tools/motor-control-solution-eval-boards/3-phase-motors-pmsm-bldc-acim/steval-spin3204.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blkrau/hyKRGgyE18/gUE3VmWiiL5HwhyxucJsbk/img.png?width=750&amp;amp;height=560&amp;amp;face=0_0_750_560,https://scrap.kakaocdn.net/dn/dLiil4/hyKQtpBjK4/iZzD8Cpfou8mmeBXyXCt9k/img.jpg?width=1000&amp;amp;height=591&amp;amp;face=0_0_1000_591,https://scrap.kakaocdn.net/dn/iTdVk/hyKQoIAzVK/sk4OzIioAMIsBhOKpGDwTK/img.jpg?width=426&amp;amp;height=250&amp;amp;face=0_0_426_250');&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;STEVAL-SPIN3204 - STMicroelectronics&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;STEVAL-SPIN3204 - Six-step brushless motor driver evaluation board for applications based on the STSPIN32F0B BLDC controller, STEVAL-SPIN3204, STMicroelectronics&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.st.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CRJQS/btq9jHrlGxs/drzRTSnZqX7jb4pKTdklPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CRJQS/btq9jHrlGxs/drzRTSnZqX7jb4pKTdklPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CRJQS/btq9jHrlGxs/drzRTSnZqX7jb4pKTdklPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCRJQS%2Fbtq9jHrlGxs%2FdrzRTSnZqX7jb4pKTdklPk%2Fimg.jpg&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;3-Phase BLDC* motor driver (STSPIN32F0B 3-Phase BLDC controller 기반)&lt;/li&gt;
&lt;li&gt;STM32F031C6 uC가 직접 motor를 구동하는 방식(6-Step, FOC 그리도 여타 다양한 제어로직으로 모터 제어 가능)&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;※BLDC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626005187933&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;Brushless DC electric motor - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Synchronous electric motor powered by an inverter The motor from a 3.5&amp;nbsp;in floppy disk drive. The coils, arranged radially, are made from copper wire coated with blue insulation. The r&quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btz1Iz/hyKQrL4gVw/stKPverddWs9HgyZ0wLdz0/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900,https://scrap.kakaocdn.net/dn/bAH40o/hyKRQjaUY4/OMRCwvNWwbPqR07DBtYZM1/img.jpg?width=220&amp;amp;height=213&amp;amp;face=0_0_220_213&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/Brushless_DC_electric_motor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btz1Iz/hyKQrL4gVw/stKPverddWs9HgyZ0wLdz0/img.jpg?width=1200&amp;amp;height=900&amp;amp;face=0_0_1200_900,https://scrap.kakaocdn.net/dn/bAH40o/hyKRQjaUY4/OMRCwvNWwbPqR07DBtYZM1/img.jpg?width=220&amp;amp;height=213&amp;amp;face=0_0_220_213');&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;Brushless DC electric motor - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Synchronous electric motor powered by an inverter The motor from a 3.5&amp;nbsp;in floppy disk drive. The coils, arranged radially, are made from copper wire coated with blue insulation. The r&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.&amp;nbsp; Study 방향&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;nbsp;SPIN3204에서의 핵심인 3 Half-Bridge gate, power management 그리고 sensing 부분의 회로에 대한 분석 진행.&lt;/li&gt;
&lt;li&gt;직접 해당 부분의 부품을 구매하여 만능기판에 구성.&lt;/li&gt;
&lt;li&gt;SPIN3204 firmware 분석 -&amp;gt; STM32F031용 이므로 살짝 수정 필요할 것.&lt;/li&gt;
&lt;li&gt;STM32F103으로 펌웨어 구현&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Projects/2021 Motor Controller</category>
      <category>BLDC motor driver</category>
      <category>mcu</category>
      <category>St</category>
      <category>모터드라이버</category>
      <category>임베디드</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/35</guid>
      <comments>https://engineering-agit.tistory.com/35#entry35comment</comments>
      <pubDate>Sun, 11 Jul 2021 21:07:18 +0900</pubDate>
    </item>
    <item>
      <title>[Terminal (Mac OS) study 01] - Introduction</title>
      <link>https://engineering-agit.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◈ 여는 글&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 카테고리는 Mac OS 상에서 'Terminal' 을 다루기 위한 내용을 포함한다. 게시물의 대부분은 구글링을 통한 검색 사항을 번역하여 올리게 될 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 참고 사이트&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1612021838644&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;What is a Terminal?&quot; data-og-description=&quot;On This Page&quot; data-og-host=&quot;itconnect.uw.edu&quot; data-og-source-url=&quot;https://itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&quot; data-og-url=&quot;https://itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/88D8d/hyI66aPhVb/8yxKVVo9Io4VFsSijhNqPK/img.jpg?width=700&amp;amp;height=461&amp;amp;face=0_0_700_461&quot;&gt;&lt;a href=&quot;https://itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://itconnect.uw.edu/learn/workshops/online-tutorials/web-publishing/what-is-a-terminal/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/88D8d/hyI66aPhVb/8yxKVVo9Io4VFsSijhNqPK/img.jpg?width=700&amp;amp;height=461&amp;amp;face=0_0_700_461');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;What is a Terminal?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;On This Page&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;itconnect.uw.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Personal Study/Terminal (Mac OS)</category>
      <category>MAC OS</category>
      <category>macbook</category>
      <category>terminal</category>
      <category>맥 터미널 사용</category>
      <category>터미널</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/33</guid>
      <comments>https://engineering-agit.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 31 Jan 2021 00:52:12 +0900</pubDate>
    </item>
    <item>
      <title>[RTOS study 01] - RTOS란?</title>
      <link>https://engineering-agit.tistory.com/32</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◈ 여는 글&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 카테고리는 RTOS의 이론적인 공부 내용을 담는다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Real-time embedded system&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;실시간 임베디드 시스템은 '실시간 시스템'과 '임베디드 시스템'의 특성을 동시에 갖고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DVWOe/btqVbXhkQ6e/mAPrsqfTiB78ycGk2jZgyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DVWOe/btqVbXhkQ6e/mAPrsqfTiB78ycGk2jZgyK/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1-1&amp;amp;amp;gt; 세 가지 시스템의 상관관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DVWOe/btqVbXhkQ6e/mAPrsqfTiB78ycGk2jZgyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDVWOe%2FbtqVbXhkQ6e%2FmAPrsqfTiB78ycGk2jZgyK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1-1&amp;gt; 세 가지 시스템의 상관관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. Real-time system&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;실시간 시스템은 다음과 같이 정의된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&quot;&lt;span style=&quot;color: #333333;&quot;&gt;실시간장치를 시스템을 계속 감시하여 장치의 상태가 바뀔 때 그와 동시에 제어동작을 구동시키는 시스템&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;실시간 시스템은 하나의 controlling system과 하나 이상의 controlled system으로 구성된다. Controlling system과 controlled system의 상호작용은 다음과 같이 세 가지로 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP9wXf/btqVbuzEEkN/ToPCP6kz4S9lKgLTg0mMJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP9wXf/btqVbuzEEkN/ToPCP6kz4S9lKgLTg0mMJk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1-2&amp;amp;amp;gt; 상호작용 diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP9wXf/btqVbuzEEkN/ToPCP6kz4S9lKgLTg0mMJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP9wXf%2FbtqVbuzEEkN%2FToPCP6kz4S9lKgLTg0mMJk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1-2&amp;gt; 상호작용 diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) Periodic interaction&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;상호작용이 주기적인 경우에는 controlling system이 controlled system으로 통신을 시도한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;b&gt;2) Aperiodic interaction&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/b&gt;상호작용이 비주기적인 경우에는 controlled system이 controlling system으로 먼저 통신을 시도한다. 이러한 상호작용의 경우에는 controlled system의 외부 이벤트가 언제 발생하는 지에 따라 통신이 진행되므로 예측이 불가하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;3) Periodic &amp;amp; Aperiodic interaction&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt; 주기적 그리고 비주기적인 상호작용 특성을 모두 갖는 경우에 controlling system은 controlled system이 발생하는 이벤트와 정보를 처리해서 정해진 시간 안에 응답해야한다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;이와 같은 상호작용을 통해 controlling system은 외부와 상호작용한다. 이러한 실시간 시스템은 '무기방어시스템'를 예로 들 수 있다. 무기방어시스템의 경우에는 C&amp;amp;D(Command and decision) 시스템, radar 시스템 그리고 무기발사제어시스템으로 이루어져있다. 여기서 C&amp;amp;D는 controlling system이고 나머지 시스템들은 controlled system이다. Radar 시스템에서는 적의 미사일을 탐지하여 미사일의 좌표를 C&amp;amp;D에 전송한다. 이때의 상호작용은 비주기적이라고 볼 수 있는데 이는 적의 미사일이 오는 것이 비주기적이기 때문이다. 이에 반해 C&amp;amp;D와 무기발사제어시스템의 상호작용은 주기적인 통신으로 이루어진다. 이는 탐지된 이후 해당 좌표에 대한 정보를 무기발사제어시스템에 전송하는 것은 빠른 시간에 주기적인 신호를 발생하여 이루어지기 때문이다. 이를 통해 실시간 시스템의 특징을 2가지 알 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;1. &lt;b&gt;Logical or functional correctness&lt;/b&gt;: Radar 시스템에서 탐지한 좌표가 정확해야 적의 미사일을 정확하게 타격할 수 있기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;2. &lt;b&gt;Timing correctness&lt;/b&gt;: 만약에 radar에서 탐지한 시점과 무기발사제어시스템에서 발사한 시점의 차이가 너무 크면 해당 미사일을 제거할 수 없기 때문에 정확히 주어진 시간 내에 정해진 process를 처리할 수 있어야한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 두 가지 특징에 의존적인 것이 바로 실시간 시스템이다. 이들 중 후자가 전자에 비해 더 중요하다고 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;추가로 다음과 같은 특징이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;3. &lt;b&gt;Deterministic&lt;/b&gt;: 실시간 시스템은 정해진 시간 안에 외부 이벤트 또는 입력에 반응하기 때문에 확정적이라고 볼 수 있다. 확정적 실시간 시스템의 모든 구성요소는 정해진대로 동작해야 하고 이러한 요소는 전체 시스템이 확정적으로 동작하는데 중요한 역할을 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;4. &lt;b&gt;Robustness&lt;/b&gt;: 실시간 시스템의 '확정성'은 외부환경의 변화에 대한 적응성(adaptability)이 떨어질 수 있다. 이 적응성과 동일한 용어로 견고성(robustness)를 사용한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;위의 두 가지 특성은 적절한 조절이 필요하다. 확정성을 높이면 견고성이 떨어지고 견고성을 높이면 확정성이 떨어지기 때문이다. 이는 개발하고자 하는 시스템의 특성에 의존적이므로 시스템에 따라 달리 설정하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;※ 추가 사항&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;위에서 살펴보았듯 실시간 시스템은 시간에 의존적이며 정해진 deadline이 있고 이에따라 동작한다. 이 deadline에 대해 실시간 시스템을 '경성(hard)' 실시간 시스템과 '연성(soft)' 실시간 시스템으로 나눌 수 있다.&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;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. Embedded system&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;임베디드 시스템은 일반적으로 다음과 같이 정의된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&quot;특정 기능을 수행하기 위해 하드웨어와 소프트웨어를 밀접하게 통합한 컴퓨팅 장치&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;'임베디드(Embedded)'라는 용어에서 알 수 있듯 해당 시스템은 더 큰 시스템인 'embedding' 시스템의 일부로 내장된다. 임베디드 시스템은 특정 기능을 수행하는 것에는 적합하나 다른 기능은 수행할 수 없다는 제약이 있다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. RTOS&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;RTOS(실시간 운영체제)는 다음과 같이 정의된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&quot;코드실행을 시간에 따라 정확히 관리하고, 시스템 자원을 관리하고, 응용 프로그램 개발을 위한 일관된 기반을 제공하는 일종의 프로그램&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;RTOS 기반의 프로그램들은 다양한 종류가 있는데, 이렇게 다양한 요구 사항이 부합할 수 있도록 scalable한 특성을 가져야하는 것이 RTOS의 목표이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;RTOS는 커널(kernal), 파일 시스템, 네트워크 프로토콜 스택, 특정 응용에 필요한 여러 가지 요소 등 다양한 모듈(module)의 조합으로 구성할 수 있다. 혹은 커널로만 RTOS를 구성하는 경우도 있다. 따라서 커널은 RTOS의 핵심요소라고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccFIxd/btqVcrP1Gmy/mFC3N21lPumWD4lHAfaWK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccFIxd/btqVcrP1Gmy/mFC3N21lPumWD4lHAfaWK0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1-3&amp;amp;amp;gt; RTOS 구성요소 (출처: https://circuitdigest.com/article/understanding-rtos-and-how-to-use-it-for-embedded-systems)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccFIxd/btqVcrP1Gmy/mFC3N21lPumWD4lHAfaWK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccFIxd%2FbtqVcrP1Gmy%2FmFC3N21lPumWD4lHAfaWK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1-3&amp;gt; RTOS 구성요소 (출처: https://circuitdigest.com/article/understanding-rtos-and-how-to-use-it-for-embedded-systems)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;대부분의 커널은 다음과 같은 요소를 포함한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btqG6P/btqVe7XzWeR/yqNIHj4h501HauQYqHUhrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btqG6P/btqVe7XzWeR/yqNIHj4h501HauQYqHUhrK/img.jpg&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1-4&amp;amp;amp;gt; RTOS 커널의 핵심요소 (출처:http://www.embeddedlinux.org.cn/rtconforembsys/5107final/LiB0023.html)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btqG6P/btqVe7XzWeR/yqNIHj4h501HauQYqHUhrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtqG6P%2FbtqVe7XzWeR%2FyqNIHj4h501HauQYqHUhrK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1-4&amp;gt; RTOS 커널의 핵심요소 (출처:http://www.embeddedlinux.org.cn/rtconforembsys/5107final/LiB0023.html)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) Scheduler&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;커널에 포함되어 있으며 언제 어떤 task를 실행할 지를 결정하는 알고리즘을 제공한다. 대표적인 스케줄링 알고리즘의 예는 'round-robin' 스케줄링과 'preemptive' 스케줄링이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) Object&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;개발자가 실시간 임베디드 시스템용 응용 프로그램을 만들 때 사용하는 특별한 구조체이다. 대표적으로 'task', 'semaphore', 'message-queue' 등이 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) Service&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;커널이 오브젝트를 대상으로 수행하는 동작을 말한다. 대표적으로 타이머 관련 작업, 인터럽트 처리, 자원관리 등이 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;RTOS는 윈도우와 같은 GPOS(General Purpose Operating System)과는 다음과 같은 공통점과 차이점이 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 156px;&quot; border=&quot;1&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 23px; text-align: center;&quot;&gt;&lt;b&gt;공통점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 23px; text-align: center;&quot;&gt;&lt;b&gt;RTOS만의 특성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;일정 수준의 multi-tasking 지원&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;임베디드 응용에서 필요로하는 보다 높은 신뢰성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;SW와 HW 자원 관리&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;필요에 따라 OS 기능 추가/제거 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;응용프로그램에 기본적인 OS 서비스 제공&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;빠른 수행 속도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;응용프로그램으로부터 HW 추상화&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;적은 메모리 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;실시간 임베디드 시스템에 적합한 스케줄링 정책&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;디스크 없이 ROM과 RAM만으로 시스템 구성 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px; text-align: center;&quot;&gt;다른 HW 플랫폼으로 쉽게 이식 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;RTOS를 이용한 실시간 임베디드 시스템 디자인, Qing li &amp;amp; Caroline Yao. 에이콘&lt;/blockquote&gt;</description>
      <category>Personal Study/RTOS</category>
      <category>EMBEDDED</category>
      <category>RTOS</category>
      <category>Scheduling</category>
      <category>System</category>
      <category>실시간 임베디드 시스템</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/32</guid>
      <comments>https://engineering-agit.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 31 Jan 2021 00:23:34 +0900</pubDate>
    </item>
    <item>
      <title>[Session 03 RTOS study 01] - 실습교재 및 개발환경 구성</title>
      <link>https://engineering-agit.tistory.com/31</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;◈ 여는 글&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 Session 03은 모두의 연구소(강남 캠퍼스) 임베디드 랩의 2번째 session(2021.01.13~)을 다룬다. (Session 03인 이유는 Session 01이 비공식적인 session이었기 때문이다.)&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;이번 session은 RTOS에 관하여 다룬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 교재&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;① 임베디드 OS 개발 프로젝트:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 실제 임베디드 OS의 구현을 위한 실습교재&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oamBJ/btqTJUmUcoP/TvwyS9w9qqjFv2FVMd52IK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oamBJ/btqTJUmUcoP/TvwyS9w9qqjFv2FVMd52IK/img.jpg&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1&amp;amp;amp;gt; 임베디드 OS 개발 프로젝트 (출처: Yes24)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oamBJ/btqTJUmUcoP/TvwyS9w9qqjFv2FVMd52IK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoamBJ%2FbtqTJUmUcoP%2FTvwyS9w9qqjFv2FVMd52IK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1&amp;gt; 임베디드 OS 개발 프로젝트 (출처: Yes24)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;② RTOS를 이용한 실시간 임베디드 시스템 디자인:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 위의 교재에서 명시되어있지 않은 이론적인 내용을 담고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdgQ5x/btqVh8BRQ2z/Y8Y2tuXeHSJ5WzZAs8c5A1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdgQ5x/btqVh8BRQ2z/Y8Y2tuXeHSJ5WzZAs8c5A1/img.jpg&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 2&amp;amp;amp;gt; RTOS를 이용한 실시간 임베디드 시스템 디자인 (출처: Yes24)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdgQ5x/btqVh8BRQ2z/Y8Y2tuXeHSJ5WzZAs8c5A1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdgQ5x%2FbtqVh8BRQ2z%2FY8Y2tuXeHSJ5WzZAs8c5A1%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 2&amp;gt; RTOS를 이용한 실시간 임베디드 시스템 디자인 (출처: Yes24)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 개발환경 구성&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;실습교재에서는 Linux환경에서 진행하고 있지만, 현재 사용하고 있는 노트북은 Mac OS가 설치되어 있기 때문에 VM을 설치하여 Linux를 실행하거나 하드에 직접 OS 사용공간을 할당하여 사용해야 하기 때문에 번거로움이 있다. 따라서 native 환경인 Mac OS에서 embedded system emulator인 QEMU를 설치하고 RTOS에 대한 공부를 하려 한다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 개발환경 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;실제 embedded development board에서 OS를 개발해도 되지만, 해당 dev. board를 구매하는 것은 비용이 든다. 따라서 본 교재에서는 emulator를 이용하여 가상의 dev. board에서 OS를 개발하는 방식을 택했다. 이를 위해 QEMU와 ARM용 cross-compiler인 GCC 설치가 필요하다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1-1. QEMU&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;QEMU는 Quick EMUlator의 약자로 hardware virtualization을 수행하기 위한 무료 오픈소스 emulator이자 virtualizer이다. 해당 emulator는 다양한 종류의 hardware platform들을 지원하는데 우리는 그 중 ARM을 위한 RTOS를 개발할 것이다. 자세한 사항은 아래의 링크를 참고하자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610954988390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;QEMU - Wikipedia&quot; data-og-description=&quot;Free virtualization and emulation software This article is about the virtual machine monitor. For the Quarterdeck expanded memory manager, see QEMM. QEMU (short for Quick EMUlator[2][dubious &amp;ndash; discuss]) is a free and open-source emulator and virtualizer &quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dMGMjg/hyIYxGRZz9/anfA2DHNk31xoRyUYMgaak/img.png?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768,https://scrap.kakaocdn.net/dn/yvghO/hyIYBvJCCm/sFftcv1aqf1zLiKkqAtlh1/img.png?width=300&amp;amp;height=225&amp;amp;face=0_0_300_225&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/QEMU#:~:text=QEMU%20(short%20for%20Quick%20EMUlator,that%20can%20perform%20hardware%20virtualization.&amp;amp;text=It%20also%20can%20be%20used,as%20Intel%20VT%2Dx).&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dMGMjg/hyIYxGRZz9/anfA2DHNk31xoRyUYMgaak/img.png?width=1024&amp;amp;height=768&amp;amp;face=0_0_1024_768,https://scrap.kakaocdn.net/dn/yvghO/hyIYBvJCCm/sFftcv1aqf1zLiKkqAtlh1/img.png?width=300&amp;amp;height=225&amp;amp;face=0_0_300_225');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;QEMU - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Free virtualization and emulation software This article is about the virtual machine monitor. For the Quarterdeck expanded memory manager, see QEMM. QEMU (short for Quick EMUlator[2][dubious &amp;ndash; discuss]) is a free and open-source emulator and virtualizer&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1-2. GCC&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GCC는 GNU Compiler Collection의 약자로 C/C++로 개발된 펌웨어를 embedded system에서 작동할 수 있도록 compile해주는 compiler이다. GCC도 다양한 hardware platform 용 compiler들이 존재하며 우리는 ARM용 GCC를 설치할 것이다. 자세한 사항은 아래의 링크를 참고하자.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;en.wikipedia.org/wiki/GNU_Compiler_Collection&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610955544843&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;GNU Compiler Collection - Wikipedia&quot; data-og-description=&quot;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Compiler system for various programming languages The GNU Compiler Collection (GCC) is a compiler system produced by the GNU Project supporting various programming languages. GCC is a &quot; data-og-host=&quot;en.wikipedia.org&quot; data-og-source-url=&quot;https://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot; data-og-url=&quot;https://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;GNU Compiler Collection - Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;From Wikipedia, the free encyclopedia Jump to navigation Jump to search Compiler system for various programming languages The GNU Compiler Collection (GCC) is a compiler system produced by the GNU Project supporting various programming languages. GCC is a&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;en.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2. 개발환경 구축&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;개발환경 구축은 Mac의 Terminal에서 이루어진다. 다음 순서는 크게 의미가 없고 해당하는 명령어들을 실행해주어 설치하면 구축이 완료된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GCC(ARM용) installation for cross-compiler: 'brew install --cask gcc-arm-embedded'&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Wget(A robust command line application for downloading URL-specified resources): 'brew install wget'&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;QEMU installation for emulating embedded system: 'brew install qemu'&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;여기서 Wget은 추후에 개발 중 URL resource를 이용해야하는 경우가 발생하는데 그때 사용하기 위한 프로그램이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-3. 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1610957094793&quot; class=&quot;zsh&quot; data-ke-language=&quot;zsh&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;➜  ~ brew install --cask gcc-arm-embedded
Updating Homebrew...
==&amp;gt; Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==&amp;gt; New Formulae
acl2                       graphql-cli                odin
act                        gravity                    oha
aerc                       grokj2k                    omake
aida-header                grpcui                     openalpr
airshare                   gtkmm4                     openfast
alsa-lib                   guile@2                    openfst
amp                        gulp-cli                   openjdk@8
apidoc                     h2spec                     openstackclient
arb                        halide                     oq
argo                       hashlink                   or-tools
argocd                     hasura-cli                 ormolu
arrayfire                  hblock                     ory-hydra
arturo                     hcxtools                   osi
asimov                     hdf5-mpi                   osm
asroute                    heksa                      overdrive
asuka                      heppdt2                    ox
athenacli                  httpx                      packetbeat
atkmm@2.28                 hy                         packr
attr                       i686-elf-binutils          pandoc-include-code
austin                     i686-elf-gcc               pandocomatic
autodiff                   idris2                     pangomm@2.42
aws-console                immudb                     parallel-hashmap
aws-rotate-key             indicators                 pdm
awsweeper                  infracost                  periscope
bandit                     inframap                   pfetch
bit-git                    inja                       phive
blaze                      inko                       php@7.4
blogc                      ioctl                      pickle
bombadillo                 isl@0.18                   pipgrip
bond                       isort                      pkger
bootloadhid                jc                         po4a
borgbackup                 jerryscript                podman
box2d                      jimtcl                     postgresql@12
bpytop                     jinx                       prometheus-cpp
buildozer                  jobber                     promtail
c7n                        jolie                      protoc-gen-go-grpc
cadence                    jpeg-xl                    protoc-gen-gogo
cairomm@1.14               jql                        protoc-gen-gogofaster
cargo-audit                json5                      ptpython
cargo-edit                 jsonnet-bundler            pwncat
cargo-watch                k3sup                      python@3.7
carton                     k9s                        python@3.9
cassowary                  kamel                      qrcp
castget                    kcgi                       quill
cbc                        kde-extra-cmake-modules    rain
cbmc                       kde-karchive               rbtools
cddlib                     kde-kdoctools              rcm
cdktf                      kde-ki18n                  redo
cdo                        kde-threadweaver           reg
cfn-flip                   keptn                      regipy
cfn-format                 khiva                      reorder-python-imports
cgl                        kona                       rgf
chalk-cli                  kondo                      richmd
charge                     ksync                      rm-improved
chars                      kube-linter                rqlite
chart-testing              kubecm                     rtorrent
checkov                    kubevela                   rttr
chezmoi                    kubie                      ruby@2.7
choose-rust                kumactl                    rust-analyzer
chrony                     lab                        rustscan
clair                      ladspa-sdk                 s2n
clang-format@8             lanraragi                  saltwater
clash                      latexindent                sdns
claws-mail                 lc0                        semgrep
cli11                      ldpl                       server-go
clip                       leaf                       shallow-backup
cloud-nuke                 leakcanary-shark           sheldon
cloudformation-cli         libaio                     showkey
cloudformation-guard       libbsd                     shtools
coconut                    libcap                     silicon
code-server                libcap-ng                  simdjson
colfer                     libcouchbase@2             skylighting
commitizen                 libcpuid                   sleef
condure                    libdmx                     smlpkg
copilot                    libdrm                     snap
coredns                    libfontenc                 so
cortex                     libfs                      solidity
counterfeiter              libfuse                    sollya
cpio                       libgccjit                  sonic
cpm                        libgnt                     spack
cpr                        libhandy                   sponge
cqlkit                     libice                     spotify-tui
croaring                   libirecovery               spotifyd
croc                       libmnl                     sqlc
cubejs-cli                 libnetfilter-queue         sqlite-utils
cucumber-ruby              libnetworkit               standardese
cvs-fast-export            libnfnetlink               staticcheck
datasette                  libnsl                     strace
dbdeployer                 libolm                     structurizr-cli
detach                     liboqs                     subfinder
device-mapper              libpciaccess               t-rec
dgraph                     libpinyin                  tanka
diskonaut                  libpqxx@6                  taskwarrior-tui
dmagnetic                  libpthread-stubs           tctl
dnsprobe                   librttopo                  tendermint
dnsx                       libseccomp                 tengo
doctest                    libslirp                   termcolor
docui                      libsm                      terracognita
dog                        libtirpc                   terraform-ls
dosbox-staging             libtorrent-rakshasa        terraform@0.12
dotenv-linter              libva                      terraform@0.13
dotnet                     libvdpau                   terrascan
dprint                     libvnc                     tfsec
driftctl                   libx11                     tgenv
duckdb                     libxau                     thanos
duckscript                 libxaw                     thrax
duf                        libxaw3d                   tm
duktape                    libxcb                     toot
earthly                    libxcomposite              torchvision
easy-rsa                   libxcursor                 trailscraper
efm-langserver             libxdamage                 tre-command
eksctl                     libxdmcp                   trec_eval
eleventy                   libxext                    tree-sitter
empty                      libxfixes                  trimage
envoy                      libxfont                   trunk
erlang@22                  libxft                     ugrep
eva                        libxi                      unum
evernote2md                libxinerama                uptoc
f3d                        libxkbfile                 usb.ids
fargatecli                 libxml++@4                 utf8cpp
fava                       libxml++@5                 util-macros
fblog                      libxmu                     uutils-coreutils
fcct                       libxp                      v2ray
fennel                     libxpm                     vapor
fetch                      libxrandr                  vc
field3d                    libxrender                 vcpkg
fizz                       libxres                    vgrep
flamegraph                 libxscrnsaver              vint
flank                      libxshmfence               vivid
flarectl                   libxt                      vlang
flash                      libxtst                    vlmcsd
fleet-cli                  libxv                      volk
flit                       libxvmc                    volta
flow-cli                   libxxf86dga                vsearch
flux                       libxxf86vm                 vtk@8.2
fnm                        linux-headers              vulture
folderify                  litecli                    wangle
font-util                  lizard-analyzer            wasm-pack
foreman                    localstack                 wayland
forge                      logcli                     wayland-protocols
fpart                      logswan                    webify
fpdns                      loki                       wgcf
fplll                      lp_solve                   wownero
functionalplus             lua@5.3                    wren
gallery-dl                 lunchy                     wren-cli
gateway-go                 lunchy-go                  x86_64-elf-gdb
gau                        macos-trash                xbitmaps
gcalcli                    magic_enum                 xcb-proto
gcc@9                      mandown                    xcb-util
gdbgui                     mariadb@10.4               xcb-util-cursor
gdu                        markdownlint-cli           xcb-util-image
ghc@8.8                    marked                     xcb-util-keysyms
ghz                        mask                       xcb-util-renderutil
ghz-web                    massdns                    xcb-util-wm
git-bug                    matplotplusplus            xcbeautify
git-hooks-go               md4c                       xcinfo
git-hound                  mermaid-cli                xdpyinfo
gitlint                    mesa-glu                   xinput
gitql                      mhonarc                    xkeyboardconfig
gitui                      microplane                 xorgproto
giza                       mockery                    xorgrgb
glab                       muffet                     xterm
glibmm@2.64                naabu                      xtrans
gluon                      nanorc                     xxh
gmailctl                   ncspot                     yh
go@1.14                    nest                       yj
gocloc                     networkit                  ykdl
gofish                     never                      youtube-dlc
gofumpt                    nfpm                       youtubedr
golangci-lint              ngs                        yq@3
googletest                 nicotine-plus              z.lua
gopls                      node@14                    zenith
gosec                      notmuch-mutt               zoxide
gost                       numcpp                     zsh-async
gostatic                   oakc                       zsh-you-should-use
gping                      ocaml-zarith
gradle-profiler            oci-cli
==&amp;gt; Updated Formulae
Updated 4852 formulae.
==&amp;gt; Renamed Formulae
elasticsearch@6.8 -&amp;gt; elasticsearch@6
gst-validate -&amp;gt; gst-devtools
gtk+4 -&amp;gt; gtk4
interactive-rebase-tool -&amp;gt; git-interactive-rebase-tool
jfrog-cli-go -&amp;gt; jfrog-cli
kibana@6.8 -&amp;gt; kibana@6
mkl-dnn -&amp;gt; onednn
now-cli -&amp;gt; vercel-cli
==&amp;gt; Deleted Formulae
baidupcs-go                gnome-builder              python
biogeme                    gobby                      residualvm
boost@1.55                 godep                      rmtrash
boost@1.59                 highlighting-kate          sflowtool
cargo-completion           i386-elf-grub              stlviewer
confluent-platform         kibana@5.6                 tomee-jax-rs
crc                        llvm@6                     unp64
cryptopp                   lumo                       unrar
curl-openssl               marathon-swift             unravel
deis                       meson-internal             urbit
deisctl                    mysql-connector-c++@1.1    woboq_codebrowser
dtrx                       open-cobol                 wpscan
elasticsearch@2.4          ori                        xspin
elasticsearch@5.6          pgplot                     xu4
fmsx                       pijul

==&amp;gt; Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 543736, done.
remote: Total 543736 (delta 0), reused 0 (delta 0), pack-reused 543736
Receiving objects: 100% (543736/543736), 239.19 MiB | 1.31 MiB/s, done.
Resolving deltas: 100% (383775/383775), done.
Tapped 3790 casks (3,911 files, 256.7MB).
==&amp;gt; Downloading https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020
==&amp;gt; Downloading from https://armkeil.blob.core.windows.net/developer/Files/downl
######################################################################## 100.0%
==&amp;gt; Installing Cask gcc-arm-embedded
==&amp;gt; Linking Binary 'arm-none-eabi-strip' to '/usr/local/bin/arm-none-eabi-strip'
==&amp;gt; Linking Binary 'arm-none-eabi-ar' to '/usr/local/bin/arm-none-eabi-ar'.
==&amp;gt; Linking Binary 'arm-none-eabi-as' to '/usr/local/bin/arm-none-eabi-as'.
==&amp;gt; Linking Binary 'arm-none-eabi-c++' to '/usr/local/bin/arm-none-eabi-c++'.
==&amp;gt; Linking Binary 'arm-none-eabi-c++filt' to '/usr/local/bin/arm-none-eabi-c++f
==&amp;gt; Linking Binary 'arm-none-eabi-cpp' to '/usr/local/bin/arm-none-eabi-cpp'.
==&amp;gt; Linking Binary 'arm-none-eabi-elfedit' to '/usr/local/bin/arm-none-eabi-elfe
==&amp;gt; Linking Binary 'arm-none-eabi-g++' to '/usr/local/bin/arm-none-eabi-g++'.
==&amp;gt; Linking Binary 'arm-none-eabi-gcc' to '/usr/local/bin/arm-none-eabi-gcc'.
==&amp;gt; Linking Binary 'arm-none-eabi-gcc-ar' to '/usr/local/bin/arm-none-eabi-gcc-a
==&amp;gt; Linking Binary 'arm-none-eabi-gcc-nm' to '/usr/local/bin/arm-none-eabi-gcc-n
==&amp;gt; Linking Binary 'arm-none-eabi-gcc-ranlib' to '/usr/local/bin/arm-none-eabi-g
==&amp;gt; Linking Binary 'arm-none-eabi-gcov' to '/usr/local/bin/arm-none-eabi-gcov'.
==&amp;gt; Linking Binary 'arm-none-eabi-gcov-tool' to '/usr/local/bin/arm-none-eabi-gc
==&amp;gt; Linking Binary 'arm-none-eabi-gdb' to '/usr/local/bin/arm-none-eabi-gdb'.
==&amp;gt; Linking Binary 'arm-none-eabi-gdb-py' to '/usr/local/bin/arm-none-eabi-gdb-p
==&amp;gt; Linking Binary 'arm-none-eabi-gprof' to '/usr/local/bin/arm-none-eabi-gprof'
==&amp;gt; Linking Binary 'arm-none-eabi-ld' to '/usr/local/bin/arm-none-eabi-ld'.
==&amp;gt; Linking Binary 'arm-none-eabi-ld.bfd' to '/usr/local/bin/arm-none-eabi-ld.bf
==&amp;gt; Linking Binary 'arm-none-eabi-nm' to '/usr/local/bin/arm-none-eabi-nm'.
==&amp;gt; Linking Binary 'arm-none-eabi-objcopy' to '/usr/local/bin/arm-none-eabi-objc
==&amp;gt; Linking Binary 'arm-none-eabi-objdump' to '/usr/local/bin/arm-none-eabi-objd
==&amp;gt; Linking Binary 'arm-none-eabi-ranlib' to '/usr/local/bin/arm-none-eabi-ranli
==&amp;gt; Linking Binary 'arm-none-eabi-readelf' to '/usr/local/bin/arm-none-eabi-read
==&amp;gt; Linking Binary 'arm-none-eabi-size' to '/usr/local/bin/arm-none-eabi-size'.
==&amp;gt; Linking Binary 'arm-none-eabi-strings' to '/usr/local/bin/arm-none-eabi-stri
==&amp;gt; Linking Binary 'arm-none-eabi-addr2line' to '/usr/local/bin/arm-none-eabi-ad
   gcc-arm-embedded was successfully installed!
➜  ~ brew install wget
Updating Homebrew...
==&amp;gt; Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==&amp;gt; Updated Formulae
Updated 4 formulae.
==&amp;gt; Updated Casks
Updated 2 casks.

==&amp;gt; Downloading https://homebrew.bintray.com/bottles/gettext-0.21.big_sur.bottle
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/a025e143fe3f5f7e24a93
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libunistring-0.9.10.big_sur
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/5d336bd939f678b48dc1c
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libidn2-2.3.0.big_sur.bottl
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/65523d89d65893a402f9f
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/openssl%401.1-1.1.1i.big_su
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/8008537d37a7f09eedbcd
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/wget-1.21.big_sur.bottle.ta
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/eb830909eed1e6d861968
######################################################################## 100.0%
==&amp;gt; Installing dependencies for wget: gettext, libunistring, libidn2 and openssl@1.1
==&amp;gt; Installing wget dependency: gettext
==&amp;gt; Pouring gettext-0.21.big_sur.bottle.tar.gz
   /usr/local/Cellar/gettext/0.21: 1,953 files, 19.8MB
==&amp;gt; Installing wget dependency: libunistring
==&amp;gt; Pouring libunistring-0.9.10.big_sur.bottle.tar.gz
   /usr/local/Cellar/libunistring/0.9.10: 55 files, 4.5MB
==&amp;gt; Installing wget dependency: libidn2
==&amp;gt; Pouring libidn2-2.3.0.big_sur.bottle.tar.gz
   /usr/local/Cellar/libidn2/2.3.0: 72 files, 808.2KB
==&amp;gt; Installing wget dependency: openssl@1.1
==&amp;gt; Pouring openssl@1.1-1.1.1i.big_sur.bottle.tar.gz
==&amp;gt; Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.

If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/openssl@1.1/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/openssl@1.1/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/openssl@1.1/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/openssl@1.1/1.1.1i: 8,067 files, 18.5MB
==&amp;gt; Installing wget
==&amp;gt; Pouring wget-1.21.big_sur.bottle.tar.gz
   /usr/local/Cellar/wget/1.21: 88 files, 4.1MB
==&amp;gt; Caveats
==&amp;gt; openssl@1.1
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.

If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/openssl@1.1/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/openssl@1.1/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/openssl@1.1/include&quot;

➜  ~ brew install qemu
Updating Homebrew...
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libffi-3.3_2.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/pcre-8.44.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/a67dd6141e117f849bbb7d3bde92ffb6485921939c1d64e39a3f7fd0dac3f523?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/gdbm-1.18.1_1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/36b492f1b0910367dd394cbdcffe1606f64ab41ec6701210becfb591a8557dee?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/readline-8.1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/2cc3a9582e3c7e21eb3c2c8964abd33e9720fb4a9588c626d8424ff8cc9b1aed?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/sqlite-3.34.0.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/cdf256befc0752680a6742469b217e0dae42c691cb3565923d4bf2c5a0583152?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/tcl-tk-8.6.11.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/f7c4fb93ca32dca70f3ead938b44bce22c7a99f060242ce802ca8955d274f361?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/xz-5.2.5.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/4fbd4a9e3eb49c27e83bd125b0e76d386c0e12ae1139d4dc9e31841fb8880a35?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/python%403.9-3.9.1_6.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/48d123683fa125de9f02f7777683edda40e998f0e2dca492024c00bbd3f05ea2?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/glib-2.66.4_1.big_sur.bottle.1.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/f8851f19a2ce75914f0b38a3a0ad4d357f16824bfa10344a0cdf5d3e2d794ef5?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/gmp-6.2.1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/6a44705536f25c4b9f8547d44d129ae3b3657755039966ad2b86b821e187c32c?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/bdw-gc-8.0.4_1.big_sur.bottle.1.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/bb94ab58bc20b01662c432d21920c9a2e644aad92208b640658d3fd9fb530636?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libtool-2.4.6_2.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/b5dba5a59ae66f42b012998e08edbeaed9e2456c0d1670307b8f46be5ef3b9fa?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/pkg-config-0.29.2_3.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/0040b6ebe07f60549800b211343fd5fb3cf83c866d9f62e40f5fb2f38b71e161?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/guile-3.0.5.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/ce8a02da2f7a50ee2df21ace1dac3b8335855907ec31224cea3ea5f89d82c463?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libtasn1-4.16.0.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/nettle-3.7.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/e02e4ae1f73b54c0976a2e7afdbe2f461a202362c51c68e341f289477a9dfb6b?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/p11-kit-0.23.22.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/9474fe6483bbc394d9069f79528ecfe9ba1af00db4aca23c26857b6b66736d73?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libevent-2.1.12.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/45758b448d82b82b6bea52bc9a72593ef22f04ebdaa4b4230cadf12768252e22?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/c-ares-1.17.1.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/jemalloc-5.2.1_1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/7797788be2da677a8343ac6199e2f180c2e6b627c0b9abc9da133fbc34e86678?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libev-4.33.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/nghttp2-1.42.0_1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/3d0437a63bcc51ec17d456847bcc0a624be2e00755ecc96b8445bc15020ff413?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/unbound-1.13.0.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/cef5d9843ecaabaa0a4cb9b89e04bc3d370ce143e4ff2e0f6711aa6572b1ad3a?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/gnutls-3.6.15.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/6f523e8ce74c567d17a4a5b69794e897074a016b895a5d8ef7122ac006b770fc?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/jpeg-9d.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/c565929a4901365a3408b57275802f943625c1e29e1b48a186edd2e97d8c0bdb?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libpng-1.6.37.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/a8f1c35f9f004c4f7878c30027e35a9fb9551782df963f88deebd3dc29d94d51?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libssh-0.9.5_1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/ba9752b774a055a0df12b12cb76c8faed66b13de0f8ebbb8d415dae9f21a899d?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/libusb-1.0.24.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/lzo-2.10.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/ncurses-6.2.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/b34b4aa433f23405c6104bf810836eed2686f11c660b8668a7af86f99be2329f?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/pixman-0.40.0.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/0114710dd922d5e4839c9dea3b72cd5fbe6f00157dd63457c99ca15554cf8d7f?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/snappy-1.1.8.big_sur.bottle.tar.gz
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/vde-2.3.2_1.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/f634d3558c44876138a229f06554ab603b31e412a03c049d96f6c3616e579729?response-content-disp
######################################################################## 100.0%
==&amp;gt; Downloading https://homebrew.bintray.com/bottles/qemu-5.1.0.big_sur.bottle.tar.gz
==&amp;gt; Downloading from https://d29vzk4ow07wi7.cloudfront.net/6d66e4689bda9dc9c43bd3924e49e4722586bb611073ced182c79c6d7f995cb0?response-content-disp
######################################################################## 100.0%
==&amp;gt; Installing dependencies for qemu: libffi, pcre, gdbm, readline, sqlite, tcl-tk, xz, python@3.9, glib, gmp, bdw-gc, libtool, pkg-config, guile, libtasn1, nettle, p11-kit, libevent, c-ares, jemalloc, libev, nghttp2, unbound, gnutls, jpeg, libpng, libssh, libusb, lzo, ncurses, pixman, snappy and vde
==&amp;gt; Installing qemu dependency: libffi
==&amp;gt; Pouring libffi-3.3_2.big_sur.bottle.tar.gz
==&amp;gt; Caveats
libffi is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

For compilers to find libffi you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/libffi/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/libffi/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/libffi/3.3_2: 17 files, 540.5KB
==&amp;gt; Installing qemu dependency: pcre
==&amp;gt; Pouring pcre-8.44.big_sur.bottle.tar.gz
   /usr/local/Cellar/pcre/8.44: 204 files, 5.8MB
==&amp;gt; Installing qemu dependency: gdbm
==&amp;gt; Pouring gdbm-1.18.1_1.big_sur.bottle.tar.gz
   /usr/local/Cellar/gdbm/1.18.1_1: 25 files, 787.2KB
==&amp;gt; Installing qemu dependency: readline
==&amp;gt; Pouring readline-8.1.big_sur.bottle.tar.gz
==&amp;gt; Caveats
readline is keg-only, which means it was not symlinked into /usr/local,
because macOS provides BSD libedit.

For compilers to find readline you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/readline/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/readline/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/readline/8.1: 48 files, 1.6MB
==&amp;gt; Installing qemu dependency: sqlite
==&amp;gt; Pouring sqlite-3.34.0.big_sur.bottle.tar.gz
==&amp;gt; Caveats
sqlite is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have sqlite first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/sqlite/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find sqlite you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/sqlite/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/sqlite/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/sqlite/3.34.0: 11 files, 4.1MB
==&amp;gt; Installing qemu dependency: tcl-tk
==&amp;gt; Pouring tcl-tk-8.6.11.big_sur.bottle.tar.gz
==&amp;gt; Caveats
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have tcl-tk first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/tcl-tk/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find tcl-tk you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/tcl-tk/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/tcl-tk/include&quot;

==&amp;gt; Summary
   /usr/local/Cellar/tcl-tk/8.6.11: 3,041 files, 51.6MB
==&amp;gt; Installing qemu dependency: xz
==&amp;gt; Pouring xz-5.2.5.big_sur.bottle.tar.gz
   /usr/local/Cellar/xz/5.2.5: 95 files, 1.4MB
==&amp;gt; Installing qemu dependency: python@3.9
==&amp;gt; Pouring python@3.9-3.9.1_6.big_sur.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/2to3
Target /usr/local/bin/2to3
already exists. You may want to remove it:
  rm '/usr/local/bin/2to3'

To force the link and overwrite all conflicting files:
  brew link --overwrite python@3.9

To list all files that would be deleted:
  brew link --overwrite --dry-run python@3.9

Possible conflicting files are:
/usr/local/bin/2to3 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/2to3
/usr/local/bin/2to3-3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/2to3-3.9
/usr/local/bin/easy_install-3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/easy_install-3.9
/usr/local/bin/idle3 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/idle3
/usr/local/bin/idle3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/idle3.9
/usr/local/bin/pip3 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3
/usr/local/bin/pip3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3.9
/usr/local/bin/pydoc3 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/pydoc3
/usr/local/bin/pydoc3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/pydoc3.9
/usr/local/bin/python3 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3
/usr/local/bin/python3-config -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3-config
/usr/local/bin/python3.9 -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
/usr/local/bin/python3.9-config -&amp;gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9-config
==&amp;gt; /usr/local/Cellar/python@3.9/3.9.1_6/bin/python3 -m ensurepip
==&amp;gt; /usr/local/Cellar/python@3.9/3.9.1_6/bin/pip3 install -v --global-option=--no-user-cfg --install-option=--force --install-option=--single-ver
==&amp;gt; /usr/local/Cellar/python@3.9/3.9.1_6/bin/pip3 wheel --wheel-dir=/usr/local/Cellar/python@3.9/3.9.1_6/Frameworks/Python.framework/Versions/3.9
==&amp;gt; Caveats
Python has been installed as
  /usr/local/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/opt/python@3.9/libexec/bin

You can install Python packages with
  pip3 install &amp;lt;package&amp;gt;
They will install into the site-package directory
  /usr/local/lib/python3.9/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
==&amp;gt; Summary
   /usr/local/Cellar/python@3.9/3.9.1_6: 3,932 files, 65.4MB
==&amp;gt; Installing qemu dependency: glib
==&amp;gt; Pouring glib-2.66.4_1.big_sur.bottle.1.tar.gz
   /usr/local/Cellar/glib/2.66.4_1: 441 files, 20.8MB
==&amp;gt; Installing qemu dependency: gmp
==&amp;gt; Pouring gmp-6.2.1.big_sur.bottle.tar.gz
   /usr/local/Cellar/gmp/6.2.1: 21 files, 3.3MB
==&amp;gt; Installing qemu dependency: bdw-gc
==&amp;gt; Pouring bdw-gc-8.0.4_1.big_sur.bottle.1.tar.gz
   /usr/local/Cellar/bdw-gc/8.0.4_1: 69 files, 1.6MB
==&amp;gt; Installing qemu dependency: libtool
==&amp;gt; Pouring libtool-2.4.6_2.big_sur.bottle.tar.gz
==&amp;gt; Caveats
In order to prevent conflicts with Apple's own libtool we have prepended a &quot;g&quot;
so, you have instead: glibtool and glibtoolize.
==&amp;gt; Summary
   /usr/local/Cellar/libtool/2.4.6_2: 71 files, 3.7MB
==&amp;gt; Installing qemu dependency: pkg-config
==&amp;gt; Pouring pkg-config-0.29.2_3.big_sur.bottle.tar.gz
   /usr/local/Cellar/pkg-config/0.29.2_3: 11 files, 656.6KB
==&amp;gt; Installing qemu dependency: guile
==&amp;gt; Pouring guile-3.0.5.big_sur.bottle.tar.gz
==&amp;gt; Caveats
Guile libraries can now be installed here:
    Source files: /usr/local/share/guile/site/3.0
  Compiled files: /usr/local/lib/guile/3.0/site-ccache
      Extensions: /usr/local/lib/guile/3.0/extensions

Add the following to your .bashrc or equivalent:
  export GUILE_LOAD_PATH=&quot;/usr/local/share/guile/site/3.0&quot;
  export GUILE_LOAD_COMPILED_PATH=&quot;/usr/local/lib/guile/3.0/site-ccache&quot;
  export GUILE_SYSTEM_EXTENSIONS_PATH=&quot;/usr/local/lib/guile/3.0/extensions&quot;
==&amp;gt; Summary
   /usr/local/Cellar/guile/3.0.5: 834 files, 56.8MB
==&amp;gt; Installing qemu dependency: libtasn1
==&amp;gt; Pouring libtasn1-4.16.0.big_sur.bottle.tar.gz
   /usr/local/Cellar/libtasn1/4.16.0: 60 files, 535.7KB
==&amp;gt; Installing qemu dependency: nettle
==&amp;gt; Pouring nettle-3.7.big_sur.bottle.tar.gz
   /usr/local/Cellar/nettle/3.7: 89 files, 2.7MB
==&amp;gt; Installing qemu dependency: p11-kit
==&amp;gt; Pouring p11-kit-0.23.22.big_sur.bottle.tar.gz
   /usr/local/Cellar/p11-kit/0.23.22: 63 files, 3MB
==&amp;gt; Installing qemu dependency: libevent
==&amp;gt; Pouring libevent-2.1.12.big_sur.bottle.tar.gz
   /usr/local/Cellar/libevent/2.1.12: 57 files, 2MB
==&amp;gt; Installing qemu dependency: c-ares
==&amp;gt; Pouring c-ares-1.17.1.big_sur.bottle.tar.gz
   /usr/local/Cellar/c-ares/1.17.1: 85 files, 672.3KB
==&amp;gt; Installing qemu dependency: jemalloc
==&amp;gt; Pouring jemalloc-5.2.1_1.big_sur.bottle.tar.gz
   /usr/local/Cellar/jemalloc/5.2.1_1: 16 files, 2MB
==&amp;gt; Installing qemu dependency: libev
==&amp;gt; Pouring libev-4.33.big_sur.bottle.tar.gz
   /usr/local/Cellar/libev/4.33: 12 files, 483.8KB
==&amp;gt; Installing qemu dependency: nghttp2
==&amp;gt; Pouring nghttp2-1.42.0_1.big_sur.bottle.tar.gz
   /usr/local/Cellar/nghttp2/1.42.0_1: 24 files, 2.8MB
==&amp;gt; Installing qemu dependency: unbound
==&amp;gt; Pouring unbound-1.13.0.big_sur.bottle.tar.gz
==&amp;gt; Caveats
To have launchd start unbound now and restart at startup:
  sudo brew services start unbound
==&amp;gt; Summary
   /usr/local/Cellar/unbound/1.13.0: 57 files, 5.5MB
==&amp;gt; Installing qemu dependency: gnutls
==&amp;gt; Pouring gnutls-3.6.15.big_sur.bottle.tar.gz
==&amp;gt; Caveats
If you are going to use the Guile bindings you will need to add the following
to your .bashrc or equivalent in order for Guile to find the TLS certificates
database:
  export GUILE_TLS_CERTIFICATE_DIRECTORY=/usr/local/etc/gnutls/
==&amp;gt; Summary
   /usr/local/Cellar/gnutls/3.6.15: 1,250 files, 11MB
==&amp;gt; Installing qemu dependency: jpeg
==&amp;gt; Pouring jpeg-9d.big_sur.bottle.tar.gz
   /usr/local/Cellar/jpeg/9d: 21 files, 953.8KB
==&amp;gt; Installing qemu dependency: libpng
==&amp;gt; Pouring libpng-1.6.37.big_sur.bottle.tar.gz
   /usr/local/Cellar/libpng/1.6.37: 27 files, 1.3MB
==&amp;gt; Installing qemu dependency: libssh
==&amp;gt; Pouring libssh-0.9.5_1.big_sur.bottle.tar.gz
   /usr/local/Cellar/libssh/0.9.5_1: 23 files, 1.2MB
==&amp;gt; Installing qemu dependency: libusb
==&amp;gt; Pouring libusb-1.0.24.big_sur.bottle.tar.gz
   /usr/local/Cellar/libusb/1.0.24: 22 files, 516.4KB
==&amp;gt; Installing qemu dependency: lzo
==&amp;gt; Pouring lzo-2.10.big_sur.bottle.tar.gz
   /usr/local/Cellar/lzo/2.10: 31 files, 570.7KB
==&amp;gt; Installing qemu dependency: ncurses
==&amp;gt; Pouring ncurses-6.2.big_sur.bottle.tar.gz
==&amp;gt; Caveats
ncurses is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have ncurses first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/ncurses/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find ncurses you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/ncurses/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/ncurses/include&quot;

For pkg-config to find ncurses you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/ncurses/lib/pkgconfig&quot;

==&amp;gt; Summary
   /usr/local/Cellar/ncurses/6.2: 3,913 files, 8.9MB
==&amp;gt; Installing qemu dependency: pixman
==&amp;gt; Pouring pixman-0.40.0.big_sur.bottle.tar.gz
   /usr/local/Cellar/pixman/0.40.0: 14 files, 1.3MB
==&amp;gt; Installing qemu dependency: snappy
==&amp;gt; Pouring snappy-1.1.8.big_sur.bottle.tar.gz
   /usr/local/Cellar/snappy/1.1.8: 18 files, 158KB
==&amp;gt; Installing qemu dependency: vde
==&amp;gt; Pouring vde-2.3.2_1.big_sur.bottle.tar.gz
   /usr/local/Cellar/vde/2.3.2_1: 73 files, 1.4MB
==&amp;gt; Installing qemu
==&amp;gt; Pouring qemu-5.1.0.big_sur.bottle.tar.gz
   /usr/local/Cellar/qemu/5.1.0: 162 files, 490.5MB
==&amp;gt; Caveats
==&amp;gt; libffi
libffi is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

For compilers to find libffi you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/libffi/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/libffi/include&quot;

For pkg-config to find libffi you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/libffi/lib/pkgconfig&quot;

==&amp;gt; readline
readline is keg-only, which means it was not symlinked into /usr/local,
because macOS provides BSD libedit.

For compilers to find readline you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/readline/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/readline/include&quot;

For pkg-config to find readline you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/readline/lib/pkgconfig&quot;

==&amp;gt; sqlite
sqlite is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have sqlite first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/sqlite/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find sqlite you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/sqlite/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/sqlite/include&quot;

For pkg-config to find sqlite you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/sqlite/lib/pkgconfig&quot;

==&amp;gt; tcl-tk
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have tcl-tk first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/tcl-tk/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find tcl-tk you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/tcl-tk/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/tcl-tk/include&quot;

For pkg-config to find tcl-tk you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/tcl-tk/lib/pkgconfig&quot;

==&amp;gt; python@3.9
Python has been installed as
  /usr/local/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/opt/python@3.9/libexec/bin

You can install Python packages with
  pip3 install &amp;lt;package&amp;gt;
They will install into the site-package directory
  /usr/local/lib/python3.9/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
==&amp;gt; libtool
In order to prevent conflicts with Apple's own libtool we have prepended a &quot;g&quot;
so, you have instead: glibtool and glibtoolize.
==&amp;gt; guile
Guile libraries can now be installed here:
    Source files: /usr/local/share/guile/site/3.0
  Compiled files: /usr/local/lib/guile/3.0/site-ccache
      Extensions: /usr/local/lib/guile/3.0/extensions

Add the following to your .bashrc or equivalent:
  export GUILE_LOAD_PATH=&quot;/usr/local/share/guile/site/3.0&quot;
  export GUILE_LOAD_COMPILED_PATH=&quot;/usr/local/lib/guile/3.0/site-ccache&quot;
  export GUILE_SYSTEM_EXTENSIONS_PATH=&quot;/usr/local/lib/guile/3.0/extensions&quot;
==&amp;gt; unbound
To have launchd start unbound now and restart at startup:
  sudo brew services start unbound
==&amp;gt; gnutls
If you are going to use the Guile bindings you will need to add the following
to your .bashrc or equivalent in order for Guile to find the TLS certificates
database:
  export GUILE_TLS_CERTIFICATE_DIRECTORY=/usr/local/etc/gnutls/
==&amp;gt; ncurses
ncurses is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have ncurses first in your PATH run:
  echo 'export PATH=&quot;/usr/local/opt/ncurses/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc

For compilers to find ncurses you may need to set:
  export LDFLAGS=&quot;-L/usr/local/opt/ncurses/lib&quot;
  export CPPFLAGS=&quot;-I/usr/local/opt/ncurses/include&quot;

For pkg-config to find ncurses you may need to set:
  export PKG_CONFIG_PATH=&quot;/usr/local/opt/ncurses/lib/pkgconfig&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;blockquote style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot; data-ke-style=&quot;style2&quot;&gt;[1] 임베디드 OS 개발 프로젝트, 이만우, 인사이트&lt;br /&gt;[2] https://github.com/Homebrew/homebrew-cask/blob/master/Casks/gcc-arm-embedded.rb&lt;br /&gt;[3] 나빌로스 Github project URL: https://github.com/navilera/Navilos&lt;/blockquote&gt;</description>
      <category>Embedded Lab. @ Modu inst./2021 Session 03 (2021.01.13~)</category>
      <category>Arm</category>
      <category>Embedded System</category>
      <category>firmware</category>
      <category>GCC</category>
      <category>MAC OS</category>
      <category>qemu</category>
      <category>RTOS</category>
      <category>개발</category>
      <category>임베디드 RTOS</category>
      <category>임베디드용 os</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/31</guid>
      <comments>https://engineering-agit.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 18 Jan 2021 17:07:15 +0900</pubDate>
    </item>
    <item>
      <title>[ROS Study 01] - Introduction</title>
      <link>https://engineering-agit.tistory.com/30</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◈ 여는 글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 카테고리는 ROS 공부를 다룬다. 직접 로봇을 구축하지는 않고 ROS라는 툴을 C++로 개발하는 과정을 공부해볼 예정이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. ROS&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. ROS란?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1ycG/btqPDH5eVMk/IomMlDx9mzL1kduZMgeliK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1ycG/btqPDH5eVMk/IomMlDx9mzL1kduZMgeliK/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1&amp;amp;amp;gt; Ubuntu 20.04를 위한 13번째 버전 ROS&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1ycG/btqPDH5eVMk/IomMlDx9mzL1kduZMgeliK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1ycG%2FbtqPDH5eVMk%2FIomMlDx9mzL1kduZMgeliK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1&amp;gt; Ubuntu 20.04를 위한 13번째 버전 ROS&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ROS는 'Robotic Operating System'의 약자이다. 기본적인 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;로봇을 프로그래밍하기 위한 software framework.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Stanford AI research에서 시작되었고, 'Willow Garage'사에서 2007년부터 본격적으로 개발되기 시작했음.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;현재는 'Open Source Robotic Foundation'에서 관리.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Infrastrucure(Multi-processing, networking등을 하는 것이 이미 library로 제공되므로 직접 개발할 필요가 없음), Tools(개발하는 데에 필요한 툴등을 제공; eg) Visualizing tool), Capabilities(robotic system에 필요한 기본적인 것들이 제공되므로 이를 개발자는 이용만 하면 됨), 그리고 Ecosystem(Open source이므로 정보교류를 위한 community들이 있으며 이 곳에서 쉽게 교류할 수 있음)으로 구성됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ROS는 현재 우리가 익히 알고 있는 IOS, 안드로이드 OS를 통해 그 필요성을 보다 쉽게 이해할 수 있다. 스마트 폰의 경우에 기본적으로 목적성을 지니는 임베디드 시스템이므로 이에 사용되는 프로그램을 직접 low-level에서 개발하기란 매우 어렵고 공부해야할 분량이 많다. End user가 사용하기 위한 application을 개발이 OS 없이 이루어진다면 현재와 같이 스마트 폰의 기능을 십분 활용하는 앱을 만나기 힘들었을 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ROS의 취지도 비슷하다. 우리의 생활에 스며들기 시작한 다양한 종류의 로봇에 적용되는 다양한 분야의 어플리케이션을 개발하고 적용하기 위해서는 로봇 또한 로봇을 위한 OS가 필요하다. 이 OS는 로봇을 위한 application을 개발할 때 필요한 hardware abstraction, low-level device contol, sensing, recognition, SLAM, nevigation 등의 기능 구현 및 message transmitting, package management, 개발환경에 필요한 library와 다양한 개발 및 debugging tool을 제공한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&quot;&gt;ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607496327573&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;하드웨어 추상화 - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4_%EC%B6%94%EC%83%81%ED%99%94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;하드웨어 추상화 - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ROS는 특히 meta OS라고 불리는데 이는 일반적인 OS인 Window, Linux, Mac OS등의 위에서 동작하는 framework이기 때문이다.&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;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;1-2. Pros &amp;amp; Cons&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 112px;&quot; border=&quot;1&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;수많은 infrastructure, tool 그리고 capability들을 제공한다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;각각의 버전마다 차이가 많이 나는 것은 아니지만, 변화하고 있다는 것이 단점이 될 수 있다(호환이 안될 수도 있음).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;다른 사람들의 작업을 쉽게 시도해볼 수 있고, 개인적인 작업물을 쉽게 공유할 수 있다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;Security나 scalability가 최우선이 되지 않는다.&lt;br /&gt;-&amp;gt; 미리 만들어진 것을 이용하므로 만약에 이것들을 최우선시하는 system의 경우에는 ROS를 적용하는 것이 회의적일 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;Community가 매우 크게 형성되어 있다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;Linux Ubuntu 이외에는 설치하는 방법 조차 찾기 어려운 경우가 많고 지원이 잘 이루어지지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;Free, opensource, BSD(Berkeley Software Distribution) license&lt;br /&gt;-&amp;gt; 해당 저작권자의 이름을 같이 배포하면, 수정 및 배포에 제약을 받지 않는다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;따라서 Open-source 그리고 researcher들에게는 매우 좋지만, 'mission critical task'들을 처리하는 상황에서는 좋지 않다는 것을 생각할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;2. References&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ROS Wiki&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.ros.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wiki.ros.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607496906025&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Documentation - ROS Wiki&quot; data-og-description=&quot;ROS (Robot Operating System) provides libraries and tools to help software developers create robot applications. It provides hardware abstraction, device drivers, libraries, visualizers, message-passing, package management, and more. ROS is licensed under &quot; data-og-host=&quot;wiki.ros.org&quot; data-og-source-url=&quot;https://wiki.ros.org/&quot; data-og-url=&quot;https://wiki.ros.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://wiki.ros.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wiki.ros.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Documentation - ROS Wiki&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;ROS (Robot Operating System) provides libraries and tools to help software developers create robot applications. It provides hardware abstraction, device drivers, libraries, visualizers, message-passing, package management, and more. ROS is licensed under&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;wiki.ros.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Videos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/c/JustinHuang101/featured&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.youtube.com/c/JustinHuang101/featured&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607496963321&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;Justin Huang&quot; data-og-description=&quot;PhD student in robotics at the University of Washington in Seattle, Washington. I hope to show cool projects I've been working on and help other people learn...&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/c/JustinHuang101/featured&quot; data-og-url=&quot;https://www.youtube.com/channel/UC1NUHtM57Ge5qai4s0AaBEg&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zkt5P/hyIvd3GVWX/NUocslk6qjr9cm1xPqstN1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=558_98_694_245,https://scrap.kakaocdn.net/dn/vkZiL/hyIvjixbaF/BXPKquM9p4kCaJqNl4cKU0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=558_98_694_245&quot;&gt;&lt;a href=&quot;https://www.youtube.com/c/JustinHuang101/featured&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/c/JustinHuang101/featured&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zkt5P/hyIvd3GVWX/NUocslk6qjr9cm1xPqstN1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=558_98_694_245,https://scrap.kakaocdn.net/dn/vkZiL/hyIvjixbaF/BXPKquM9p4kCaJqNl4cKU0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=558_98_694_245');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Justin Huang&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;PhD student in robotics at the University of Washington in Seattle, Washington. I hope to show cool projects I've been working on and help other people learn...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Books&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=12443870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;book.naver.com/bookdb/book_detail.nhn?bid=12443870&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607497135661&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;ROS 로봇 프로그래밍&quot; data-og-description=&quot;기초 개념부터 프로그래밍 학습, 실제 로봇에 적용까지!이 책은 로봇 프로그래밍에 입문하는 사람을 위해 로봇 운영체제의 핵심과 ROS에서 반드시 알아야 할 주요 개념부터 시작합니다. 초보자&quot; data-og-host=&quot;book.naver.com&quot; data-og-source-url=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=12443870&quot; data-og-url=&quot;http://book.naver.com/bookdb/book_detail.nhn?bid=12443870&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2g4vz/hyIvcRgOkL/MMT2MlYVDYXdWQaz6WkCzK/img.jpg?width=140&amp;amp;height=179&amp;amp;face=0_0_140_179&quot;&gt;&lt;a href=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=12443870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://book.naver.com/bookdb/book_detail.nhn?bid=12443870&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2g4vz/hyIvcRgOkL/MMT2MlYVDYXdWQaz6WkCzK/img.jpg?width=140&amp;amp;height=179&amp;amp;face=0_0_140_179');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;ROS 로봇 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;기초 개념부터 프로그래밍 학습, 실제 로봇에 적용까지!이 책은 로봇 프로그래밍에 입문하는 사람을 위해 로봇 운영체제의 핵심과 ROS에서 반드시 알아야 할 주요 개념부터 시작합니다. 초보자&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;book.naver.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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;※ 추가되는 자료들은 각각의 게시물의 ref로 기재될 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;▣ 추후예정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- Macbook에서 가상머신 설치 이후에 환경설정&lt;/p&gt;</description>
      <category>Personal Study/ROS</category>
      <category>robot</category>
      <category>Ros</category>
      <category>로봇 개발</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/30</guid>
      <comments>https://engineering-agit.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 9 Dec 2020 16:19:21 +0900</pubDate>
    </item>
    <item>
      <title>[PCB Fabrication 02] - 4_Digit 7_Segments with SN7447AN Rev.1.1</title>
      <link>https://engineering-agit.tistory.com/20</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◈ 들어가기 앞서&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;지난 번 제작한 디스플레이 PCB가 작동하지 않아 내부의 몇가지 부품을 수정하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://engineering-agit.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/08/28 - [Personal Projects/PCB Fabrication] - [PCB Fabrication 01] - 4_Digit 7_Segments with SN7447AN&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607411983550&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[PCB Fabrication 01] - 4_Digit 7_Segments with SN7447AN&quot; data-og-description=&quot;◈ Introduction &amp;nbsp;이 PCB 제작은 8051 project에 사용되는 display를 위하여 진행되었다. ※ 부품 선정 오류(LED 4-digit 7-segments를 Common Anode가 아닌 Common Cathode로 선정; SN7447AN은 CA용)로 부품 목..&quot; data-og-host=&quot;engineering-agit.tistory.com&quot; data-og-source-url=&quot;https://engineering-agit.tistory.com/15&quot; data-og-url=&quot;https://engineering-agit.tistory.com/15&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cOal7i/hyIvkt74GJ/x0XJDAViIDXKf0OO17AWrK/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/b5j4Z8/hyIva57YNE/JoGupHriNMg5CxcerSUy9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bASRnB/hyIu6bzrvX/d5n7Tu0DGoXFS86CGnwM60/img.png?width=1930&amp;amp;height=1160&amp;amp;face=0_0_1930_1160&quot;&gt;&lt;a href=&quot;https://engineering-agit.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://engineering-agit.tistory.com/15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cOal7i/hyIvkt74GJ/x0XJDAViIDXKf0OO17AWrK/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/b5j4Z8/hyIva57YNE/JoGupHriNMg5CxcerSUy9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/bASRnB/hyIu6bzrvX/d5n7Tu0DGoXFS86CGnwM60/img.png?width=1930&amp;amp;height=1160&amp;amp;face=0_0_1930_1160');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[PCB Fabrication 01] - 4_Digit 7_Segments with SN7447AN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;◈ Introduction &amp;nbsp;이 PCB 제작은 8051 project에 사용되는 display를 위하여 진행되었다. ※ 부품 선정 오류(LED 4-digit 7-segments를 Common Anode가 아닌 Common Cathode로 선정; SN7447AN은 CA용)로 부품 목..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;engineering-agit.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;1. 수정 사항&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;회로 설계 시에 고려하지 못한 사항이 있는데 이는 SN7447AN이 Common Anode 용인데 사용한 7 segment와 이를 스위칭할 TR들이 Common cathode로 선정을 하였다. 통상적으로 common anode를 많이 사용하므로 control IC를 변경하지 않고 SN7447AN으로 유지하되 다른 부품들을 다시 선정하기로 결정했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Parts list&lt;/b&gt; &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;No.&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;&lt;b&gt;Part name&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;b&gt;Price&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;&lt;b&gt;EA&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%; text-align: center;&quot;&gt;&lt;b&gt;Datasheet&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[SUNLIGHT] SLR0404DWA2BD&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;US$ 1.3&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/Led-Segment-Display_SUNLIGHT-SLR0404DWA2BD_C225916.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/Led-Segment-Display_SUNLIGHT-SLR0404DWA2BD_C225916.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[TI] SN7447AN&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;2,970원&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://www.digikey.kr/product-detail/ko/texas-instruments/SN7447AN/296-33612-5-ND/1575197&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.digikey.kr/product-detail/ko/texas-instruments/SN7447AN/296-33612-5-ND/1575197&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[Guangdong Hottech] 2SA1015&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt; 0.007&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/Transistors-NPN-PNP_Guangdong-Hottech-2SA1015_C181170.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/Transistors-NPN-PNP_Guangdong-Hottech-2SA1015_C181170.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[UNI-ROYAL] 0805W8F4701T5E&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt;&amp;nbsp;0.002&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0805W8F4701T5E_C17673.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/Chip-Resistor-Surface-Mount_UNI-ROYAL-Uniroyal-Elec-0805W8F4701T5E_C17673.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[FH] RS-05K102JT&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt;&amp;nbsp;0.002&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_FH-Guangdong-Fenghua-Advanced-Tech-RS-05K102JT_C115302.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/Chip-Resistor-Surface-Mount_FH-Guangdong-Fenghua-Advanced-Tech-RS-05K102JT_C115302.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[KOA speed elec.] RK73B1JTTD101J&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt;&amp;nbsp;0.003&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_100R-101-5_C159890.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/Chip-Resistor-Surface-Mount_100R-101-5_C159890.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[XFCN] PZ254V-11-06P&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt;&amp;nbsp;0.029&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/New-Arrivals_XFCN-PZ254V-11-06P_C492405.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/New-Arrivals_XFCN-PZ254V-11-06P_C492405.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.39542%; text-align: center;&quot;&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; text-align: center;&quot;&gt;[XFCN] PZ254V-11-05P&lt;/td&gt;
&lt;td style=&quot;width: 11.279%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;US$&lt;/span&gt;&amp;nbsp;0.024&lt;/td&gt;
&lt;td style=&quot;width: 6.04656%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 54.5348%;&quot;&gt;&lt;a href=&quot;https://lcsc.com/product-detail/New-Arrivals_XFCN-PZ254V-11-05P_C492404.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lcsc.com/product-detail/New-Arrivals_XFCN-PZ254V-11-05P_C492404.html&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. CAD 작업&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. Schematic design&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9Wvwy/btqPDJub6MM/X812z5GRrAEzErTkXJntpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9Wvwy/btqPDJub6MM/X812z5GRrAEzErTkXJntpK/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 1&amp;amp;amp;gt; Schematic design&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9Wvwy/btqPDJub6MM/X812z5GRrAEzErTkXJntpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Wvwy%2FbtqPDJub6MM%2FX812z5GRrAEzErTkXJntpK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 1&amp;gt; Schematic design&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;h3 data-ke-size=&quot;size23&quot;&gt;2-2. PCB Artwork&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Top layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIntEX/btqPysfFiYv/0MldFwp9d2PoePGSkQAuQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIntEX/btqPysfFiYv/0MldFwp9d2PoePGSkQAuQ1/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 2&amp;amp;amp;gt; Top layer of PCB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIntEX/btqPysfFiYv/0MldFwp9d2PoePGSkQAuQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIntEX%2FbtqPysfFiYv%2F0MldFwp9d2PoePGSkQAuQ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 2&amp;gt; Top layer of PCB&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&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 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;Bottom layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPAE8R/btqPuSsIdo4/BUekdc3KgQtu0j2VxKL7jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPAE8R/btqPuSsIdo4/BUekdc3KgQtu0j2VxKL7jk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 3&amp;amp;amp;gt; Bottom layer of PCB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPAE8R/btqPuSsIdo4/BUekdc3KgQtu0j2VxKL7jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPAE8R%2FbtqPuSsIdo4%2FBUekdc3KgQtu0j2VxKL7jk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 3&amp;gt; Bottom layer of PCB&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;h3 data-ke-size=&quot;size23&quot;&gt;2-3. 3D Model&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbYeoq/btqPAtk9Flc/excmhJPVUffXW52KRVrjm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbYeoq/btqPAtk9Flc/excmhJPVUffXW52KRVrjm0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 4-1&amp;amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbYeoq/btqPAtk9Flc/excmhJPVUffXW52KRVrjm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbYeoq%2FbtqPAtk9Flc%2FexcmhJPVUffXW52KRVrjm0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 4-1&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJAWqb/btqPqkwxoi2/IyxcjteDfjdDYZkEd76wqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJAWqb/btqPqkwxoi2/IyxcjteDfjdDYZkEd76wqk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 4-2&amp;amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJAWqb/btqPqkwxoi2/IyxcjteDfjdDYZkEd76wqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJAWqb%2FbtqPqkwxoi2%2FIyxcjteDfjdDYZkEd76wqk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 4-2&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbtVbW/btqPuS7eKik/XyxQ5cx0rl2k7WXzUb9k7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbtVbW/btqPuS7eKik/XyxQ5cx0rl2k7WXzUb9k7k/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 4-3&amp;amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbtVbW/btqPuS7eKik/XyxQ5cx0rl2k7WXzUb9k7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbtVbW%2FbtqPuS7eKik%2FXyxQ5cx0rl2k7WXzUb9k7k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 4-3&amp;gt;&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;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;▣ 후속 작업&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-ke-size=&quot;size18&quot;&gt;PCB 제작 주문 (AT89S52 MC 제작 이후에 같이 주문)&lt;/li&gt;
&lt;li data-ke-size=&quot;size18&quot;&gt;테스트&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Projects/PCB Fabrication</category>
      <category>7 세그먼트</category>
      <category>easyeda</category>
      <category>JLCPCB</category>
      <category>PCB</category>
      <category>PCB 제작</category>
      <category>아트웍</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/20</guid>
      <comments>https://engineering-agit.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 8 Dec 2020 17:09:20 +0900</pubDate>
    </item>
    <item>
      <title>[TM4C123 Project #1] - 프로젝트 개요 및 SRS</title>
      <link>https://engineering-agit.tistory.com/27</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;◈ 여는 글&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 프로젝트는 '모두의 연구소 강남캠퍼스' 소속 '임베디드 랩'의 2020년 두 번째 session을 마무리하는 프로젝트이다. 기간은 2020년 11월 11일부터 2020년 11월 25일까지 2주에 걸쳐 진행된다. 이번 세션에서 다루었던 모든 주제(GPIO, SysTick, SysCLK, ADC, LCD_interface 등) 를 하나의 시스템을 구현하는데 적용하게 되며, 모든 코드는 DRA(Direct Register Access) 방식으로 짜여진다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;1. 진행&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;2주에 걸쳐 진행되는 프로젝트이므로 첫 주차와 두째 주차로 나누어 시스템을 개발한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;주차&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;1 주차 (2020.11.11 ~ 2020.11.18)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;- SRS 작성&lt;br /&gt;- Control module code 구성 및 테스트&lt;br /&gt;- 버그 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;2 주차 (2020.11.19 ~ 2020.11.25)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;- Display module code 구성 및 테스트&lt;br /&gt;- 전체 system 통합&lt;br /&gt;- 버그 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;2. Code&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 프로젝트의 code는 깃허브에 지속적으로 업로드될 예정이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/sean9595/TM4C123GXL/tree/master/EmL_Session02_fin_project&quot;&gt;github.com/sean9595/TM4C123GXL/tree/master/EmL_Session02_fin_project&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1605751102857&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;sean9595/TM4C123GXL&quot; data-og-description=&quot;Embedded C codes for TM4C123GH6PM. Contribute to sean9595/TM4C123GXL development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/sean9595/TM4C123GXL/tree/master/EmL_Session02_fin_project&quot; data-og-url=&quot;https://github.com/sean9595/TM4C123GXL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ibgL5/hyIicQvvR5/j5qePo9QSDFVL31jQN73mK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://github.com/sean9595/TM4C123GXL/tree/master/EmL_Session02_fin_project&quot; data-source-url=&quot;https://github.com/sean9595/TM4C123GXL/tree/master/EmL_Session02_fin_project&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ibgL5/hyIicQvvR5/j5qePo9QSDFVL31jQN73mK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;sean9595/TM4C123GXL&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Embedded C codes for TM4C123GH6PM. Contribute to sean9595/TM4C123GXL development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr style=&quot;margin: 20px auto 0px; border: none; cursor: pointer !important; z-index: 1; font-size: 0px; line-height: 0; background: url('../image/divider-line.svg') center -48px / 200px 420px no-repeat; width: 64px; height: 3px; padding: 20px; color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;3. 요구사항명세서 (SRS; Software Requirement Specification)&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;요구사항명세서의 경우에 회사마다 그리고 개발하는 시스템마다 그 방식과 내용이 다를 수 있다고 한다. 또한 그 내용은 프로젝트가 진행되는 과정에서 추가 혹은 수정이 되므로 나 또한 본 프로젝트의 SRS는 이 방식을 따르기로 한다. 본 프로젝트의 SRS는 이러한 이유로 첨부파일로 공유를 하겠다.&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/boFknM/btqNNg8Bc0C/3Kof6W7jKXwH6dUwFR1Ock/Requirement%20Specification%28%E1%84%80%E1%85%B5%E1%86%B7%E1%84%90%E1%85%A2%E1%84%92%E1%85%AE%E1%86%AB%29.docx?attach=1&amp;amp;knm=tfile.docx&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;Requirement Specification(김태훈).docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.51MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;http://users.ece.utexas.edu/~valvano/Volume1/E-Book/C7_DesignDevelopment.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;users.ece.utexas.edu/~valvano/Volume1/E-Book/C7_DesignDevelopment.htm&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1605750118034&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;:presentation&quot; data-og-title=&quot;IEEE 830-1998 Recommended Practice for Software Requirement Specifica&amp;hellip;&quot; data-og-description=&quot;IEEE 830-1998 소프트웨어 요구사항 명세를 위해 권장되는 프랙티스에 대한 발표&quot; data-og-host=&quot;www.slideshare.net&quot; data-og-source-url=&quot;https://www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&quot; data-og-url=&quot;https://www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bb9IJK/hyIid2Wpq8/rEXB15DTVE0EFJ2bILDkF1/img.jpg?width=768&amp;amp;height=576&amp;amp;face=0_0_768_576,https://scrap.kakaocdn.net/dn/OBgK9/hyIilGE9m7/QxrLVoLaYb3CoJFPK839P0/img.jpg?width=638&amp;amp;height=479&amp;amp;face=0_0_638_479&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.slideshare.net/Hong3/0-ieee-830-1998-recommended-practice-for-software-requirement-specificationupload&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bb9IJK/hyIid2Wpq8/rEXB15DTVE0EFJ2bILDkF1/img.jpg?width=768&amp;amp;height=576&amp;amp;face=0_0_768_576,https://scrap.kakaocdn.net/dn/OBgK9/hyIilGE9m7/QxrLVoLaYb3CoJFPK839P0/img.jpg?width=638&amp;amp;height=479&amp;amp;face=0_0_638_479');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;IEEE 830-1998 Recommended Practice for Software Requirement Specifica&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;IEEE 830-1998 소프트웨어 요구사항 명세를 위해 권장되는 프랙티스에 대한 발표&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.slideshare.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;대략적인 흐름은 위의 두 자료를 참고하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;4. System perspective&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;전반적인 system은 'Flow graph'와 'Flow chart'로 그리면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzW2x/btqNHo8yT0L/9fun47a8Kj19rW4c9EOjYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzW2x/btqNHo8yT0L/9fun47a8Kj19rW4c9EOjYk/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 2-1&amp;amp;amp;gt; Flow graph of the system&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzW2x/btqNHo8yT0L/9fun47a8Kj19rW4c9EOjYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzW2x%2FbtqNHo8yT0L%2F9fun47a8Kj19rW4c9EOjYk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 2-1&amp;gt; Flow graph of the system&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwmeJS/btqNIFveCHa/A3gzaX6eykvTwpiH3xljH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwmeJS/btqNIFveCHa/A3gzaX6eykvTwpiH3xljH0/img.png&quot; data-alt=&quot;&amp;amp;amp;lt;Fig. 2-2&amp;amp;amp;gt; Flow chart of the system&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwmeJS/btqNIFveCHa/A3gzaX6eykvTwpiH3xljH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwmeJS%2FbtqNIFveCHa%2FA3gzaX6eykvTwpiH3xljH0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;Fig. 2-2&amp;gt; Flow chart of the system&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;style7&quot; /&gt;</description>
      <category>Projects/2020 TM4C123 Project</category>
      <category>Embedded System</category>
      <category>SRS</category>
      <category>TM4C123</category>
      <category>모두의 연구소</category>
      <category>요구사항명세서</category>
      <category>임베디드 랩</category>
      <category>임베디드 프로젝트</category>
      <author>Sean_Kim95</author>
      <guid isPermaLink="true">https://engineering-agit.tistory.com/27</guid>
      <comments>https://engineering-agit.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 19 Nov 2020 11:09:24 +0900</pubDate>
    </item>
  </channel>
</rss>