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와 공통분모를 찾아 관련부분만 넣어 사용하려고 한다. 

1/24/2022

ESP32 의 Memory 구성-2 (Internal Memory)

1. ESP32 Internal Memory 구성 


  • ESP32 Memory Address MAP
CPU에서 Internal Memory 접근은 Cache를 이용하지 않는다. 

ESP32에서는 Internal Memory or Embedded Memory라고 하며, ROM과 RAM부분으로 구성되어있다. 

  • ESP32-WROVER-B의 Internal Memroy 구성 
https://www.espressif.com/sites/default/files/documentation/esp32-wrover-b_datasheet_en.pdf

  • ESP32의 Internal Memory Size 구성 
SRAM과 ROM의 구성보면 다음과 같이 구성되어있으며, 주로 SRAM부분을 파악하자
  1. 520 KB의 SRAM (0/1/2 분할 사용)
  2. 448 KB의 ROM (0/1 분할 사용)
  3. 1 Kbit eFuse : 주로 내부 정보로 이용되며, MAC Address 정보(WIFI/BT/EMAC) 
  4. 8KB RTC Fast Memory:    (PRO_CPU만 접근가능)
  5. 8KB RTC SLOW Memory:  (PRO_CPU/APP_CPU/ULP 접근가능)
상위의 RTC Slow Memory의 경우 거의 ULP가 사용하며, 나의 경우는 거의 제외 
(DeepSleep모드는 ULP 내부 별도 Core사용)


  • ESP32의 Internal Memory Address Map 
Bus Type 기준으로 Data/Instruction에 따라 각 나누어 사용하므로 각 Address Map를 주의해서 보도록하자. 

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



  • Table 2 의 Comment 관련설명 
  1. Remap: Internal ROM0 과 Internal SRAM1 Remap 되면 Internal ROM0로 사용
  2. Cache:  두개의 CPU(PRO_CPU/APP_CPU)가 32KBx2=64  Cache 사용(MMU기반) 
  3. DMA:  Data로만 되어지며, MMU대신 MPU기반으로 동작 
  4. PRO_CPU Only: RTC FAST Memory 접근은 PRO_CPU만 가능 

** 착각하면 안되는 것이 상위 Internal Memory Size를 다 사용한다고 생각하면 안되며, 상위는 Address Map 일뿐 이다. 

  • ESP32의 ROM0/1(440KB) 구성 
  1. Internal ROM 0:: 384KB : Instruction Bus 사용 (두 CPU 접근가능) 
    1. Internal ROM 0: 32KB   : - 이 부분은 SRAM1 과 Remap 되어 SRAM처럼 사용  
    2. Inernal  ROM 0: 352KB 
  2. Internal ROM 1: 64KB : Data Bus 사용 (두 CPU 접근가능) 


  • ESP32의 SRAM(520KB) 구성정리  
SRAM0/1/2로 분할하여 사용하며 각각의 용도가 아래와 같이 다르며, 관련 Linker Scirpt도 확인
  1. SRAM0192 KB(64/128)  Instruction기반으로 사용 
    1. 64KB:  각 CPU의 Cache로 32KB 사용되며, MMU기반으로 External Memory연결 
    2. 128KB: Interrupt Vector/Text/Heap의 IRAM기반으로 사용  
  2. SRAM1128 KB ( DRAM: 128KB or IRAM: 64/32/32KB ) 둘다 사용 상위 Map참조 
  3. SRAM2200 KB ( DRAM: 200KB )

SRAM-0/1/2의 구성은 상위와 같이 약간 복잡하게 구성되며 ,
기본적으로 Insrtuction/Data Type으로 사용하느냐에 따라 Address Map 조금씩 달라진다. 


2. SRAM의 IRAM/DRAM 구분 및 구성   

SRAM을 보면, SRAM0/1/2 와 RTC Flast RAM 와 RTC SLOW RAM 나뉘어진다. 
그리고, SRAM0/1/2는 각 Bus Type에 따라 IRAM/DRAM 으로 나뉘어지며, 중복 Mapping도 가능하다. 

이는 칩 설계자가 SRAM1 확장성을 염두해고 이렇게 중복 Mapping한 것으로 보이며, 실제로도 중간 부분은 I/DRAM을 혼용사용한다.
이부분은 추후 MMU/Cache의 부분을 보면 이해를 할수 있다. 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387


IRAM/DRAM 
  1. IRAM(Instruction RAM): 주로 text 를 위해서 사용되어질꺼며, 실제 동작Code
  2. DRAM(Data RAM)으로 bss/data/heap/init/noinit 을 위해서 사용 

