레이블이 MCU-ESP32-Env인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MCU-ESP32-Env인 게시물을 표시합니다. 모든 게시물 표시

1/28/2022

Window Python 설치 및 설정 과 PowerShell

1. Window Python 사용 

Window에서 PS(PowerShell) or CMD에서 python치면 매번 , Microsoft Store의 Python 자동으로 실행이되어 제대로 동작이 안되는데, 
이부분을 설정을 아래와 같이 변경해주자.   

솔직히 Window에서는 Python을 잘 사용하고 싶지 않지만, 어쩔 수 없이 사용해야 하므로 아래와 같이 변경을 해주도록하자. 

  • 시작 -> 앱 실행 별칭 관리 (자동설치 메세지 끄기)
앱 실행별칭관리로 검색하면 쉽게 찾음 
앱 설치 관리자(python)-> 끔 변경 


우선 CMD 나 Power Shell 에서 python 을 치면, 설치하라고 자동 Message가 나오는데, 
앱 실행 별칭관리에서 이를 끄자 

만약, Window 용 Python으로 venv 형식으로 관리하고 싶다면, 아래 Mircrosoft 창에서 설치진행 

Window에서 Python입력하면 Microsoft Store 창 열리는이유 


1.1  Window Python 설치방법 및 종류  

상위 Microsoft Store를 통해서 설치를 해도 되며, 아래의 사이트에서 직접 다운받아 설치를 진행해도 상관 없다. 

  • Python Site Download (현재 두가지로 제공)
  1. Embeddable Package :  Window의 기본 PATH에 설정되지 않아 기본적으로 찾지 못함
  2. Installer Package : Window PATH가 설정되어 기본 Python 동작 
상위에서 다시 32bit or 64bit version 나뉘어짐 (기본 64bit)

  • Window Python 전체 설치방법  
상위 사이트의 2개 와 이외에도 Window 10/11의 Microsoft Store도 설치가능하며, Window 경우는 Python 설치가 좀 복잡하다. 
  1. Embeddable Package : Portable로 아무 위치에 설치하여 실행가능하지만, PATH는 본인이 설정해야하며 venv 처럼 독자적으로 운영가능   
  2. Installer Package:  Window 의 설치버전으로 Program File 에서 설치되어지며, 독자적으로 각각 사용하고자 하면, venv 이용 
  3. Microsoft Store Package:  Window 에서 제공하는 Microsoft Store 설치버전이며, 상위 Installer Package 와 PATH(주의)가 다르며 MS가 가장권장 
  4. 이외 기타 방법: nuget.exe 설치방법, cywin기반 설치, WSL ubuntu 설치 등 생략! 

Window에서 Python 사용하기 

Microsoft Store에서 제공하는 Python도 존재확인  

Nuget 설치방법 


1.2 Embeddable Package for Window

Python Embeddable Package는 PATH 설정되어 있지 않아, 항상 Python을 찾지 못하므로  PATH를 설정하거나, 직접 python.exe를 찾아야 한다. 


  • Embeddable Package 압축해제 후 설정
처음 설치할 경우, Installer Package는 pip가 다 있으므로 괜찮지만, Embeddeable Package는 내부에 존재하지 않아 get-pip.py 를 이용하여 아래와 같이 pip를 설치진행 
  1. get-pip  pip 설치 
  2. PATH 설정 
  3. 설정완료 및 사용방법 

설치방법 Manual

A. Embeddable Package (pip 설치방법)
  1. download  get-pip.py
  2. PATH 설정 (옵션)
PS C:\User\jhlee >  cd D:\Tools\python\python-3.9.13-embed-amd64

PS D:\Tools\python\python-3.9.13-embed-amd64> ./python ./get-pip.py  //인터넷으로 download 후 저장한 후 (https://bootstrap.pypa.io/get-pip.py)
문제가 발생할 경우, 아래와 같이 임시적으로 PATH추가 (pip 못찾음)
//아래 둘중 하나 PATH 설정 앞으로 넣던가 or 뒤로 넣던가, 처음 한번만 아래에서 파일추가하고, 아래에서 파일에 추가
PS D:\Tools\python\python-3.9.13-embed-amd64> $Env:Path += ";D:\Tools\python\python-3.9.13-embed-amd64\Scripts"
or
PS D:\Tools\python\python-3.9.13-embed-amd64> $Env:Path = "D:\Tools\python\python-3.9.13-embed-amd64\Scripts;$Env:Path"

상위 설정한 후에 pip 설치되어진 것을 Scripts에서 확인가능하며, python.exe가 pip 찾도록 PATH를 수정해준다.  


B. python39._pth 파일에 PATH 추가 (Scripts/Lib/Lib\site-packages)

D:\Tools\python\python-3.9.13-embed-amd64\python39._pth 파일 수정

Embededable Python이 실행 될 경우,
아래와 같이 PATH추가하면, pip 설치된 package를 이곳에서 찾으며 아래와 같이 절대 PATH
python39.zip
.
D:\Tools\python\python-3.9.13-embed-amd64\Scripts
D:\Tools\python\python-3.9.13-embed-amd64\Lib
D:\Tools\python\python-3.9.13-embed-amd64\Lib\site-packages

# Uncomment to run site.main() automatically
#import site


  1. Lib/site-packages : Python Module들이 설치되어지는 장소
    1. pip 기반으로 설치하면 이 곳에 설치되어짐 
    2. pip list 와 이름을 비교하여 찾으면 됨 
  2. Scripts: 보통 Python Module or Package를 설치 할 경우, 실행되는 파일 
    1. venv 의 activate도 이곳에 존재 
    2. pip 이곳에 존재 
    3. 이외 package 추가할 때마다 실행파일도 추가되어짐 

참고자료 및 Data 



C. Embeddable Package 사용방법 

상위와 같이 설정 후 pip 기반으로 이외의 Python package 설치진행
사용방법은 PATH에 설정이 안되어있기에, PATH를 설정하고 사용하거나, 직접 절대 PATH로 이용하자.  

  • 사용방법-A  PATH 설정 후 사용 (python.exe 찾기위해서)
Embeddable Package를 설치를 하면 항상 PATH 설정을 해야 하므로, bat or ps1으로 만들어두도록하자. 
귀찮다면 아예 Window에서 시스템설정에서 변경을 해도 될 것 같은데, 이 부분은 나는 하고싶지가 않다. 
PS D:\Tools> $Env:Path += ";D:\Tools\python\python-3.9.13-embed-amd64  //아래와 같이 python 찾기 위해 PATH추가 
PS D:\Tools> $Env:Path += ";D:\Tools\python\python-3.9.13-embed-amd64\Scripts  //아래와 같이 pip 찾기 위해 PATH추가 
or 
PS D:\Tools> $Env:Path = "D:\Tools\python\python-3.9.13-embed-amd64;$Env:Path"
PS D:\Tools> $Env:Path = "D:\Tools\python\python-3.9.13-embed-amd64\Scripts;$Env:Path"
상위 두개의 차이는 PATH의 위치 맨 뒤 or 맨 앞으로 간다. 

  • 사용방법-B python.exe 직접사용 
상위 PATH 설정 필요 없이 python.exe를 찾을 경우, pip의 는 아래와 같이 사용. 

PS D:\Tools> D:\Tools\python\python-3.9.13-embed-amd64\python.exe -m pip list
PS D:\Tools> D:\Tools\python\python-3.9.13-embed-amd64\python.exe -m pip install package 


