레이블이 IoT인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IoT인 게시물을 표시합니다. 모든 게시물 표시

5/09/2021

IoT 의 이해와 IoT OS 비교

1. IoT(Internet of Thing) 의 이해 및 MCU/MPU 비교   

이전에는 IoT에 사용되어지는 Chip에 대해서 크게 관심을 가지고 있지 않았는데, 최근들어 IoT기반의 MPU/MCU를 사용을 해보고 
관련 RTOS도 사용해보니, 이 기능들이 AP기반의 Linux/Android 만큼 복잡성을 가지지는 않지만, 점점 복잡해지고 다양해지고 있는 것 같다.

마치 2000년 초반의 임베디드 시스템을 다시보는 것 같은데, 다른 점이 있다면, 그 때와 다르게, 각 Chip 업체 or Cloud 업체 중심으로 각각의 솔루션들을 제공해주고 있다. 

  • IoT(Internet of Thing) 용어 및 구조 
IoT를 보면 Connection 즉, Internet과 연결이 유선/무선으로 되어지며, 각 센서중심의 데이타를 선처리를 하여, 각 Cloud / Server 통신하여 제어되는 구조이다.

  • Edge Computing 
보통 Cloud 기반으로 돌아가는 추세이며, Edge 즉 IoT 수준의 MPU에서 선처리기능을 한 후 세부 처리는 Cloud에서 처리하는 방식이다.

  • IoT에서 많이 사용되어지는 MCU/MPU
보통 MCU는 Mircocontroller 이며, 주로 8bit/16bit 단순 기능 Micom 말했는데, MPU라는 용어가 나오면서 IoT에서 많이 사용되어진다.
특히 ARM은 Coretex-M 기반으로 저전력 DeepSleep 가능하며, 다양한 Peripheral 지원하는 좋은 MPU들이 출시되어지며, MCU 성능의 기능이 아니다.
크게 보면, ARM 과 ARM이 아닌 것으로 MPU들은 나뉘어지며, 보통 ARM 계열이 성능이 좋은 것으로 보이며 사용하기도 쉽다. 

MCU(MicroController Unit)

MPU(MicroProcessor Unit)

MCU vs MPU

  • WIFI 지원되는 MCU/MPU
요즘 MCU/MPU가 혼용되어사용되어지므로, 구지 크게 구분을 할 필요까지는 없을 것 같으며, WIFI가 지원되는 MCU들을 알아보자.

ESP32의 경우 Tensilica기반의 Core사용하며, 이는 Cadence에서 만들었음   


2. IoT 의 OS 비교 

IoT에서 많이 사용되어지는 OS는 다음 3개로 보이는 것 같으며, OS 없이도 구현이 가능하므로, OS 사용여부는 개발의 복잡성에 따라 달라질 것 같다. 
  1. Zephyr : 최근부터 뜨기 시작한 OS
  2. FreeRTOS: 오래전 부터 제공한 RTOS이지만, 많은 Library들이 부족함 
  3. Mbed: ARM에서 제공하는 OS로, 다양한 Library와 개발에서 많이 사용되어지는 것으로 보임 

2.1 Mbed OS

  • 기본소개 
Cortex-M ARM기반의 MCU/MPU기반으로 무료로 제공해주는 Open OS 뿐만아니라, IDE인 Studio도 제공을 해주고 있다. 
Mbed는 RTOS로 RTX와 RTOS API를 포함하고 있다고 하는데, RTX가 포함이 되어야 RTOS로 동작이 가능하다고 한다.

  • 장점
ARM기반의 MPU/MCU에 제공되어지기 때문에, 안정적인 OS를 사용가능하며, TLS와 같은 보안라이브러리도 무료로 제공해주고 있다. 

  • 단점
ARM이외 Core , RISK-V , Tensilica 등은 지원불가능 
RTX기능을 사용하지 않으면, RTOS기능을 사용못하는 것으로 보임 

RTX의 기능 

Mbed OS bare metal profile
RTX를 포함하고 있지않아서 RTOS가 아니라고 하며, 일반 OS라고 함 

라이센스는 Apache 2.0로 무료로 사용가능하며, ARM기반이라면 사용하기 편한 것으로 보인다.

Mbed OS 관련정보 


Mbed OS 6 전체구조


Mbed OS v6.0 Bare Metal 지원사항확인 

Mbed OS v6.0 Quick Guide

Mbed Source 

Coding Style (Code Convention)

Mbed CLI How to Install


2.2 FreeRTOS

  • 기본소개 
MCU/MPU기반으로 가장 많이 알려진 RTOS로 ARM이외에 다양한 Core들을 지원하고 있으다. 다만, 기능이 OS만 지원하다보니, 
실제사용시에는 각 Chip Vendor에서 별도로 제공해주지 않는 이상은 각 Library들이 많이 부족함을 느끼고 있다. 
물론 ESP32의 경우 FreeRTOS를 모든 것을 잘 제공해주고 있으며 안정적으로 잘 동작한다. 
하지만, 현재 AWS 기반으로 제공해주는 AWS FreeRTOS 와 ESP32 FreeRTOS는 조금 다르다. 
둘 다 OS이외에 부족한 Library들을 Mbed or OpenSource로 이를 보완하고 있지만, 
기본적으로 AWS FreeRTOS의 경우 동작이 좀 불안한 것 같다. 
최근에 AWS FreeRTOS 기반으로 프로젝트를 했는데, 메모리 Heap 관련문제가 꽤 있었는데, 점차 나아지리라고 생각되어진다.  

  • 장점
다양한 CPU 아키텍쳐를 지원가능하며, 여러 IDE에서 무료로 제공해주고 있어 많이 사용되어지고 있다. 
그리고 부족한 부분들은 현재 각 Chip Vendor 혹은 AWS에서 각 부분들을 채우고 보완하고 있다.

  • 단점