IRAM/DRAM Adddress MAP
  1. IRAM  SRAM0:  0x4007_0000 - 0x4009_FFFF 
  2. IRAM  SRAM1:  0x400A_0000 - 0x400B_FFFF
  3. DRAM SRAM2:  0x3FFA_E000 - 0x3FFD_FFFF
  4. DRAM SRAM1:  0x3FFE_0000 - 0x3FFF_FFFF

  • Address를 중복되지 않게 IRAM 과 DRAM의 구분
아래와 같이 극단적으로 구성을 정해놓고 사용가능하겠지만, 추후 확장하여 변경도 가능할 것이다. 
  1. SRAM0을 IRAM 사용
  2. SRAM1을 DRAM 사용
  3. SRAM2을 DRAM 사용 
  4. 이외 RTC RAM 8/8 KB사용  
SRAM1은 상위에서 언급했듯이 항상 확장성을 위해서 I/D RAM으로 변경확장가능하다는 것을 잊지말자 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387




2.1 SRAM0의 IRAM 구성 

SRAM0의 경우, IRAM 사용되어지며, 실행가능한 코드 혹은 현재 32byte align으로 구성(CPU가 32bit)되어있다. 

  • SRAM0 의 IRAM(Instruction RAM)의 구성의 예 
  1. Dual CPU이므로 각 개별 Cache마다 32KB사용하며, CPU1 Cache를 사용안하면, Heap 
  2. Interrupt Vector 사용
  3. Text  (실행가능한 Code영역, Flash , XIP도 여기서 )
  4. Heap IRAM 영역 
    1. FreeRTOS에서 Heap의 사용하며 재미있는것은 32bit Data로 사용가능  
    2. Linker Script와 같이 각 esp32 내부 malloc함수 같이 분석하면 결론이 나옴 

SRAM0의 IRAM의 구성 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387



SRAM0의 구성 
192KB = 64KB + 128KB (I-MMU)
128KB = ISR/Text/Free IRAM 이 부분 전체가 I-MMU에 해당  
이부분은 추후 Internal Memory를 위한 MMU 


2.2. SRAM1/2의 DRAM 구성변화  

SRAM1/2의 DRAM 구성은 Config에 따라 변경이 되어지며 각 경우에 따라 아래와 같이 구성 
중요하게 봐야할 부분이 Heap Size이며, Heap 기반으로 Task의 TCB 와 Task의 Stack Size가 결정되므로, 중요하게 봐야한다. 

  • 일반적인 SRAM1/2의 DRAM구성 
  1. SRAM2 의 ROM Function 위한 DATA Memory 영역 (8K Size, 0x2000)
  2. SRAM2 의 DATA 영역 (초기화된 전역변수)
  3. SRAM2 의 BSS  영역 (초기화가 안된 전역변수)
  4. SRAM1/2 의 Data 기반의 Heap 영역 
    1. Task의 TCB 와 Stack 정보가 이곳에 저장될 것이라고 생각됨 
    2. SRAM의 Heap은 BSS Size 다음부터 정해지므로, 사이즈는 부팅

https://blog.espressif.com/esp32-programmers-memory-model-259444d89387




SRAM2의 구성 
200KB = 72KB+ 128KB (D-MMU)
  

  • BT를 사용할 경우 DRAM구성 
BT를 사용할 경우,  SRAM2에 BT Controller Memory(54Kb)영역 추가 
나머지는 상위 일반적인것 과 동일 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387


상위부분은 Linker Script에서 0x3FFFB_0000 - 0x3FFB_DB5C로 DRAM으로 사용되어짐 


  • Trace를 사용할 경우  DRAM구성   
APP TRACE를 사용할 경우, SRAM1의 Trace Memory(32KB) 추가  
나머지는 상위 일반적인것 과 동일 
https://blog.espressif.com/esp32-programmers-memory-model-259444d89387



3. SRAM1의 Heap 구성확인  

ESP32 SRAM의 실제 Heap 구성 

ESP32를 처음 실행시 현재 사용하는 Heap을 다음과 같이 확인가능하며, 이는 _heap_start가 동적으로 변하기 때문에 각각의 Application에 따라 다름 
각 Config에 의해서 변경되어지므로 주의하며, 상위그림이 다른 것도 다 Config가 다르며,
I (252) heap_init: Initializing. RAM available for dynamic allocation:
I (259) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (265) heap_init: At 3FFB2EC8 len 0002D138 (180 KiB): DRAM
I (272) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (278) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (284) heap_init: At 4008944C len 00016BB4 (90 KiB): IRAM

malloc 은 내부적으로 heap_cap_malloc으로 사용되어지며, 가급적 malloc 대신 heap_cap_malloc으로 사용하자