단점이있는데, Window용이라서 제한적이라서 tk or tkinter의 경우는 Embeddable Package으로는 안되는 것 같다. 
GUI를 사용할거면, Installer Package or Microsoft Sotre Package 을 사용하시길 

Embeddeable 할 경우, Window Python의 tk/tkinter 문제 


1.3 Installer Package for Window

Python Installer Package는 PATH 설정 자동설정되므로, Powershell을 실행할 경우, pip 와 python을 자동으로 찾는다. 
그러므로, 가급적 virtualenv 즉, venv 기반으로 독자적으로 구축해서 사용하자  

  • 설치방법
  1. Add Python xx to PATH 선택 (PATH 추가)
  2. Optional Features 
  3. pip/Document/ 기타 GUI? 

  • 설치사항 확인  
설치전에 기존에 설치되어있는지 확인하자 
설정->앱->설치된 앱 

  • 삭제방법  
설정->앱->설치된 앱  (제거)


가능하다면 python -m venv py310_venv  이런식으로 virtualenv기반으로 사용하자 

다만 주의 해야 할 것이 Python을 여러개 설치할 경우, PATH에 다 Python이 들어가므로, 좀 복잡해지며, 
PATH를 나중에 직접 Control 할 경우도발생한다. 

  • Installer Version PATH 
일반적으로 상위 Installer로 설치했을 경우, PATH이며 이를 알아두도록하자.
C:\Users\jhlee\AppData\Local\Programs\Python\Python38\python.exe


1.4 Microsoft Store Package for Window 

Microsoft가 가장권하는 방식이며, 지금 좀 별로일지 몰라도, 나중에 점차 Power Shell 처럼 괜찮을 것 같음( Power Shell 지금도 수시로 변경됨) 
Microsoft Store 안에도 Python을 제공하며, 자동으로  PATH 설정이 되어진다.  
주의해야 할 것은 , 상위 Installer Package 중 둘 중 하나만 설치하자. 
더불어, 역시 가급적 virtualenv 즉, venv 기반으로 독자적으로 구축해서 사용하자  

Microsoft Windows Python 개발환경설정 

  • 설치방법(Microsoft에서 권장)
기본적으로 Microsoft가 권하는 방식이므로, Powershell에서 python 치면, 나온다.
기타 설정방법 

  • 시작-> 앱실행 별칭관리 (상위참조)
python.exe 끔 변경했다면, Power Shell에서 python.exe는 볼수가 없으므로, 이를 원상복귀하자.  
이 설치와 설정과 같이 움직이므로 이 부분 다시확인  

  • 설치사항 확인 
검색 -> Microsoft Sotre -> python 검색 
현재설치되어짐 반드시 확인 
or 
설정->앱->설치된 앱 

  • PowerShell 설치확인 및 위치확인 (상위 Install Package도 동일)
설치 후 아래 gcm command로 이용하여 설치된 위치 파악 
PS C:\User\jhlee> gcm python // Linux 의 which command와 거의 동일 
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     python.exe                                         0.0.0.0    C:\Users\jhlee\AppData\Local\Microsoft\WindowsApps\python.exe
PS C:\User\jhlee> gcm pip

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     pip.exe                                            0.0.0.0    C:\Users\jhlee\AppData\Local\Microsoft\WindowsApps\pip.exe 

  • PowerShell 에서 venv이용 
virtualenv기반으로 사용하도록 하며, 이 기반으로 설정진행하여 사용하자 
PS C:\User\jhlee\test> pip install virtualenv   // virtualevn 설치하여 venv 사용   

PS C:\User\jhlee\test> python -m venv ../tool_py310_env     // venv 설정 진행 (이름은 목적에 맞게기억하기쉽도록)  

PS C:\User\jhlee\test> ..\tool_py310_env\Scripts\Activate.ps1     // venv 활성화   

(tool_py310_env) PS C:\User\jhlee\test>  pip list     // venv기반으로 이용 및 pip 설치확인 (tkinter 기본제공)   

(tool_py310_env) PS C:\User\jhlee\test>  pip install -r requirement     // venv기반으로 pip 설치    

기본으로 Python Module을 lib/site-packages 에서 찾기 때문에 이 곳에 없으면 확장을 해주자. 

venv 사용법 

  • 삭제방법  
설정->앱->설치된 앱  (제거)


  • Microsoft Store Version PATH 
Python in Microsoft Store (상위 Installer Package PATH가 다름)
C:\Users\jhlee\AppData\Local\Microsoft\WindowsApps\python3.10.exe


1.5 Window 의 PATH 우선순위 변경  

Python 종류가 여러개 설치되어 있다면, PATH 설정변경하여, 실행되는 Python 우선순위를 변경하자 
너무 복잡하면, 가급적 지우는게 마음이 편하다. 
나의 경우, 가급적 PATH에 추가하는 것 보다, 별도의 PATH 설정 Script를 만들어서 이를 확장해서 사용하는 것이 편하다. 

  • Window PATH 길이제한


  • PYTHONPATH
실행중인 동안 sys.path 변수를 사용하여, 이 디렉토리에서 검색되어 모듈을 가져온다고 한다.
각 설치방식마다 조금씩 다르므로 주의 
PS C:\User\jhlee\test> python   // Python 실행 점검   
....
>>>  import sys
>>>  print (sys.path)
 // Python 실행해서 PATH확인, 보통 lib/site-packages 에 기본연결   
>>> import tkinter
>>>  tkinter._test()
 // Python tkinter 동작확인   

  • Window의 PowerShell의 Path 설정법  
Powershell에서 cd 혹은 tree 비롯하여 Linux에서 사용하는 command들이 되므로 각각 다 테스트를 해보도록 하자. 

PS C:\User\jhlee> gcm python   // Linux 의 which command와 거의 동일한 것 같다. 
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     python.exe                                         3.8.101... C:\Users\jhlee\AppData\Local\Programs\...


PS C:\Users\jhlee> $Env:userprofile   //Window Userprofile 환경변수 (CMD으 경우 %userprofile%)
C:\Users\jhlee

PS C:\Users\jhlee> $env:Path  // 현재 본인의 PATH를 확인 (CMD의 경우 %PATH% 이용 )
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\PuTTY\;C:\Users\jhlee\AppData\Local\Programs\Python\Python38\Scripts\;C:\Users\jhlee\AppData\Local\Programs\Python\Python38\;C:\Users\jhlee\AppData\Local\Microsoft\WindowsApps;;C:\Users\jhlee\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\Bandizip\;C:\Program Files\LLVM\bin

아래와 같이 Embeddable 도 같이 추가 
PS C:\Users\jhlee> $Env:Path += ";D:\Tools\python\python-3.9.13-embed-amd64"  // PATH의 뒤에다 추가 (python 중복될 경우, 뒤에 추가했으므로, 우선순위가 낮다)

PS C:\Users\jhlee> $Env:Path = "D:\Tools\python\python-3.9.13-embed-amd64;$Env:Path" // PATH의 앞에다 추가 (python 중복될 경우, 뒤에 추가했으므로, 우선순위가 높다)