실제 RTOS로 사용해보면, 기존의 RTOS 사용해본사람도 사용하기가 쉽지 않으며, API도 좀 복잡하다. 
사실 복잡하기보다는 개인적으로 API가 별로 마음에 들지가 않는다. 
어쩔수 없이 사용하는 사람이 적응해야하는 법이지만, 항상 Vxwork나 다른 RTOS와 비교를 하게되어지는데, 개인적으로 API 별로다. 

  • FreeRTOS 공식 사이트와 소스 


  • AWS FreeRTOS 문서와 소스


2.3 Zephyr RTOS

  • 기본소개
현재 NXP기반으로 많이 사용되어지는 IoT OS로 가장 큰 장점의 Linux와 유사성이며 ARM이외의 Core 지원 될것이다. 
OS 개발이 Linux Foundation이어서 그런지 Device Tree도 지원되며, Linux 와 유사성이 많이 보이는 것으로 보인다. 
아직 사용해보지 못해서 뭐라고 말하지는 못하겠지만, 왠지 이 중심으로 갈 것 같기도 하다.

  • 장점
현재 사용해보지 못했지만, 사이트와 Manual만 보는 것만으로도, 앞으로 가장편하게 사용하게될 OS가 될 것 같으며, 다양한 기능들을 제공해줄 것 같다.
또한 FreeRTOS처럼 다양한 Core를 지원해주고 있어, 앞으로 대세가 이것으로 되지 않을까하고 생각한다.

  • 단점
아직 사용해보지 못해서 잘모르겠으나, FreeRTOS처럼 내부 버그가 많을 것으로 생각되어진다. 왜냐하면 예전의 Linux 초기가 많이 생각이 나서 그런부분은 사용자가 많이 고쳐가며 구현해야 할 것같다. 


Zephyr Project 공식사이트 와 Source 

NXP의 Zephyr 관련사이트 

Zephyr Project 

ESP32 Zephyr 

5/02/2021

ESP32 Backtrace 와 addr2line

1. ESP32의 Monitor 기능 

esp32 개발환경에서 제공해주는 idf.py -p /dev/ttyUSBx monitor , 즉 monitor 기능은 기본적으로 gdb option을 포함하고 있다. 
그래서, abort 시 backtrace가 가능한데, 이때 사용하는 기능이 addr2line 기능이며, 이는 각 Stack의 Address를 Code의 위치를 찾는다. 
기본기능으로 아래와 같이 addr2line을 이용하여 위치를 찾아주며, 이 정보는 stderr로 표시해주고 있다. 

  • ESP32가 Exception 이 발생할때 아래와 같이 Dump와 Backtrace 정보출력   
Guru Meditation Error of type StoreProhibited occurred on core  0. Exception was unhandled.
Register dump:
PC      : 0x400f360d  PS      : 0x00060330  A0      : 0x800dbf56  A1      : 0x3ffb7e00
A2      : 0x3ffb136c  A3      : 0x00000005  A4      : 0x00000000  A5      : 0x00000000
A6      : 0x00000000  A7      : 0x00000080  A8      : 0x00000000  A9      : 0x3ffb7dd0
A10     : 0x00000003  A11     : 0x00060f23  A12     : 0x00060f20  A13     : 0x3ffba6d0
A14     : 0x00000047  A15     : 0x0000000f  SAR     : 0x00000019  EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000  LBEG    : 0x4000c46c  LEND    : 0x4000c477  LCOUNT  : 0x00000000

Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90

  • addr2line이용하여 추적가능 
Guru Meditation Error of type StoreProhibited occurred on core  0. Exception was unhandled.
Register dump:
PC      : 0x400f360d  PS      : 0x00060330  A0      : 0x800dbf56  A1      : 0x3ffb7e00
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
A2      : 0x3ffb136c  A3      : 0x00000005  A4      : 0x00000000  A5      : 0x00000000
A6      : 0x00000000  A7      : 0x00000080  A8      : 0x00000000  A9      : 0x3ffb7dd0
A10     : 0x00000003  A11     : 0x00060f23  A12     : 0x00060f20  A13     : 0x3ffba6d0
A14     : 0x00000047  A15     : 0x0000000f  SAR     : 0x00000019  EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000  LBEG    : 0x4000c46c  LEND    : 0x4000c477  LCOUNT  : 0x00000000

Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
0x400f360d: do_something_to_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:57
(inlined by) inner_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:52
0x400dbf56: still_dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:47
0x400dbf5e: dont_crash at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:42
0x400dbf82: app_main at /home/gus/esp/32/idf/examples/get-started/hello_world/main/./hello_world_main.c:33
0x400d071d: main_task at /home/gus/esp/32/idf/components/esp32/./cpu_start.c:254 

Backtrace는 2개의 Address로 구성되며, PC와 A1, 즉 , Arg라고 짐작 (세부내용은 ABI 참조해야함)

  • addr2line 이용하여 소스위치확인
$ xtensa-esp32-elf-addr2line -pfiaC -e build/PROJECT.elf ADDRESS  // 상위 Address 입력하면 각 소스위치파악 


  • ESP32 Exception이 발생할 경우 순서도 


GDB-Stub 사용

ESP32 Exception, Fatal Errors

monitor 관련내용

ESP32용 Backtrace Shell Script 


1.1 backtrace 와 addr2line 기본사용법 

backtrace는 Stack Trace라고도 하며, 기본적으로 함수의 Call Stack을 추적하는 방법을 말하며, 주로 사용되어지는 함수가 backtrace기능이다. 
이때 보조적으로 Code의 위치를 찾아주는 기능이 addr2line tool 이며, 이를 이용하여 쉽게 어디서 호출되어지는 분석이 가능하다. 

  • 기본설정 
GCC 로 Compile 시 반드시 -g 옵션 과 -rdynamic (동적 Library)

  • backtrace 함수와 addr2line 사용법 


1.2 addr2line 이용

ESP32는 기존의 Backtrace처럼 사용하지 않는 구조로 보이며, Backtrace가 아래와 같이 나오면 addr2line을 이용하여 쉽게 Source 위치 파악은 가능하다  