PS C:\Users\jhlee> $newtemp += "D:\Tools;"   // Linux 처럼 Shell 변수사용 
PS C:\Users\jhlee> echo $newtemp
F:\Tools;
PS C:\Users\jhlee> Set-Item -Path Env:Path -Value ( $newtemp + $Env:Path ) // PATH의 앞에다 추가 


  • Installer Version 과 Microsoft Sotre Version  PATH가 꼬이는 경우 
상위설명 했듯이 두개의 Version은 PATH가 다르며, 가급적 한개를 선택해서 사용하자 
나의 경우, 기존에 설치된 Python을 지워서 해결했으나, 두개를 다 사용해야 하는 경우 발생한다면, PATH로 조절을 하자. 



2. ESP32의 CMD 와 PowerShell 설정 

ESP32의 경우 기본이 Python venv 기반으로 설치되어 있어, 이를 활성화 하려면, activate를 해줘야한다.  
ESP-IDF를 설치했다면, 이 관련된 위치에서 아래와 같이 export를 이용하여 ESP-IDF 설정가능하다. 

  • ESP-IDF 설정
  1. venv activate 
  2. export 개발환경 

  • ESP-IDF CMD로 실행할 경우
  1. ESP32 Python 의 venv를 activate    (ESP-IDF 관련 Python venv로 설치되어짐)
  2. ESP-IDF export 진행 
%userprofile%\.espressif\python_env\idf4.2_py3.8_env\Scripts\activate.bat  
%userprofile%\esp\esp-idf\export.bat 

  • ESP-IDF Powershell 실행할 경우   
동일하지만, 상위보다 기능이 부족하게 지원이 되므로, 가급적 CMD로 사용추천 
$Env:userprofile\.espressif\python_env\idf4.2_py3.8_env\Scripts\activate.ps1
$Env:userprofile\esp\esp-idf\export.ps1

  • ESP-IDF PowerShell 실행확인 
C:\Users\jhlee\.espressif\python_env\idf4.2_py3.8_env\Scripts\activate.ps1  //venv enable
or 
$Env:userprofile\.espressif\python_env\idf4.2_py3.8_env\Scripts\activate.ps1 //venv enable 이지만 tab을 한번 눌러주면 상위로 변경
(idf4.2_py3.8_env) PS C:\Users\jhlee>
(idf4.2_py3.8_env) PS C:\Users\jhlee> C:\Users\jhlee\esp\esp-idf\export.ps1   //ESP-IDF 환경 
or 
(idf4.2_py3.8_env) PS C:\Users\jhlee> $Env:userprofile\esp\esp-idf\export.ps1  //ESP-IDF 환경, tab을 한번 눌러주면 상위로 변경 

esp에서는 idf.py/esptool.py 이외 다양한 기능을 제공하는데, CMD/PowerShell에서 차이가 좀 있다. 


2.1  ESP32 PowerShell 설정 변경방법  

본인이 직접 PowerShell 환경을 좀 더 개선하고 싶다면, 아래와 같이 해보도록하자. 

  • ESP32 의 관련설정 문제사항 
venv activate만 진행하면 path는 아래가 맨 앞으로만 추가되며 python만 지원되며 
ESP32의 전체개발환경에서 필요한 것을 모두 지원해주지 못한다.

   C:\Users\jhlee\.espressif\python_env\idf4.2_py3.8_env/Scripts;


  • ESP32의 PowerShell export.ps1 확인  
esp32 개발환경에서 별도로 export 전용 shell이 제공하며 이를 이용하면 쉽게 환경설정가능 
PS C:\xxx >  cat C:\Users\jhlee\esp\esp-idf\export.ps1
Added to PATH
-------------
C:\Users\jhlee\esp\esp-idf\components\esptool_py\esptool
C:\Users\jhlee\esp\esp-idf\components\app_update
C:\Users\jhlee\esp\esp-idf\components\espcoredump
C:\Users\jhlee\esp\esp-idf\components\partition_table
C:\Users\jhlee\.espressif\tools\xtensa-esp32-elf\esp-2020r3-8.4.0\xtensa-esp32-elf\bin
C:\Users\jhlee\.espressif\tools\xtensa-esp32s2-elf\esp-2020r3-8.4.0\xtensa-esp32s2-elf\bin
C:\Users\jhlee\.espressif\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin
C:\Users\jhlee\.espressif\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin
C:\Users\jhlee\.espressif\tools\cmake\3.16.4\bin
C:\Users\jhlee\.espressif\tools\openocd-esp32\v0.10.0-esp32-20200709\openocd-esp32\bin
C:\Users\jhlee\.espressif\tools\ninja\1.10.0\
C:\Users\jhlee\.espressif\tools\idf-exe\1.0.1\
C:\Users\jhlee\.espressif\tools\ccache\3.7\
C:\Users\jhlee\.espressif\tools\dfu-util\0.9\dfu-util-0.9-win64
C:\Users\jhlee\.espressif\python_env\idf4.2_py3.8_env\Scripts
C:\Users\jhlee\esp\esp-idf\tools
%PATH%
Checking if Python packages are up to date...
Python requirements from C:\Users\jhlee\esp\esp-idf\requirements.txt are satisfied.

Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
    idf.py build

  • Python export.ps1 대신 직접추가방식변경  
상위 export.ps1의 대신 직접 필요한 부분을 넣어주는 방식으로 변경 
추후 Powershell에서 변경할 일이 있다면 이 방식으로 하도록하자   
$newtemp = "$Env:userprofile\esp\esp-idf\components\esptool_py\esptool;"
$newtemp += "$Env:userprofile\esp\esp-idf\components\app_update;"
$newtemp += "$Env:userprofile\esp\esp-idf\components\espcoredump;"
$newtemp += "$Env:userprofile\esp\esp-idf\components\partition_table;"
$newtemp += "$Env:userprofile\.espressif\tools\xtensa-esp32-elf\esp-2020r3-8.4.0\xtensa-esp32-elf\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\xtensa-esp32s2-elf\esp-2020r3-8.4.0\xtensa-esp32s2-elf\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\cmake\3.16.4\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\openocd-esp32\v0.10.0-esp32-20200709\openocd-esp32\bin;"
$newtemp += "$Env:userprofile\.espressif\tools\ninja\1.10.0;"
$newtemp += "$Env:userprofile\.espressif\tools\idf-exe\1.0.1;"
$newtemp += "$Env:userprofile\.espressif\tools\ccache\3.7;"
$newtemp += "$Env:userprofile\.espressif\tools\dfu-util\0.9\dfu-util-0.9-win64;"
$newtemp += "$Env:userprofile\.espressif\python_env\idf4.2_py3.8_env\Scripts;"
$newtemp += "$Env:userprofile\esp\esp-idf\tools;"
$newtemp += "$Env:userprofile\.espressif\tools\idf-git\2.30.1\cmd;"
echo $newtemp
 
Set-Item -Path Env:Path -Value ( $newtemp + $Env:Path )    
$Env:Path

pip 와 python은 상위 venv안에 Scripts에 있으므로 이부분만 PATH 넣으면 되는데, PATH 앞에 넣어야, 
우선적으로 다른 Python 보다 먼저 실행되어진다. 

  • Python Path 설정 


3. PowerShell 의 Linux Command 호환 및 세부설정 

Linux에서 많이 사용되어지는 Command들이 Power Shell에서 이제 제공되어지므로 PowerShell Script에 넣어 작성하자. 
다양한 Command들이 지원가능하며, 파이프를 비롯하여 기초적인것은 동작 되어진다.  
Path로 \ 에서 / 로도 호환 동작 과 tee를 비롯하여, redirection도 지원가능하다. 
주의해야 할 것은 옵션이 다르며, 사용법이 조금씩다르므로 주의하도록하며, 업그레이드 될때마다 이게 조금씩 변경되어진다. (주의) 
설마 이전 버전하고 계속 호환성을 유지하겠지~ 

  • Power Shell 에서 제공하는 Linux Command 의 예 (이외 기타등등)
  1. ls
  2. cat 
  3. tee 
  4. echo ( write-host를 좀 더 권장)
  5. cp
  6. rm 
  7. findstr (grep 대신)
  8. mkdir
  9. cd 
  10. tar 
  11. .... 

  • Pipe 기본사용 및 Tee 사용방법  
  1. ls | findstr README*
  2. cat ./build.bat 
  3. cat ./build.bat | tee log.txt 
  4. tar -cvf  test.tar  test0.txt text1.text

Linux만큼 Pipe 기반으로 tee를 이용하여 잘 동작이 안되어지는 것 같다. 점차 나아지겠지~

  • Window Power Shell Script 사용법
재미있는 것은 MS에서도 PS(Power Shell)을 Linux 의 Shell 처럼 비슷하게 지원해주려고 하고 있다. 
(혹시나 해서 , Linux Command 여러번 사용하는데, 의외로 많이 지원해준다) 

  • PowerShell 의 Terminal 색상조절 
Power Shell에서 아래의 색상조절이 안되어서 다른 곳에서 방법을 찾았다. 
다만 Power Shell에서 echo 명령어로는 아무리 해봐도 색상조절 되지 않는 것 같다. 

PS C:\xxx > write-host "hello world" -foregroundcolor "red" 
hello world
PS C:\xxx > write-host "hello world" -foregroundcolor "yellow"      //-ForegroundColor $fgcolor -BackgroundColor $bgcolor
hello world
PS C:\xxx > $colors = [enum]::GetValues([System.ConsoleColor])    //지원되는 Color 및 색상비교를 해볼수 있어 너무 좋다 (Linux 처럼 소리도 되는 지는 추후)
Foreach ($bgcolor in $colors){
    Foreach ($fgcolor in $colors) { Write-Host "$fgcolor|"  -ForegroundColor $fgcolor -BackgroundColor $bgcolor -NoNewLine }
    Write-Host " on $bgcolor"
}

PowerShell Terminal Color 

Linux Terminal Color 코드는 아래 링크 참조 

  • PowerShell 의 Redirection 정보 
Linux 처럼 Rediection이 가능하지만 조금 정보가 다른 것 같다. (e.g. 1> , 2>>)

  • Power Shell Script Function
Function 기능도 제공하므로 좀 복잡하게 구성하고자 할경우 사용하자 

  • PowerShell 관련 전체 Manual
아래에서 전체 Manual을 한번 보도록 하자 
Cmdlet 이 중요한 것 같은데, 아직 개념을 잘 모르겠으며, 원격기능도 제공해준다. 
나의 경우, Bash와 공통분모를 찾아 관련부분만 넣어 사용하려고 한다. 

9/10/2021

Ecplise CDT 기반의 ESP32 OpenOCD 설정 on Window

1. Ecplise CDT 설치 및 설정 

Ecplise-CDT Oxygen 설치 및 설정 





1.1 Ecplise-CDT 의 ESP-PlugIn 설치 


  • Ecplise CDK 의 ESP PlugIn 설치방법 아래참조 
  1. Java 11 and above : Download and install Java SE from here
  2. Python 3.5 and above : Download and install Python from here
  3. Eclipse IDE for C/C++ Developers 2020-12 and above : Download and install Eclipse CDT package from here
  4. Git : Get the latest git from here
  5. ESP-IDF 4.0 and above : Clone the ESP-IDF repo from here

  • Help > Install New Software > Add
  1. Name: Espressif IDF Plugin for Eclipse
  2. Location: https://dl.espressif.com/dl/idf-eclipse-plugin/updates/latest/



추후 설치시 Keep 말고 Update로 진행 



Manage에서 설치된 것을 확인 



재시작을 해도 상위 Manual 대로 동작되지는 않아서 필수 조건에서 내가 만족을 못시키는가 찾아보았지만, 이상없음 

  • Help -> Ecplise Marketplace 
혹시 몰라서 직접 MaketPlace에서 ESP로 직접 찾아보고 다시 설치진행하는데 두 개의 버전이 있으며 두 개 아래 것으로 다시 재설치 (사실 상위와 동일한 과정임)
왜냐하면, 첫번째 버전은 OpenOCD용으로만 나왔으며, Plugin들이 별로 없음 

  1. 다시 설치진행했으며, 이전에는 Keep했지만, Update로 변경설치 진행 
  


  • 2번째 설치된 후 실행된 모습 
상위에서 안된 이유가 Keep으로 진행해서 안된 것 같으며, 다음에는 Update로 하면 다 될거라고 생각되며, 구지 ESP Manual 처럼 주소 직접 입력할 필요는 없을 것 같다. 
다음에는 그냥 Market에서만 검색해서 설치진행하도록 하자. 



1.2 Ecplise-CDT 의 ESP-PlugIn 환경설정 
 
  • ESP-IDF PlugIn 기본설정 (Espressif -> Downdload and Configure ESP IDF) 
설치진행 후 이미 사용중이 ESP-IDF PATH 설정/Git/ Python (ESP-IDF 내부로 설정) 진행 
  1. ESP-IDF : C:\Users\jhlee\esp\esp-idf
  2. Git:  C:\Program Files\Git\bin\git.exe
  3. Python : C:\Users\jhlee\.espressif\python_env\idf4.2_py3.8_env\Scripts\python.exe


Python은 이미 ESP-IDF에서 venv 형식으로 설치했으므로, VS code 동일하다 


  • Window -> Preference 설정확인 
Git 혹은 ESP-IDF 관련설정들을 확인 

  • Project 생성 후 기본테스트 
  1. File-> New -> Project-> Espressif IDF Project  :  Ecplise Project 생성 

  • ESP Target 설정 
우측 esp32 설정 

ESP32 와 Serial Port 설정 


  • Edit Configuration 확인
좌측 test2 설정 


Build Setting 확인 
이부분이 별도로 존재하지 않는다면 Build가 제대로 진행이 안됨


Main 확인



  • Window -> Show View -> Terminal  
Open a Terminal 진행 

  1. Serial 설정확인 
  2. ESP-IDF Monitor 실행  


  • File -> Properties
CDT Core Builder 설정확인 



  • TEST Program 기본확인 
TEST Program을 만들어서 이제 빌드해보고 화면을 보도록하자.



2. Ecplise CDT  OpenOCD 기반의 GDB 사용  

  • OpenOCD 관련내용
기본 OpenOCD 관련내용

  • VS Code의 OpenOCD 사용 및 설치 
이전에 VS Code에서 쉽게 OpenOCD기반으로 사용 

  • ESP32-Ecplise 환경설정 
Ecplise 기반으로 구성하지만, Visual 적으로 ELF format을 분석하여 Memory상태확인가능



  • ESP사에서 제공하는 JTAG은 FT2232이며, 아래와 같이 사용 
  1. Serial Converter A:  JTAG  (WinUSB 변경)
  2. Serial Converter B:  Serial 