Backtrace:0x40090677:0x3ffe3710 0x40090c89:0x3ffe3730 0x400955fa:0x3ffe3750 0x400da8f2:0x3ffe37c0 0x400da9f0:0x3ffe37e0 0x400ec484:0x3ffe3800 0x400ec516:0x3ffe3840 0x400ec651:0x3ffe3870 0x400ec6e4:0x3ffe38a0 0x400daa13:0x3ffe38c0 0x400db275:0x3ffe38f0 0x400db4fa:0x3ffe3920 0x400d8deb:0x3ffe3a70 0x400d978c:0x3ffe3a90 0x40090cf9:0x3ffe3ac0 

$ xtensa-esp32-elf-addr2line 0x40090677 -e ./build/demos  
$ xtensa-esp32-elf-addr2line 0x40090c89 -e ./build/demos 

1.3 이외 Tool 사용 

  • Linux Kernel 처럼 map 분석 
Symbol Table 과 Linker Script Section 과 Library 비롯하여 모든 기본정보 확인
$ cat ./build/demos.map    
// Discarded input sections     (Linker Scirpt 의 Section 과 상대주소 파악 ) 
// Memory Configuration         (실제 Memory 영역과 Attribute로 x/r/w 확인 ) 
// Linker script and memory map (Linker Scirpt 와 같이 절대주소 파악 )
// Cross Reference Table        (Symbol Table로 Symbol의 사용여부 확인가능)

  • readelf 로 Library 분석 및 ELF 분석 
각 Library 및 ELF Format 관련정보 확인 
$ xtensa-esp32-elf-readelf -a ./build/esp-idf/app_trace/libapp_trace.a    //Build 내에서 사용하는 ESP-IDF Library 분석 (-a 전체정보)  
$ xtensa-esp32-elf-readelf -h ./build/esp-idf/app_trace/libapp_trace.a                           //ELF 기본정보확인 (Endian/Entry Point/Machine)   
$ xtensa-esp32-elf-readelf -s ./build/esp-idf/app_trace/libapp_trace.a | grep function           //library Symbol Table 확인   
$ xtensa-esp32-elf-readelf -S ./build/demo                          //Linker Script Section 확인   

4/24/2021

ESP32 OpenOCD 와 GDB 사용

1. ESP32 개발환경구축 


  • ESP32-OpenOCD
ESP32개발환경을 설치하면, 자동으로 아래의 Openocd가 설치가 되며, 없다면, 직접설치

  • JTAG의 기본이해와 OpenOCD 관련내용 
JTAG을 기본적으로 이해하고 OpenOCD로 어떻게 JTAG을 사용하는지 이해 

  • Raspberry Pi 에 OpenOCD 구성 및 구조이해 
이전의 FTDI 기반으로 Raspberry Pi3  OpenOCD 사용 (반드시 숙지)  

  • /dev/ttyUSBx 권한문제

$ ls -al /dev/ttyUSB*           // 권한문제시 직접확인 
crw-rw---- 1 root dialout 188, 0  4월 20 12:25 /dev/ttyUSB0
crw-rw-r-- 1 root plugdev 188, 1  4월 20 12:25 /dev/ttyUSB1
crw-rw-r-- 1 root plugdev 188, 2  4월 20 12:25 /dev/ttyUSB2

//각 Group 권한 추가 
$ sudo usermod -a -G dialout jhlee  //serial 
$ sudo usermod -a -G plugdev jhlee  //JTAG
or
// 직접 권한변경 
$ sudo chmod a+rw /dev/ttyUSB0

  • libusb 권한문제

Info : Configured 2 cores
  Info : Listening on port 6666 for tcl connections
  Info : Listening on port 4444 for telnet connections
  Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
  Error: no device found
  Error: unable to open ftdi device with vid 0403, pid 6010, description '*', serial '*' at bus location '*'
  
문제 해결방법 (udev 권한 변경)

$ lsusb   // 현재 PID 와 VID (Product ID/ Vendor ID) 확인 
...
Bus 001 Device 011: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC
...

$ sudo vi /etc/udev/rules.d/esp32link.rules
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"

  • Window 10 (Zadig)
Zadig Download 진행 후 아래와 같이 Libusb/WinUSB 설정 진행 



관련이슈내용



1.1  ESP32 Board 와 FT2232H Board 연결 

  • ESP32 Module과 FT2232 연결 
이전의 OpenOCD와 동일하며, 하나는 JTAG  다른하나는 Serail로 연결 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-wrover-kit.html




  • ESP32 OpenOCD 와 GDB 동작구조 
OpenOCD를 사용할 경우 GDB로 연결하여 동작하는데, 아래와 같이 연결되어 동작되어진다.

  https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/index.html


  • ESP32 Module 과 JTAG 연결 

ESP32 Pin

JTAG Signal

MTDO / GPIO15

TDO

MTDI / GPIO12

TDI

MTCK / GPIO13

TCK

MTMS / GPIO14

TMS

GND

GND


  • 직접 구성한 FT2232H 와 ESP32 Board 
나의 경우 ESP32에서 제공하는 ESP사에 제공해주는 FT2332H Board가 없어서 기존의 FT2232H Board로 구성한 것이지만, 
별도로 ESP에서 전용 Board를 판매하고 있으니,돈이 있다면, 직접 구입을 하면 편하다. 







2.  VS Code의 Espressif IDF 설치 

  • VS Code의 Extension 에서 Espressif IDF 설치 
VS Code에서 Extension에서 찾아서 설치 


VS Code에서 F1을 누르고, ESP로 치면, ESP-IDF 관련 많은 메뉴들이 존재하는 것을 볼 수 있다. 
VS Code의 이 메뉴 없이 직접 python의 idf.py로 직접 Control로 가능하다. 
idf.py는 esptool.py도 control하기 때문에 모두 idf.py command만 알아도 된다. 

  • 많이 사용하는 Menu들 
  1. ESP-IDF: New Project 
  2. ESP-IDF: Build your project
  3. ESP-IDF: Device configuration
  4. ESP-IDF: Flash(UART) your project
  5. ESP-IDF: Monitor your device
  6. ESP-IDF: OpenOCD  Manager

  • Terminal에서 직접 Command 입력 
$ source ~/esp/esp-idf/export.sh 