libusb 때문에 발생하는 문제이므로, 이전과 크게 다르지 않으며, Window용으로 변경 
Tool은 본인이 좋아하는 것으로 사용  


VS Code와 별반 다르지 않으므로 크게 어렵지 않다. 

  • Configuration 추가 
OpenOCD를 이용하고자 한다면, Configuratino을 새로 더 생성하여 설정 후 진행
좌측 test2에서 새롭게 Conifguration 추가진행 


Debug 를 ESP-IDF GDB OpenOCD Debugging으로 연결 


  • 설정시  Debugger 관련설정 
  1. GDB/Telnet/TCL 확인: 기본설정값 
  2. OpenOCD 설정파일 확인 : 설정변경방법은 상위 링크 참조 



ELF 파일확인 

Gdb Init Command 및 세부설정 




  • OpenOCD 기반으로 GDB Debug
확실히 사용하기에는 VS Code보다는 Ecplise 기반이 편한 것 같아 보이며, 더 다양한 기능사용가능 
이 부분은 이전 Ecplise 사용부분 참조하시길 


상위와 같이 쉽게 디버깅가능 및 데이타 확인 가능 




8/24/2021

ESP32 OpenOCD 설정 과 VS Code 설정

1. ESP32 OpenOCD 설정 

이전까지 내가 가지고 있던 OpenOCD는 FT2232 기반으로 다른 보드에서 각각 동작되는 것들을 리눅스에서 해왔지만, 
최근 Window 기반으로 이를 해결해야할 것 같아 관련자료들을 정리해본다.

ESP32 OpenOCD 관련내용 과 gdbgui 연결 
바로 이전 ESP32로 구성한 것이며, 반드시 참조 


JTAG과 OpenOCD 이해와 이전 Raspberry Pi 적용사항 (반드시 확인)
A. JTAG의 기본이해 와 OpenOCD관련내용
B. Raspberry PI OpenOCD 관련내용 과 VS Code/ VS Community 연결

OpenOCD User Guide 와 GDB Command
A. OpenOCD User Guide 반드시 확인 
B. OpenOCD에서 처음 gdb 직접연결하여 테스트 할 경우 각 gdb 명령어들 설명 


1.1 ESP Prog Board

기존에 내가 사용하던 FT2232H와 동일하며, 2개 포트를 하나는 Serial 는 다른 하나는 JTAG으로 사용한다.
세부내용은 이전의 FT2232관련 OpenOCD 참조 

https://github.com/espressif/esp-dev-kits/blob/master/docs/_static/esp-prog/block.png




  1. Interface 0 / A: JTAG
  2. interface 1 / B: UART

  • USB Serial Port 설정 
  1. 장치관리자->범용 직렬버스 컨트롤러
  2. USB Serial Converter B 선택 후 속성 
  3. 고급-> VCP 드라이버 설치 


속성에서 고급 과 Power Menagement 탭이 없다면, 다시시작한 후 다시 진행
USB Serial Converter B (Serial)이므로 VCP설정 



  • USB Serial Converter B기반의 Serial Port 설정완료 
  1. 포트-> USB Serial Port (COM6) 확인 후  USB Serial Convert B 연결확인 (Serial 용) 
  2. 포트-> USB Serial Port (COMx) 확인 후  USB Serial Convert A 있을 경우 삭제(JTAG 용)
  3. 포트-> USB Serial Port의 Port를 변경하고자 할 경우 포트설정이용
  4. 장치관리자->보기->숨겨진장치 표시 (설정되어진 Serial 포트 확인가능)
 


FTDI Driver가  반드시 상위 USB Serial Port로 잡혀야하며, 내 두번째 노트북에서는 Serial이 자꾸 Dual RS232 Serial로 잡혀서 동작이 전혀 안됨 
이부분을 아래 Tool 혹은 Driver를 변경하여 해결진행 

  • Window LibUSB 설정 (JTAG 설정)
Download
  1. Download 후 실행
  2. Option->List All Devices 선택 
  3. Dual RS232 HS Interface 0 선택
  4. FTDIBUS -> WinUSB로 변경 


  • USBDriverTool 
상위와 동일한 기능이며, OpenOCD 내부에도 동일한 Tool이 존재 
세부사용은 상위 Raspberry PI OpenOCD 관련내용 과 VS Code/ VS Community 연결 참조
이게 더 편한 것 같음 


1.2 ESP32 OpenOCD 설정 

상위 ESP-IDF를 설치를 진행했다면, esp tool 내에 openocd도 함께 들어있으며, VS Code에서도 쉽게 OpenOCD를 Start/Stop를 진행가능하다.

  1. View->Command Palette 실행 
  2. 창에서 ESP 치면 ESP 관련 Command들이 나오며 그중 OpenOCD 선택
  3. View->Output 선택 후 Output의 우측 메뉴에 "OpenOCD" 현재상태 확인가능   

하지만 나의 경우는 OpenOCD의 세부설정을 위해서 별도로 bat 파일을 만들어서 동작하도록 별도로 또 구성하였다. 


  • esp_openocd.bat
아래와 같이 별도의 TCL script 별도설정을 해주어 동작하며, 아래의 appimage_offset은 본인의 Partition Table에서 참고 
TITLE OpenOCD for ESP32 Prog 
rem Author: Jeonghun Lee
rem TEST OpenOCD
set SCR_PATH=%userprofile%\.espressif\tools\openocd-esp32\v0.10.0-esp32-20200709\openocd-esp32\share\openocd\scripts
set BIN_PATH=%userprofile%\.espressif\tools\openocd-esp32\v0.10.0-esp32-20200709\openocd-esp32\bin
set SET_ESP32_FLASH="init; halt; esp appimage_offset 0x50000"
set SET_ESP32_OS="set ESP32_RTOS \"FreeRTOS\" "
%BIN_PATH%\openocd.exe  -f  %SCR_PATH%\board\esp32-wrover-kit-3.3v.cfg -c %SET_ESP32_FLASH% -c %SET_ESP32_OS%

ESP32 OpenOCD의 관련설정 내용

  • SET_ESP32_FLASH 설정
esp32에서 내부 partition을 사용하고 있다면, 별도의 실행할 offset을 넣어 상위와 같이 설정 
재미있는것은 SPI ROM인데, profile 해보면 이 영역이 NOR Flash처럼 XIP(Execute In Place)도 되는 것으로 나온다. 
SW영역에서 그렇게 표시되어있는데, 이부분은 ESP 내부 Flash만 되는지 외부 Flash도 지원가능한지 반드시 추후에 확인 

현재 MTDI의 설정에 따라 내부 LDO로  FLASH 전원 3.3 or 1.8로 변경되며 관련설정은 별도가능 (ESP32_FLASH_VOLTAGE 값 참조)

ESP32 전용 내부변수들( 이를 이해하려면 아래내용들을 분석하면 쉽게이해)
상위 SET_ESP32_OS 에 설정을 별도로 했으며, 관련내용들 


1.3 ESP32 OpenOCD Configuration 분석 

상위에서 사용하는 esp32-wrover-kit-3.3v.cfg 을 세부적으로 분석 및 수정방법 

  • board/esp32-wrover-kit-3.3v.cfg
Main을 보면 다시 2개를 참조하며, ESP32_FLASH_VOLTAGE를 설정하고 구성됨
# Example OpenOCD configuration file for ESP32-WROVER-KIT board.
#
# For example, OpenOCD can be started for ESP32 debugging on
#
#   openocd -f board/esp32-wrover-kit-3.3v.cfg
#

# Source the JTAG interface configuration file
source [find interface/ftdi/esp32_devkitj_v1.cfg]
set ESP32_FLASH_VOLTAGE 3.3


# Source the ESP32 configuration file
source [find target/esp32.cfg]

  • interface/ftdi/esp32_devkitj_v1.cfg
ESP32 Prog Board의 설정 구성이며, FT2232 설정과 유사하며 이는 FTDI 사용법을 알면 쉽게 설정도 변경가능하다.
#
# 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 1 is the uart
ftdi_channel 0

# TCK, TDI, TDO, TMS: ADBUS0-3
# 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

# ESP32 series chips do not have a TRST input, and the SRST line is connected
# to the EN pin. 
# The target code doesn't handle SRST reset properly yet, so this is
# commented out:
# ftdi_layout_signal nSRST -oe 0x0020

reset_config none

# The speed of the JTAG interface, in KHz. If you get DSR/DIR errors (and they
# do not relate to OpenOCD trying to read from a memory range without physical
# memory being present there), you can try lowering this.
#
# On DevKit-J, this can go as high as 20MHz if CPU frequency is 80MHz, or 26MHz
# if CPU frequency is 160MHz or 240MHz.
adapter_khz 20000

ESP32 JTAG Speed
JTAG을 연결하면 간혹 DSR/DIR Error가 발생하는데, 이는 OpenOCD와 관련이 없다고 한다.
처음 이 문제를 JTAG Speed 문제, 즉 JTAG의 속도가 너무 부족하여 동작안되는 줄 알았는데, 알아보니 아니다.
JTAG의 속도는 20Mhz or 26Mhz 설정이며,  존재하지 않은 Memory 영역을 접근했을때 문제가 발생하는 것이라고 한다.  

  • target/esp32.cfg
ESP32의 전반적인 설정이며, TAP으로 얻는 정보들을 확인 및 관련부분 설정과정이며 이전 OpenOCD를 보면 쉽게 이해가능하다.(esp_common 생략)
# The ESP32 only supports JTAG.
transport select jtag

# Source the ESP common configuration file
source [find target/esp_common.cfg]

if { [info exists CHIPNAME] } {
	set _CHIPNAME $CHIPNAME
} else {
	set _CHIPNAME esp32
}

if { [info exists CPUTAPID] } {
	set _CPUTAPID $CPUTAPID
} else {
	set _CPUTAPID 0x120034e5
}

if { [info exists ESP32_ONLYCPU] } {
	set _ONLYCPU $ESP32_ONLYCPU
} else {
	set _ONLYCPU 3
}

if { [info exists ESP32_FLASH_VOLTAGE] } {
	set _FLASH_VOLTAGE $ESP32_FLASH_VOLTAGE
} else {
	set _FLASH_VOLTAGE 3.3
}

set _TARGETNAME $_CHIPNAME
set _CPU0NAME cpu0
set _CPU1NAME cpu1
set _TAPNAME $_CHIPNAME.$_CPU0NAME

jtag newtap $_CHIPNAME $_CPU0NAME -irlen 5 -expected-id $_CPUTAPID
if { $_ONLYCPU != 1 } {
	jtag newtap $_CHIPNAME $_CPU1NAME -irlen 5 -expected-id $_CPUTAPID
} else {
	jtag newtap $_CHIPNAME $_CPU1NAME -irlen 5 -disable -expected-id $_CPUTAPID
}

if { $_RTOS == "none" } {
	target create $_TARGETNAME esp32 -endian little -chain-position $_TAPNAME
} else {
	target create $_TARGETNAME esp32 -endian little -chain-position $_TAPNAME -rtos $_RTOS
}

configure_esp_workarea $_TARGETNAME 0x40090000 0x3400 0x3FFC0000 0x6000
configure_esp_flash_bank $_TARGETNAME $_TARGETNAME $_FLASH_SIZE

esp32 flashbootstrap $_FLASH_VOLTAGE
xtensa maskisr on
if { $_SEMIHOST_BASEDIR != "" } {
	esp semihost_basedir $_SEMIHOST_BASEDIR
}
if { $_FLASH_SIZE == 0 } {
	gdb_breakpoint_override hard
}

# special function to program ESP32, it differs from the original 'program' that
# it verifies written image by reading flash directly, instead of reading memory mapped flash regions
proc program_esp32 {filename args} {
	program_esp $filename $args
}

add_help_text program_esp32 "write an image to flash, address is only required for binary images. verify, reset, exit are optional"
add_usage_text program_esp32 "<filename> \[address\] \[verify\] \[reset\] \[exit\]"

1.4 OpenOCD 와 SDKCONFIG 설정 

ESP32의 경우 Linux Kernel 처럼 Kconfig 기반으로 menuconfig로 설정가능하며 이때 나오는 결과 설정값이 sdkconfig 이며, 이를 쉽게 변경가능하다. 
VS Code의 경우 GUI로 멋지게 제공을 해주고 있으므로 쉽게 설정가능하다. 

  • OpenOCD사용시 SDKCONFIG 설정변경값
기본적으로 OpenOCD기반으로 Debugger로 이용시 설정해야하는 설정들 
  1. CONFIG_ESP_DEBUG_OCDAWARE 
  2. CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
  https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/tips-and-quirks.html#support-options-for-openocd-at-compile-time


HEAP TRACE와 APP TRACE는 ESP-IDF Extension에서 세부사항을 확인가능 

  • APP TRACE 관련예제
이전에 간단하게 App Trace 테스트 구동 했으며, Heap trace는 추후 테스트 진행

  • HEAP_TRACE 기능제공 (SDKCONFIG 설정변경)
heap tracing 방법은 2가지로 제공해주고 있으며, 각각 sdkconfig 설정기반으로 본인이 선택

  • APP_TRACE  기능제공 (SDKCONFIG 설정변경)
두 개의 Trace가 다 Trace Log기반으로 동작이 되므로 관련부분은 상위 메뉴얼 참조 
APP TRACE의 경우 세부분석은 SYSTEM VIEW가 별도로 필요 (아직사용못해봄) 



2. VS Code 내부 설정 


  • VS Code Setup Manual 
ESP-IDF 설치 방법 (내부에 Git/Python을 비롯하여 전부 포함되어있음)


2.1 VS Code의 MS-CPPTool 기반설정  

상위에서 이미 CPPTool은 이미 설치가 되어있고, 아래와 같이 Run and Debug에서 launch.json만 설정해주면 된다.
OpenOCD와 동작은되는데, 이상하게 Breakpoint가 동작이 안되며, Exception이 발생하여 진행하기 힘들다.
예제프로그램으로 하면 괜찮을 것 같은데, 아직 해보지는 않음 


  • launch.json 설정 