$ idf.py --help   //상위에서 제공되는 메뉴기능을 Command로 실행하면된다. 
.......
Commands:
  all                    Aliases: build. Build the project.
  app                    Build only the app.
  app-flash              Flash the app only.
  bootloader             Build only bootloader.
  bootloader-flash       Flash bootloader only.
  build-system-targets   Print list of build system targets.
  clean                  Delete build output files from the build directory.
  confserver             Run JSON configuration server.
  create-component       Create a new component.
  create-project         Create a new project.
  efuse_common_table     Generate C-source for IDF's eFuse fields.
  efuse_custom_table     Generate C-source for user's eFuse fields.
  encrypted-app-flash    Flash the encrypted app only.
  encrypted-flash        Flash the encrypted project.
  erase_flash            Erase entire flash chip.
  erase_otadata          Erase otadata partition.
  flash                  Flash the project.
  fullclean              Delete the entire build directory contents.
  gdb                    Run the GDB.
  gdbgui                 GDB UI in default browser.
  gdbtui                 GDB TUI mode.
  menuconfig             Run "menuconfig" project configuration tool.
  monitor                Display serial output.
  openocd                Run openocd from current path
  partition_table        Build only partition table.
  partition_table-flash  Flash partition table only.
  post_debug             Utility target to read the output of async debug action and stop them.
  python-clean           Delete generated Python byte code from the IDF directory
  read_otadata           Read otadata partition.
  reconfigure            Re-run CMake.
  set-target             Set the chip target to build.
  show_efuse_table       Print eFuse table.
  size                   Print basic size information about the app.
  size-components        Print per-component size information.
  size-files             Print per-source-file size information.
  uf2                    Generate the UF2 binary with all the binaries included
  uf2-app                Generate an UF2 binary for the application only


  • Monitor의 경우 별도의 Command
기본적으로 Exception이 나오면, add2line으로 분석을 해주며, bootloader에서 elf로 올려 분석을 해주는 것으로 보인다. 
Ctrl + ] 는 모니터에서 Exit 


2.1  VSCode의  Espressif IDF 설정  

  • 설치후 Espressif IDF 설정 확인 
Flash 방법도 UART/JTAG으로 두가지 다 가능 



  • 별도의 OpenOCD 세부설정 존재
중요한 것은 이거의 주내용은 Flash Type 관련설정이며, ESP OpenOCD의 위치파악 가능 및 설정확인가능 
  1. UART이면, 해당 Port로 연결
  2. JTAG이면, 해당 Port로 연결


ESP32-OpenOCD에서 확인
$ ls ~/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32*     //OpenOCD Board 설정 (Interface/Target 분석)
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-ethernet-kit-3.3v.cfg
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-solo-1.cfg
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-wrover-kit-1.8v.cfg
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-wrover-kit-3.3v.cfg
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-wrover.cfg
/home/jhlee/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32s2-kaluga-1.cfg

$ vi ~/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/board/esp32-wrover-kit-3.3v.cfg //현재 사용중인 config (Target/Inferface)


2.2  OpenOCD 연결 및 에러사항 

상위 ESP-IDF 메뉴 중 OpenOCD Manager를 이용하여 간단하게 실행가능하며, 직접 idf.py를 이용하여 실행해도 상관없다. 

  • OpenOCD 기본 동작확인
Open On-Chip Debugger  v0.10.0-esp32-20200709 (2020-07-09-08:54)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 20000 kHz

Info : Configured 2 cores
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32: Debug controller 0 was reset.
Info : esp32: Core 0 was reset.
Info : esp32: Debug controller 1 was reset.
Info : esp32: Core 1 was reset.
Info : Listening on port 3333 for gdb connections

  • OpenOCD 에러 
아래  에러는 대부분 제대로 연결이 안되거나,  FT2332H는 Channel이 두개인데, Channel 설정오류 즉 연결(Interface)에서 잘되지 않은 것이므로, 
HW으로는 연결사항을 확인하고, SW는 Channel 설정사항을 세부적으로 살펴 보자.  

open On-Chip Debugger  v0.10.0-esp32-20200709 (2020-07-09-08:54)
  Licensed under GNU GPL v2
  For bug reports, read
      http://openocd.org/doc/doxygen/bugs.html
  adapter speed: 20000 kHz

  Info : Configured 2 cores
  Info : Listening on port 6666 for tcl connections
  Info : Listening on port 4444 for telnet connections
  Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
  Info : clock speed 20000 kHz
  Error: JTAG scan chain interrogation failed: all ones
  Error: Check JTAG interface, timings, target power, etc.
  Error: Trying to use configured scan chain anyway...
  Error: esp32.cpu0: IR capture error; saw 0x1f not 0x01
  Warn : Bypassing JTAG setup events due to errors
  Info : Listening on port 3333 for gdb connections
  • OpenOCD 세부설정 확인 
나의 경우 Channel A가 동작이되지 않아 아래와 같이 Channel B로 소스 수정하여 동작가능 
$ vi ~/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/share/openocd/scripts/interface/ftdi/esp32_devkitj_v1.cfg 
#
# Driver for the FT2232H JTAG chip on the Espressif DevkitJ board
# (and most other FT2232H and FT232H based boards)
#
 

interface ftdi
ftdi_vid_pid 0x0403 0x6010 0x0403 0x6014

#
# interface 0 channle A 
# interface 1 channel B (나의 경우 현재 Channel B로 사용)
ftdi_channel 1

#
# ftdi_layout_init 0x0008 0xf00b 
#
# 0x0008 0x000b  JTAG 설정 
# TCK, TDI, TDO, TMS: ADBUS0-3
#
# 0x0000 0xf000 LED 설정 
# LEDs: ACBUS4-7

ftdi_layout_init 0x0008 0xf00b
ftdi_layout_signal LED -data 0x1000
ftdi_layout_signal LED2 -data 0x2000
ftdi_layout_signal LED3 -data 0x4000
ftdi_layout_signal LED4 -data 0x8000
.... 

이외 VS Code로 사용할 경우 중복 실행되는 경우 및 설정이 잘못되는 경우가 많으므로, 관련부분을 확인하자. 



2.3 App Tracer 사용 