launch.json 생성 후 자동으로 c_cpp_properties.json 자동생성 이게 다시 build/compile_commands.json 관리 
  {
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ESP32 Debugger",             //launch.json 의 Name 
            "type": "cppdbg",                      //cppdbg 기반으로 작동  
            "request": "launch",
            
             //만약 인식을 못한다면, \\build\\xxxx.elf" 변경을 해보도록 하자 Window에서 매번 PATH문제 발생 
            "program": "${workspaceRoot}/build/xxxxx.elf",

            "miDebuggerServerAddress": "localhost:3333",    // GDB:3333/ TCL:6666/ Telnet:4444 (OpenOCD 참조) 
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/Users/jhlee/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gdb.exe",
            
            "setupCommands": [
                {
                     //gdbinit 정보를 넣으려고 했는데, 동작이 제대로 안됨 
                    "description": "gdb에 자동 서식 지정 사용",
                    "text": "symbol-file d:\\project\\mod\\mod610_sw\\build\\xxxxx.elf",
                    "ignoreFailures": true
                }
            ]

        }
    ]
}  

  • 상위 설정기반으로 진행방법 
  1. OpenOCD Start  (상위 batch 파일참조)
  2. VS Code의 Run and Debug->launch.json 설정 (상위참조)
  3. Run and Debug에서 Debug 실행진행 




  • OpenOCD Server 확인 
  1. port 4444 for Telnet communication
  2. port 6666 for TCL communication 
  3. port 3333 for gdb

2.2 ESP-IDF Debug Adapter 기반설정 (이방법 추천) 

View->Output -> ESP-IDF Debug Adapter가 존재하며, 이를 Run and Debug에 연결을하여 launch.json을 생성한다. 
이를 생성을 하게되면, 자동으로 task.json 과 setting.json이 생성이 되어진다. 
이는 예전에 Linux에서 동작하는 것으로 관련설정과 task.json을 쉽게 볼수 있다. 

상위에 내가 별도로 만든 OpenOCD batch 파일 설정도 필요가 없으며, 내부설정해서 모두 해결하면된다.

실행을 해보면 처음 breakpoint는 한번은 동작은하는데, 다음부터 exception 때문에 잘 동작이 되지 않는다. 
이전에 Linux에서도 사용했는데, 그때는 gdbgui로 집중해서 사용했던것 같다. 
 

  • lauch.json 생성
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "espidf",         //espidf 기반으로 작동 (VS Code ESP IDF를 이미 설치)  
      "name": "Launch-name", 
      "request": "launch",
       "gdbinitFile":"${workspaceFolder}/gdbinit",   
    }
  ]
}
  • gdbinit 생성
 //gdbinit 생성 후 elf에서 symbol을 찾도록 연결 
target remote :3333
set remote hardware-watchpoint-limit 2           //ESP32가 2 까지만,   
symbol-file ./build/xxxxx.elf                    //반드시 Symbol Table 연결 
mon reset halt
flushregs
thb app_main
c
  • launch.json 생성 및 관련설정 
상위설정은 기본으로 auto이며, 이외  별도로 세부설정가능 아래 링크참조 

  • 기본동작 및 확인 
본인의 Thread 갯수가 맞는 지 부터 확인 (elf 심볼테이블 매치)



아래사항들 확인 각 로그확인 
  1. View->OUTPUT ESP-IDF Debug adapter 선택 로그확인 
  2. View->OUTPUT 의 OpenOCD 선택 로그확인 (특히 Symbols 부분)
  3. View->DEBUG CONSOLE을 확인

이전과의 다른점은 Call Stack에서 각 Thread의 이름을 알수 있으며, 개별 Thread Control도 가능하며, 제어가 가능하다는 부분이다.

  • 참고
WATCH POINT를 사용하고자 하면 원하는 변수를 넣으면 감시가 된다. (물론 SDKCONFIG설정필요)


  • VSCode의 동작 
아래처럼 동작하지만 PERIPHERALS/REGISTERS/MEMORY/DiSASSEMBLEY는 없음 


  • esp-idf-vscode-generated.gdb 
gdbinit 처럼 생성된 파일로 gdb를 초기설정값 
target remote :3333
mon reset halt
flushregs
thb app_main

gdbinit 처럼 gdb 초기화 부분 
  https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/tips-and-quirks.html#what-is-the-meaning-of-debugger-s-startup-commands

  • ESP32의 제약사항 
ESP32의 경우 HW-BP(breakpoint)는 2개까지 지원되며, HW-BP기반으로 SW-BP 생성하여 FLASH(32개)와 IRAM (32개) 사용가능하지만
gdb는 SW-BP를 사용하지 못한다고 한다. 


  • Terminal->Run Task 이용하여 각 Task 실행 
기존에 제공해주는 메뉴와 비슷하며, 거의 별도로 사용할 일은 없을 것 같다. 
Linux에서는 별도로 Task를 만들어 내마음대로 구성을 했지만, 현재 ESP-IDF 에서 기본으로 각 메뉴로 제공해주고 있다. 

  • VS Code IDF Setting 
View -> Command Palette -> Preferences: Open Settings (UI))
Extensions->ESP-IDF 세부참조확인 
.vscode/task.json 참조 


상위대로하면, WATCH기능과 BreakPoints기반으로 디버깅이 가능하며 Call Stack도 분석이 가능하며 나름 어느 정도 쓸만한 것으로 보인다.

  • VS Code ESP-IDF 단점 
  1. Disasemble 
  2. Memory Read/Write 
  3. Peripheral 
상위와 같은 정보를 제공을 못해주고 있으며, 다소 불안전한 모습으로 동작한다.
사용하면 사용할 수로 많은 부분이 JTAG 디버거 기능으로 부족하다고 느끼는 바이다.


3. VS Code 기반의 ESP-IDF 의 TIPs

ESP-IDF VS Code Extension 설치 후 하단에 아래 아이콘이 생성되며 각각의 idf.py 의 기능을 손쉽게 사용가능하다.


얼마전에 새로 업데이트가 되어 새로운 기능들이 추가되고 있으며, 약간씩 변경될지도 모른다.



ESP-IDF Monitor 혹은 VS Code에서 제공해주는 기능은 PowerShell 기반으로 동작이 되며 이를 응용하여 간단하게 확장하여 사용가능하다.

  • ESP-IDF Monitor 의 경우 (tee를 이용)

Ctrl+C로 정지 후 아래와 같이 tee를 이용하여 log capture를 하자 PS에서 tee가 될줄은 정말 몰랐는데, PS(Power Shell)이 가만보면 
Linux 환경을 비롯하여 기능들을 최대한 지원해주려고 하는 것으로 보인다.
 C:\Users\jhlee\.espressif\python_env\idf4.2_py3.8_env\Scripts\python.exe C:\Users\jhlee\esp\esp-idf\tools\idf.py -p COM6 monitor | tee debug.log  

  • ESP-IDF Terminal 사용할 경우
기존 리눅스 처럼 idf.py 기반으로 메뉴를 사용가능하지만, menuconfig는 제대로 동작이 안됨
그래서 별도로 VS Code에서 GUI로 제공해줌 

 idf.py --help
......
  add-dependency           Add dependency to the manifest file. For now we only support adding dependencies on the default service.
  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.
  clean                    Delete build output files from the build directory.
  confserver               Run JSON configuration server.
  create-manifest          Create manifest for specified component.
  create-remote-component  Register a new component on the component service.
  delete-version           Delete version in dist directory from the component service.
  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
  pack-component           Create component archive.
  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.
  upload-component         Upload component in dist directory to the component service.
  upload-component-status  Check status of component upload


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 확인   

5/01/2021

ESP32 OpenOCD 및 Python 관리

1. ESP32 OpenOCD 와 GDBGUI 재시도