상위 상태에서 IDF App Tracer -> Start App Trace를 실행해보면 동작되는 것을 확인가능하며, 관련 설정은 아래를 참고해서 미리 해두자. 

APP Trace

Heap Trace

  • VSCode 기반으로 OpenOCD 사용예제 
일반예제로는 좌측의 Tracer 이용하여 사용하지만 제대로 동작되지는 않는 것을 확인 


  • App tracer의 사용법 
Application Level의 JTAG을 사용하고자 한다면, 반드시 sdkdefault에 설정을 추가하고 아래의 Manaul대로 설정하자. 

  https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/app_trace.html



  • ESP32의 App Trace 사용예제
ESP32의 Example에 App Trace를 사용하여 Debug하는 예제가 존재하는데, 이 기반으로 테스트 진행 
반드시 sdkconfig의 설정과 별도의 esp함수가 필요하므로, 세부사항은 상위를 참조 

아래의 App Trace 예제를 보면, ADC Sampling을 하는데, 한번은 app trace를 이용하고 한번은 UART로 보여주는 방식으로 아주 기초적으로 사용하는 방식같다. 

  • Trace Log 분석 


3.  GDB 기반의 Visual Display 도구들 

JTAG을 사용하면, GDB는 사용해야 하며, 이 기반으로 손쉽게 디버깅할 수 있도록 하는 것이 중요한데, 예전것들 부터 보면 아래와 같다. 

  • gdbtui
gdb에서 제공하는 가장 기본적인 Dispaly로 문자 중심으로 표시를 해주는데, 사용한 일이 거의 없다.

  • ddd 
예전에 내가 많이 사용했던 GDB기반의 Display 이지만, Eclipse기반의 Tool들이 나오면서 거의 사용할일이 사실 없다.

  • Eclipse기반의 Tool들 
요즘 대부분의 유명 Chip Vendor사들은 회사마다 자신만의 Eclipse기반의 Tool을 가지고 있어 이 기반으로 손쉽게 gdb 를 사용가능하다.

  • gdbgui
이것은 이번에 나도 처음알게된 것인데 Web broswser 기반으로 동작하는데, 괜찮은 Tool 같은데, 처음 설정이 꼬이면, 제대로 동작이 안되는 것 같다.  

  • visualgdb
VisualStudio기반의 유료로 30일만 사용가능 (이전 OpenOCD에 자세히 설명)


3.1  ESP32 OpenOCD 기반의 GDB 사용법 

  • ESP32의 OpenOCD Ecplise 연결 방법 
ESP Manual을 보면 쉽게 Ecplise에 연결하고 gdbgui를 사용을 언급을 하고 있다. 
Ecplise 기반은 많이 해보았기에, gdbgui로 해보기로 하자. 

  • ESP32 TEST Program 기반 현재 상태 확인 
이전에 만들었던, exaplme로 간단하게 현재 상태를 간단히 분석해보고 gdb 명령과 gdb를 실행해보자.
$ source ~/esp/esp-idf/export.sh    // Ubuntu 20.04기반으로 해서 기본 Python 3으로 됨
Setting IDF_PATH to '/home/jhlee/esp/esp-idf'
Detecting the Python interpreter
Checking "python" ...
Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
Checking "python3" ...
Python 3.8.5
"python3" has been detected
Adding ESP-IDF tools to PATH...
Using Python interpreter in /home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/python    // python3기반으로 virtulenv 설정
Checking if Python packages are up to date...
The following Python requirements are not satisfied:        // 다음과 같은 문제가 발생 , 다시 설치해도 동일 
gdbgui==0.13.2.0
pygdbmi<=0.9.0.2
To install the missing packages, please run "/home/jhlee/esp/esp-idf/install.sh"
Diagnostic information:
    IDF_PYTHON_ENV_PATH: /home/jhlee/.espressif/python_env/idf4.4_py3.8_env
    Python interpreter used: /home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/python


$ cat build/gdbinit  //gdb init 명령어확인
file /home/jhlee/project-name/build/app_trace_to_host.elf
target remote :3333
mon reset halt
flushregs
thb app_main
c


$ xtensa-esp32-elf-gdb -x build/gdbinit build/app_trace_to_host.elf   //gdb test 진행시 에러 발생 python 2.7필요  
xtensa-esp32-elf-gdb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

$ ll /usr/bin/py*  //Ubuntu 20.04에는 python2 가 없음

$ which python
/home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/python

$ sudo apt-get install libpython2.7           //설치 진행 

$ xtensa-esp32-elf-gdb -x build/gdbinit build/app_trace_to_host.elf   //재진행
....
Type "apropos word" to search for commands related to "word"...
Reading symbols from build/app_trace_to_host.elf...done.
build/gdbinit:2: Error in sourced command file:
:3333: 연결 시간 초과.

  • OpenOCD와 GDB 기본 테스트 진행 
 $ idf.py openocd    //openocd 만 TEST 및 tcl/gdb/telnet server 동작확인 
Executing action: openocd
Note: OpenOCD cfg not found (via env variable OPENOCD_COMMANDS nor as a --openocd-commands argument)
OpenOCD arguments default to: "-f board/esp32-wrover-kit-3.3v.cfg"
OpenOCD started as a background task 43585
Executing action: post_debug
Open On-Chip Debugger  v0.10.0-esp32-20200709 (2020-07-09-08:54)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : Configured 2 cores
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : Target halted. CPU0: PC=0x400D55BC (active)
Info : Target halted. CPU1: PC=0x400E4926
Info : Listening on port 3333 for gdb connections


$ idf.py openocd gdb                  // openocd 와 gdb TEST 진행 문제없음 
or 
$ idf.py openocd gdb   build/app_trace_to_host.elf   
........
esp32: Core 1 was reset.
Target halted. CPU0: PC=0x40000400 (active)
Target halted. CPU1: PC=0x40000400 
Hardware assisted breakpoint 1 at 0x400d55bc: file ../main/app_trace_to_host_example_main.c, line 92.
Target halted. CPU0: PC=0x400D55BC (active)
Target halted. CPU1: PC=0x400E4926 
[New Thread 1073446776]
[New Thread 1073444120]
[New Thread 1073430168]
[New Thread 1073434616]
[New Thread 1073413208]
[New Thread 1073437016]
[Switching to Thread 1073441464]

Thread 1 hit Temporary breakpoint 1, app_main () at ../main/app_trace_to_host_example_main.c:92
---Type return to continue, or q return to quit---
92      {
(gdb)  


$ idf.py openocd gdbtui   // 엔터를  몇번 치면 소스 가 보임 
or
$ idf.py openocd gdbtui  build/app_trace_to_host.elf   

   ┌──../main/app_trace_to_host_example_main.c────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
   │88       * and logging results with application tracing to the host                                                                                                                                                                           │
   │89       * as well as for comparison printing out sampling result to UART                                                                                                                                                                     │
   │90       */                                                                                                                                                                                                                                   │
   │91      void app_main(void)                                                                                                                                                                                                                   │
H+>│92      {                                                                                                                                                                                                                                     │
   │93          ESP_LOGI(TAG, "Enabling ADC1 on channel 6 / GPIO%d.", ADC1_CHANNEL_6_GPIO_NUM);                                                                                                                                                   │
   │94      #if CONFIG_IDF_TARGET_ESP32                                                                                                                                                                                                           │
   │95          adc1_config_width(ADC_WIDTH_BIT_12);                                                                                                                                                                                              │
   │96      #elif CONFIG_IDF_TARGET_ESP32S2                                                                                                                                                                                                       │
   │97          adc1_config_width(ADC_WIDTH_BIT_13);                                                                                                                                                                                              │
   │98      #endif                                                                                                                                                                                                                                │
   └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
remote Remote target In: app_main                                                                                                                                                                                             L92   PC: 0x400d55bc 
[New Thread 1073413208]
[New Thread 1073437016]
[Switching to Thread 1073441464]

---Type return to continue, or q return to quit---
Thread 1 hit Temporary breakpoint 1, app_main () at ../main/app_trace_to_host_example_main.c:92
(gdb)  quit 

3.2  OpenOCD 기반의 gdbgui  1차 TEST 진행 

결론적으로 제대로 사용해보지 못했으며, 원인은 Version 간의 문제로 보이며, 시간이 없어 이부분 추후에 다시 해보도록 하며, 관련내용을 아래에 기술한다. 
아래내용을 이해하기위해서는 python의 virtual env를 이해해야한다. 

  • gdbgui 만 별도 테스트 
gdbgui 의 경우만 제대로 동작이 되지 않아 이에 관련하여 별도로 테스트를 진행 

$ idf.py openocd gdbgui   // 제대로 실행은 되지만 Webbrowser 에서 제대로 동작되지 않음 
or
$ idf.py  openocd gdbgui monitor -p /dev/ttyUSB0  
Executing action: openocd
Note: OpenOCD cfg not found (via env variable OPENOCD_COMMANDS nor as a --openocd-commands argument)
OpenOCD arguments default to: "-f board/esp32-wrover-kit-3.3v.cfg"
OpenOCD started as a background task 33824
Executing action: gdbgui
gdbgui started as a background task 33825
Executing action: post_debug
Open On-Chip Debugger  v0.10.0-esp32-20200709 (2020-07-09-08:54)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : Configured 2 cores
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : Listening on port 3333 for gdb connections 

$ which gdbgui      
/home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/gdbgui

$ gdbgui   // idf에 기본설치된 gdbgui 만 테스트 진행 
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
Opening gdbgui with default browser at http://127.0.0.1:5000
exit gdbgui by pressing CTRL+C
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
frozen importlib._bootstrap:219: RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144 from C header, got 152 from PyObject
세그멘테이션 오류 (core dumped)   //idf에 기본설치된 gdbgui는 제대로 동작이 안됨

$ pip freeze | grep greenlet   //greenlet 문제로 보고 관련 version 확인 
greenlet==1.0.0

$ pip freeze | grep gdb*   //gdbgui version 확인 
gdbgui==0.13.2.0
pygdbmi==0.9.0.2

  • 일반 gdbgui 테스트 진행 (python3)
esp의 python  virtual env를 사용하지 않고 테스트진행 해야해서 상위 설정하지 않고 별도 설치 후 바로 테스트진행하니 문제없음  
$ which gdbgui        //pip3 install gdbgui 별도 설치 
/home/jhlee/.local/bin/gdbgui

$ gdbgui --version
0.14.0.2

$ pip3 freeze | grep greenlet
greenlet==0.4.16

$ gdbgui   //제대로 동작되는 것을 확인
Opening gdbgui with default browser at http://127.0.0.1:5000
View gdbgui dashboard at http://127.0.0.1:5000/dashboard
exit gdbgui by pressing CTRL+C 



  • esp  gdbgui upgrade 하기로 결정
esp 개발환경을 보면, python virtual env를 사용하는데, 내부에 gdbgui가 존재하며, 이를 upgrade를 진행하기로 결정함 
외부 python3.8  package가 아니며, virtual env 안에서만 upgrade 진행 
//source ~/esp/esp-idf/export.sh 진행했기때문에 esp virtual env 사용 
$ which gdbgui      //esp 개발안정버전 4.4 의 python virtual env에 gdbgui 가 설치됨 
/home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/gdbgui   //문제는 python3.8기반으로 구성되었으며, 나또한 python3으로 하고싶지만, 동작되지 않음 

$ gdbgui --version
0.13.2.0

$ pip install --upgrade gdbgui     //esp virtual env의 gdbgui upgrade 진행 

$ gdbgui --version
0.14.0.2

$ gdbgui //esp virtual env 에서도 gdbgui 기본동작되는 것확인완료 (역시 version문제)
Opening gdbgui with default browser at http://127.0.0.1:5000
View gdbgui dashboard at http://127.0.0.1:5000/dashboard
exit gdbgui by pressing CTRL+C

$ idf.py openocd gdbgui  // esp openocd 와 gdbgui 기본테스트 진행했지만, Version 문제발생 
The following Python requirements are not satisfied:
gdbgui==0.13.2.0
pygdbmi<=0.9.0.2
To install the missing packages, please run "/home/jhlee/esp/esp-idf/install.sh"
Diagnostic information:
    IDF_PYTHON_ENV_PATH: /home/jhlee/.espressif/python_env/idf4.4_py3.8_env
    Python interpreter used: /home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/python
....

$ vi ~/esp/esp-idf/requirements.txt  // version check 하는 부분 수정 (에러는 없어지지만, 제대로 동작되지 않음)

현재 나의 local에 설치하여 gdbgui 별도로 설치하여 동작되는 것을 확인 했지만, idf.py는 python virutal env기반으로 동작되기 때문에  version이 다르다. 
그래서 이를 업그레이드 했지만, idf.py의 내부에서 gdbgui 0.13.2.0 version check하는 부분이 있어 제대로 실행되지 않는다. 

version 체크 하는 부분까지도  다 고쳐서 사용할까도 생각했지만, 나중에 다시 테스트도 해야하니, 이 부분은 다시 원상복귀 하기도 결정했다.

상위와 유사한 상황

  • OpenOCD GDBGUI 1차 TEST 결론
OpenOCD와 TCL/GDB는 잘동작하지만, GDBGUI는 버그로 보인다. 
현재 아래 Manual (최신 Version 4.4) 로 보더라도, Python3으로 설치를 진행하라고 되어있는데, Python2가 필요한 거 보면, 현재도 개발중인 것으로 보이며, 
추후 시간이 된다면, Python2로 변경 후 다시 시도를 해보아도 괜찮을 것 같은데, 다른 부작용이 왠지 있을 것 같다. 


3.3  OpenOCD 기반의 gdbgui  2차 TEST 진행 

기존에 Python3만 동작되었기에, Python2 설치 후  virtual env도 Python2로 바꾸려고 했는데, 실패했다. 
현재 python2 설치되었으며, ESP32는 python3의 virtualenv를 그대로 사용함

$ sudo apt install python2 

$ sudo ln -s /usr/bin/python2 /usr/bin/python 

$ ~/esp/esp-idf/install.sh

일주일 후 다시 시도 후  갑자기 작동되는데, 이전에 왜 동작이 안되었는지 모르겠지만, 다음에 다시 시도 할 경우 다시 해봐야겠음 
며칠사이에 다른 것이 변경이 되었는지, 모르겠음 

$ cd ~/project-name   // 이전과 동일한 Project 
CMakeLists.txt  Makefile  README.md  build  debug.log  example_test.py  main  sdkconfig  sdkconfig.ci  sdkconfig.defaults  trace

$ . esp/esp-idf/export.sh 

$ which gdbgui
/home/jhlee/.espressif/python_env/idf4.4_py3.8_env/bin/gdbgui

$ gdbgui --version
0.13.2.0

$ idf.py openocd gdbgui 
or 
$ idf.py openocd gdbgui monitor -p /dev/ttyUSB1 

Web browser 기반으로 쉽게 Break Point를 쉽게 설정하고, 실행하니 편하다.

우측 정보기반으로 Ecplise 처럼 쉽게 Trace도 가능하다 

Web Browser에서 실행해서 좋은데, Ecplise 처럼 안정적이지는 못한것으로 보이는데, 잘 사용하면 괜찮을 것 같다.  

  • OpenOCD GDBGUI 2차 TEST 결론 
현재 잘 동작하며, 1차 TEST 때 왜 동작이 안되었는지가 다음에 다시 설치할 기회가 있다면, 다시 해보도록하자. 


3.4  Raspberry 를 이용한 OpenOCD 방법 


  • Raspberry Pi 와 ESP32 연결 
FTDI가 아닌 Raspberry를이용하여 OpenOCD 기반으로 JTAG으로  ESP32를 연결하는 방법인데, 새로운 방법이라 아직 시도는 안해봤지만, 추후 해보도록하자. 
상위와 거의 동일하며, FTDI 대신 Raspberry 로 변경된 것으로 보면된다. 추후 VS Code와 연결하여 Debug해보도록 해보자.

3/07/2021

ESP32 관련구성 및 VSCode

1. ESP32 EVM 구성 및 개발환경구성

  • ESP32 개발환경구조 

ESP-IDF라는 개발환경을 제공하고 있으며, ToolChain 과 기본API 제공해주고 있다. 
더불어 이런 API들을 Component 형식으로 묶을 수 있도록 기능을 제공 

현재 ESP-IDF 의 Stable Version: 4.2.1

  • ESP32 HW 전체구조(Block Diagram)
ESP32의 HW 전체 구조로 Core를 보면 Dual-Core 혹은 Single Core로 설정에 따라 동작가능하며, SRAM을 보면, 두가지로 나뉘어진다.
  1. Core-SRAM
  2. RTC-Memory(Recovery)
상위구조는 분리되어있는 것은 Power Management의 Deep Sleep 기능인 ULP/RTC로 전환될 경우 Core는 Off되므로 이를 저장할 공간이 필요해서이다.


Xtensa LX6 Core가 두개 각각 존재하지만 별도의 ULP(Ultra-low-Power) 즉 Co-processor가 존재하는데, DeepSleep으로 될 경우 사용되어지는데,
동작방식이 ARM과는 다르게 동작이 되어진다. 

ULP는 Core와 다르게 별도의 Co-Processor로 Core와 호환이 되지 않는다. 그리고 더불어 Power Management의 종류에 따라 
실행되는 단계가 나뉘어져 있어 관련부분은 Datasheet를 참조하다. 
세부내용 DeepSleep

  • ESP32 Core 종류
ESP32-xx Famliy로 분류가 되지만, 각 Core가 다르므로 주의하며, 현재 Dual Core로 구성되어있지만, Single Core으로만도 동작가능하다.
  1. ESP32: Tensilica 의 Xtensa LX6 
  2. ESP32-S2/S3: Tensilica 의 Xtensa LX7
  3. ESP32-C3/C6: RISC-V

세부설명 및 그림출처

ESP32 IC 정보와 ESP32 Module 정보

1.1 ESP32 EVM 및 HW 정보 



ESP32 Board Block Diagram 과 Pin Description  



1.2 ESP32/ESP8266 개발환경구성 

개발에서 사용되어지는 IDE로는 Ecplise 와 VSCode를 이용하면 될 것 이며, Window/Linux/MacOS를 전부 지원한다. 
세부설치 방법은 아래 링크 참조 

ESP32 Get Started Manual 

ESP8266 Get Started Manual 
이전과 구조가다르며, 이부분 추후에 다시 보도록하자 

ESP-IDF Source Download 


1.3  VS Code 설치 후 ESP-IDF 설치 

Window/Linux에서 둘다 진행가능하며, VS Code 의 Extension 에서 쉽게 개발환경을 찾아  구축가능하다. 

현재 CMake 와 Python 관련부분은 필요하다고 해서 별도로 설치 

  • 설치후 확인 사항 
F1 Key를 눌러 ESP-IDF를 선택하면 제공해주는 기능들이 나오며, 이 기능을 이용하여 쉽게 사용가능하다. 

ESP-IDF: Show Examples Project:  ESP32에서 제공해주는 Example들을 테스트 가능 
ESP-IDF: Build, Flash and start a monitor on your device :  Project를 Build Flash 후 확인

  • 설치 후 확인기능 
좌측 eFUSE Explorer :  ESP32의 Firmware 관련정보 MAC 정보 및 Firmware 정보 
ESP-IDF Examples: 상위에서  Show Examples를 이용하여 각 Example를 생성 


주의사항 
ESP-IDF Monitor (Serial) 가 동작되면, 상위 eFUSE는 사용하지 못함
eFUSE를 사용하고자 하면, ESP-IDF Monitor를 Kill로 죽이고 사용해야함 


1.4 OpenOCD 기능지원

기본동작방식 Serial로 연결되어있으며, 이 Serial은 OpenOCD를 이용하여 JTAG으로 이용가능하다. 
그래서 Serial 로 사용할지 JTAG으로 사용할지는 각 설정에 판단에서 사용해야한다. 


2. ESP-IDF API 관련정보 




2.1 ESP32 의 각 기능링크 

  • ESP32 Partition 
ESP32에서는 기본적으로 Partition Table이 존재하며, OTA를 진행한다면, 본인이 별도로 변경해서 설정하며, 관련예제도 존재

  • ESP32에 Flash를 할 경우 반드시 Bootloader 필수
build 내부에 flash_args 참조하면 전체구조를 파악가능하며, bootloader 이외 partition table 정보와 OTA관련된 정보가 필요함
세부적으로 분석하고자 하면 flash_args 파일분석 


  • ESP32 의 Error관련사항 정리
ARM이 아니므로, 관련 Exception 부터 관련 내용들을 자세히 보도록하자.

Guru Meditation Errors
CPU의 Exception을 말하며, Guru Meditation Errors와 함께 발생

Other Fatal Errors
Battery 문제라든지, Heap 문제라든지 상위 문제말고 다른 에러들 



  • ESP32 DeepSleep
Power Mode는 아래와 같이 구성이되어지는데, DeepSleep들어가면, ULP 사용 or ULP 미사용형식으로 동작한다.
세부적으로 RTC Timer + RTC Memory로만으로도 동작가능

ESP32 DeepSleep Manual 과 관련소스

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf


  • ESP32 SRAM의 구조 

SRAM영역이 두개로 나누어져 있으며, 이는 Deep Sleep때문에 분할했으며, ARM으로 치면, TCM과 비슷할 것 같다.




  • RTC SRAM 의 Linker Script 와 Attribute 예제
  1. RTC_RODATA_ATTR
  2. RTC_DATA_ATTR
  3. RTC_FAST_ATTR 
  4. RTC_NOINIT_ATTR
  5. RTC_SLOW_ATTR

  • ESP32 의 Linker Script 
MCU에서 Linker Script는 중요하며, 사용법은 GCC와 거의 동일하므로, 아래 링크 참조

  • ESP32 개발환경 기반으로 Component 추가 개발 

ESP32 Build 방법 Manual

ESP32 Component 사용방법

ESP32 Component 추가 방법

ESP32 Component 추가 및 그외부분 결합예제

  • Bluetooth Provisioning

  • Bluetooth Client Server

  • Bluetooth Basic Article 

  • ESP32 12bit ADC 지원 (SAR ADC로 지원)
SAR ADC 동작원리


SAR 12bit ADC Noise 문제비교 
  1. No Capacitor:  가장 많은 Noise를 보이며, Sample 수가 200 즈음 왔을 때 안정적
  2. With Capacitor (0.1uF): 산발적인 Noise는 없으나 오차가 심함
  3. With Capacitor (0.1uF) and MulitiSampling:  Sample수가 60이상일 경우기준으로 보면 안정적 


ADC Calibration API를 제공 (각 Chip마다 각 ADC마다 차이)
  1. Y: 12bit 이므로 4096 값
  2. X: mV 값 
각 ADC Vref가 비교해보면, 아래와 같이 차이가 조금씩 발생하는데,이값을 eFUSE 에서 제공되는 값기반으로 API를 이용하여 보정가능 (default 1100mv)
아래의 그림을 보면, 각 Chip or 각 ADC 사이의 두개의 ADC Vref 가 차이가 생기는 곳이 1000mv~1200mv이며, 아래의 값처럼 다르며, 
그래서 기본값은 1100mV로 되어있는 것으로 보인다.
 
ADC의 Range는 attenuation 의 값에 조절되며, Range가 넓어질 수록 정확도는 떨어진다. 




ESP32의 ADC2 Limitation
ADC의 경우 ADC1 과 ADC2로 나뉘어지는 것으로 보이며, ADC2 사용할 경우 아래반드시 참조



  • ESP32 WIFI MESH


  • ESP32 Tools


2.2 IoT 와 각 Cloud 정보 

  • ESP32 와 각 Cloud 정보


AWS는 현재 FreeRTOS기반으로 각 IoT SW를 구축하고 있지만, 아직 안정적인 버전이 아니며, 개발버전으로 버그들이 많이 존재한다.