OpenOCD를 이용하여, TCL/GDB를 연결하여 기본동작이 되는 것 까지는 확인이 되지만, 나의 목적인 GDBGUI를 사용하는 것에는 실패를 하였기 때문에, 
이부분에 대해서 다시 시도를 함 

이전 ESP32 OpenOCD 와 GDB 구성 참조 

ESP32 OpenOCD JTAG 관련내용 
 

이전에 이해가 되지 않는 부분이 gdb를 실행하는데, python library 2가 필요로 하는 것이 이해가 되지 않았다. 
그래서, 현재 Ubuntu 20.04에서 Python3.8 사용하지만, 별도로 Python2.7기반으로 변경한 후 다시 virtual env를 만들어 테스트를 해보려고 한다. 


1.1  Python의 Version 관리 

Python은 Python2.7과 Python 3.x Version으로 나누어 볼수 있겠으며, pip2 와 pip3도 별도로 나누어 볼 수 있겠다. 
동시에 사용하고자 한다면, 별도로 각각 설치를 해주고,  /usr/bin/python에 link를 만들어주면된다.

  • Ubuntu 20.04의 Python 현재 상태 확인 
우선 나의 Python의 상태를 확인을 해보면, python3만 지원되며, python은 링크가 없다. 

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8

$ python  //python command로는 동작안되며, python3 만 되며, 아래와 같이 별도의 package를 설치하라고 함

Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3
  
$ pip

Command 'pip' not found, but there are 18 similar ones.  
  
$ pip3 list
Package                 Version             
----------------------- --------------------
appdirs                 1.4.4               
apturl                  0.5.2               
bcrypt                  3.1.7               
blinker                 1.4                 
Brlapi                  0.7.0               
Brotli                  1.0.9               
certifi                 2019.11.28          
chardet                 3.0.4               
Click                   7.0                 
colorama                0.4.3               
command-not-found       0.3                 
cryptography            2.8                 
cupshelpers             1.0                 
dbus-python             1.2.16              
defer                   1.0.6               
distlib                 0.3.1               
distro                  1.4.0               
distro-info             0.23ubuntu1         
dnspython               2.1.0               
duplicity               0.8.12.0            
entrypoints             0.3                 
eventlet                0.25.2              
fasteners               0.14.1              
filelock                3.0.12              
Flask                   0.12.5              
Flask-Compress          1.9.0               
Flask-SocketIO          2.9.6               
future                  0.18.2              
gdbgui                  0.14.0.2            
gevent                  1.5.0               
gevent-websocket        0.10.1              
greenlet                0.4.16              
httplib2                0.14.0              
idna                    2.8                 
itsdangerous            1.1.0               
Jinja2                  2.11.3              
keyring                 18.0.1              
language-selector       0.1                 
launchpadlib            1.10.13             
lazr.restfulclient      0.14.2              
lazr.uri                1.0.3               
lockfile                0.12.2              
louis                   3.12.0              
macaroonbakery          1.3.1               
Mako                    1.1.0               
MarkupSafe              1.1.0               
monotonic               1.5                 
netifaces               0.10.4              
oauthlib                3.1.0               
olefile                 0.46                
paramiko                2.6.0               
pexpect                 4.6.0               
Pillow                  7.0.0               
pip                     20.0.2              
pipx                    0.12.3.1            
protobuf                3.6.1               
pycairo                 1.16.2              
pycups                  1.9.73              
pygdbmi                 0.10.0.0            
Pygments                2.8.1               
PyGObject               3.36.0              
PyJWT                   1.7.1               
pymacaroons             0.13.0              
PyNaCl                  1.3.0               
pyRFC3339               1.1                 
python-apt              2.0.0+ubuntu0.20.4.3
python-dateutil         2.7.3               
python-debian           0.1.36ubuntu1       
python-engineio         3.14.2              
python-socketio         4.6.1               
pytz                    2019.3              
pyxdg                   0.26                
PyYAML                  5.3.1               
reportlab               3.5.34              
requests                2.22.0              
requests-unixsocket     0.2.0               
screen-resolution-extra 0.0.0               
SecretStorage           2.3.1               
setuptools              45.2.0              
simplejson              3.16.0              
six                     1.14.0              
systemd-python          234                 
ubuntu-advantage-tools  20.3                
ubuntu-drivers-common   0.0.0               
ufw                     0.36                
unattended-upgrades     0.1                 
urllib3                 1.25.8              
usb-creator             0.3.7               
virtualenv              20.4.3              
wadllib                 1.3.3               
Werkzeug                0.16.1              
wheel                   0.34.2              
xkit                    0.0.0   
  
$ which python

$ sudo apt install python2 //별도 python2.7 설치 후 호환성때문이지 다시 확인     

$ ll /usr/bin/py*
-rwxr-xr-x 1 root root    7813  3월 13  2020 /usr/bin/py3clean*
-rwxr-xr-x 1 root root   12120  3월 13  2020 /usr/bin/py3compile*
lrwxrwxrwx 1 root root      31 12월 15 22:18 /usr/bin/py3versions -> ../share/python3/py3versions.py*
-rwxr-xr-x 1 root root    4124  3월 13  2020 /usr/bin/pyclean*
-rwxr-xr-x 1 root root   11895  3월 13  2020 /usr/bin/pycompile*
lrwxrwxrwx 1 root root       8  3월 13  2020 /usr/bin/pydoc2 -> pydoc2.7*
-rwxr-xr-x 1 root root      79  3월  8 22:02 /usr/bin/pydoc2.7*
lrwxrwxrwx 1 root root       8 12월 15 22:18 /usr/bin/pydoc3 -> pydoc3.8*
-rwxr-xr-x 1 root root      79  1월 28 00:41 /usr/bin/pydoc3.8*
lrwxrwxrwx 1 root root      12  3월 13  2020 /usr/bin/pygettext2 -> pygettext2.7*
-rwxr-xr-x 1 root root   22082  3월  8 22:02 /usr/bin/pygettext2.7*
lrwxrwxrwx 1 root root      12 12월 15 22:18 /usr/bin/pygettext3 -> pygettext3.8*
-rwxr-xr-x 1 root root   21535  1월 28 00:41 /usr/bin/pygettext3.8*
-rwxr-xr-x 1 root root     372  4월  6  2020 /usr/bin/pyjwt3*
lrwxrwxrwx 1 root root       9  3월 13  2020 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3674216  3월  8 22:02 /usr/bin/python2.7*
lrwxrwxrwx 1 root root       9 12월 15 22:18 /usr/bin/python3 -> python3.8*
lrwxrwxrwx 1 root root      16  3월 13  2020 /usr/bin/python3-config -> python3.8-config*
-rwxr-xr-x 1 root root     384  3월 28  2020 /usr/bin/python3-futurize*
-rwxr-xr-x 1 root root     388  3월 28  2020 /usr/bin/python3-pasteurize*
-rwxr-xr-x 1 root root 5486384  1월 28 00:41 /usr/bin/python3.8*
lrwxrwxrwx 1 root root      33  1월 28 00:41 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config*
lrwxrwxrwx 1 root root      10  3월 13  2020 /usr/bin/pyvenv -> pyvenv-3.8
lrwxrwxrwx 1 root root      29  3월 13  2020 /usr/bin/pyversions -> ../share/python/pyversions.py*

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

python package