12/30/2021

ESP32 의 Memory 구성-1 (Address Map)

1. ESP32 Memory 구성 

ESP32 혹은 ESP32 Module의 Hardware Memory  구성은 다음 과 같다. 
  • Embedded or Internal Memory(ROM/SRAM) 
  • External Memory(SPI-Flash/SPI-PSRAM) 

ESP32의 전반적인 Memory 구성과 사용목적을 세부적으로 알기위해서 아래와 같이 정리하고자 한다.  


1.1. ESP32 System Address MAP 구성  

ESP32 System 기반의 물리적인 Address Map 과 각 Memry 구조를 파악해보도록 하자 

  • ESP32 System Address Map 
각 Bus Type 기반으로 Internal/External Address Map 기억 
  1. Embedded Memory (Internal Memory)
  2. External Memory (SPI Flash/SPI RAM)
  3. Peripheral (System Resgier)
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf


ESP32 Memory Map

  • ESP32 System Address Map 연결구성
아래의 그림으로 External Memory 와 ESP32의 연결 구성을 쉽게 확인가능하며, 
이외의 Address Map으로 각각 Pheripheral 이 어떻게 연결되어 구성되었는지를 쉽게 파악가능하다. 
  1. External Memory의 경우,  Cache/MMU를 사용 
  2. Internal Memory 의 경우, Cache 미사용 
https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

상위 Address Map System의 전체구조를 파악하기 쉬운 중요한 것이므로 세부적으로 아래와 같이 분석 

  • System Address Map -> Cache (External Memory)
  1. 0x3F40_0000 - 0x3F7F_FFFF : Data/ 4MB / External Memory 
  2. 0x3F80_0000 - 0x3FEF_FFFF : Data/ 4MB / External Memory 
  3. 0x400C_2000 - 0x40BF_FFFF: Instruction/ 11.5MB(11512KB) / External Memory 
Cache Address Map 은 Cache(32KBx2)->MMU->External Memory 접근가능 
2번의 0x3F80_0000 - 0x3FBF_FFFF: 이곳까지만 사용하며 이외부분은 확장성 
 

  • System Address Map -> Internal ROM
  1. 0x3FF9_0000 - 0x3FF9_FFFF :  Data / 64KB/ ROM1
  2. 0x4000_0000 - 0x4000_7FFF:  Instruction/ 32KB/ ROM0         (Remap) 
  3. 0x4000_8000 - 0x4005_FFFF:  Instruction/ 352KB/ ROM0      
ROM Address Map Size 448KB448KB 전체 사용
ROM0/1로 분할하여 사용
ROM0의 Instruction 은 32KB SRAM1 Instruction Remap사용 (Boot 목적일 추측) 

  • System Address Map -> Internal SRAM
  1. 0x3FFA_E000 - 0x3FFF_FFFF : Data / 200KB        / SRAM2       ( DMA )
  2. 0x3FFE_0000 - 0x3FFF_FFFF : Data / 128KB        / SRAM1       ( DMA
  3. 0x4007_0000 - 0x4007_FFFF: Instruction/ 64KB   / SRAM0       ( Cache)
  4. 0x4008_0000 - 0x4009_FFFF: Instruction/ 128KB / SRAM0        
  5. 0x400A_0000 - 0x400A_FFFF: Instruction/ 64KB  / SRAM1  
  6. 0x400B_0000 - 0x400B_7FFF: Instruction/ 32KB  / SRAM1       (Remap)
  7. 0x400B_8000 - 0x400B_FFFF: Instruction/ 32KB  / SRAM1      
SRAM0/1/2로 분할하여 사용
SRAM Address Map Size 648KB 중 전체 SRAM 사이즈 520KB 사용가능 
648KB-520KB = 128KB 는 SRAM1 (aliases)로 사용 (아래 MMU부분확인)

Cache:  Instruction 32KB x2 = 64KB 사용하며 SRAM0 사용 (Data??)
DMA:   Data  DMA 목적으로 200/128KB까지 확장가능 (아래 IRAM/DRAM 참조)
Remap: ROM0 Remap 사용  


  • System Address Map -> RTC FAST Memory
  1. 0x3FF8_0000 - 0x3FF8_1FFF   :  Data  /8KB  / PRO_CPU Only 
  2. 0x400C_0000 - 0x400C_1FFF  :  Instrunction / 8KB / PRO_CPU Only 
RTC FAST Address Map Size 16KB 8KB만 혼합하여 DATA/Instruction 사용 

  • System Address Map -> RTC SLOW Memory
  1. 0x5000_0000 - 0x5000_1FFF : Data Instruction / 8KB
RTC SLOW Address Map Size 8KB 8KB만 사용하며 주로 ULP 사용 



  • ESP32 System 구성기반으로 전체구성확인
ESP32는 기본적으로 Dual Core로 Cache와 MMU가 존재한다.
Cache는 MMU와 연결되어 Mapping되어 SPI를 이용하여 External Memory 접근 
DMA의 경우 Embedded memory 즉 SRAM기반으로 동작 

Embedded (Internal) Memory 구성 
  1. ROM
  2. SRAM0/1/2
CPU-> Embedded Memory 

External Memory구성 
  1. SPI용 PSRAM(Pseudo-Static RAM)
  2. SPI용 Flash
CPU->Cache->MMU->External Memory 


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



상위구성을 보면 External Falsh 와 External SRAM은 MMU를 통해 Cache로 연결되어 구성되어지며, 각 영역은 이미 정해져 있다. 

11/10/2021

AWS FreeRTOS Provisiong 자료수집 및 이해

1. AWS Provisioning 관련자료 

AWS Provisiong 관련자료 수집중이며, 우선 전체 구조와 동작방식 및 관련내용 메뉴얼을 우선 숙지 후 관련내용 정리 

우선 이를 기본적으로 이해하기 위해서는 TLS를 반드시 알아야하며, ESP32에서 AWS FreeRTOS를 사용하지 않고,
FreeRTOS에서 AWS-SDK를 Porting하여 기본 테스트를 진행하였지만, 현재 사용하고 있는 곳에서는 SRAM이 부족하여 이를 사용하기가 힘들 것 같다. 
다만, 일반적인 ESP32에서는 충분히 사용가능하다. 

AWS의 Embedded SDK Components 사용법 
최근에 들어가보니, 소스가 많이 변경되어 있으며, Manual도 새로 업데이트가 되어있다.
진작에 올려놓을 것이지, 젠장 
component도 이전과 완전다르며, 가능하다면, 최신버전으로 사용하시길 


  • AWS Provisiong 용어정리 
AWS Provisioning 의 크게 X.509 CSR(Certificate Signing Request) 구분되어진다. 
CSR도 X.509의 일종이지만, X.509를 요청하여 받는 것이며, 포맷은 X.509와 거의 유사하다.
  1. Fleet Provisiong without certificates: CSR 기반으로 인증서가 없이 인증하는 방법으로 나오며 다시 2종류 분류 
  2. Provisiong with certificates: X.509를 Device에 내장하여 진행하는 것으로 다시 3종류로 분류구분  


  • Provisioning with certificates 
Device들은 Certificate와 Private Key를 가지고 있는 구조로 또 다시 각 3개의 방식으로 구분되어짐 
참고로 상위 이름은 내가 임의로 정하며 AWS에서는 별다른 용어를 사용안함 
 
  1. JITP(Just in Time Provisioning): AWS IoT Core 만 이용 
  2. JITR(Just in Time Registration):  AWS IoT Core 와 AWS Lamda 이용 
  3. MAR(Multi-Account Registration): AWS IoT Core 의 Account가 여러개 사용 

결정적으로 보면, AWS IoT Core 와 AWS Lamda를 사용 때문으로 판단
그리고 Account를 한개 혹은 멀티로 가는지로 구분  

1.1 Fleet Provisioning by Claim 

Device는 Claim cerficates 와 private key와 함께 제조되어 생산되어진다.
그리고, 이 기반으로  AWS IoT core에 접속하여 CSR로 다시 unique device certicate로 다운을 받아 인증을 받고 이를 등록 후 TLS통신시작되어진다.  

Port 8883

  • Claim-based의 문서를 보면 크게 두개로 분리
  1. Device에게 전달되기전 (CreateProvisiongTemplate를 만들고 이를 IoT Thing등록)
  2. Device에서 전달된 후, 즉 Device에서 진행할일 아래에 설명 (디바이스는 이곳만 확인)

  • Device에게 Claim Certificate 전달되기 전의 과정 및 설정  
AWS에서 설정해야 할것들이라고 보면 될것 같다. 
  1. create-provisioning-template:  template name 과 parameter 정의
  2. create-keys-and-certificate: claim certificate 와 key  active 모드 변경 
  3. create-policy: fleet provisioning 정책결정 CreateKeysandCerficate or CreateCertificateFromCsr 

  • AWS IoT 의 create-provisioning-template 설정확인
AWS IoT -> Connect -> Fleet provisioning templates 확인 
  1. Json에서 "PolicyName": "<provisioned-thing-policy>" :  아래의 이름으로 연결됨 
  • AWS IoT 의 create-policy JSON 설정확인
AWS IoT -> 보안 -> 정책 -> provisioned-thing-policy 확인 
  1. Json에서 둘중 하나로 결정 $aws/certificates/create-from-csr or $aws/certificates/create 설정


  • AWS IOT Endpoint
account-specific-prefix.iot.aws-region.amazonaws.com

  • Device에게 전달 된 후 진행될 일 (아래그림)
상위 그림을 간단히 요약하면, 처음 Claiim Certifcate 와 Key 기반으로 TLS로 MQTT로 AWS IoT를 접속하여 아래와 같이 두번의 절차를 진행 
  1. CreateKeysAndCertificate or CreateCertificateFromCsr 진행 
  2. RegisterThing진행 


https://d1.awsstatic.com/whitepapers/device-manufacturing-provisioning.pdf


  • MQTT의 TOPIC: Unique Device Certicate 와 Key Download
  1. $aws/certificates/create/json
  2. $aws/certificates/create/json/accepted
  3. $aws/certificates/create/json/rejected

MQTT CreateKeysAndCertificate
상위 TOPIC과 동일하며 Embedded C or C++ 예제는 현재없음(직접작성)

MQTT CreateCertificateFromCsr
상위 TOPIC중 create를 create-cert-csr로 변경, 예제참조가능하나 테스트 못함  

HTTP CreateKeysAndCertificate 
Fleet Provisiong는 미지원으로 파악되지만, 일반 Provisiong은 가능 (Owershiptoken이 필요)

  • MQTT 의 TOPIC : AWS Lamda 연결및  Provisiong Template
  1. $aws/provisioning-templates/{template-name}/provision/json
  2. $aws/provisioning-templates/{template-name}/provision/json/accepted
  3. $aws/provisioning-templates/{template-name}/provision/json/rejected

MQTT RegisterThing
상위 TOPIC과 동일하며, 이때 Device의 정보를 Parameter로 전달하고 Configuration 값을 받음

HTTP RegisterThing 
일반 Provisiong 에서 사용가능하나, Fleet Provisiong은 불가능 파악 (Ownership Token이 없음)

AWS MQTT API 

관련소스 Header 

PKC11의 전체구조
현재 PKC11의 필요성이 Token인데, 이 부분이 Ownership Token하고 관련이 있는지?? 


1.2 Fleet Provisioning by Trusted User

AWS IoT에 처음 접속할 때 Trusted User 경우에 사용한다고하며, 주로 End User/설치기술자가 될 때 사용한다고 한다.   
Claim 과 차이는 처음부터 CSR을 가지고 있지 않으며, Trusted User가 CreateProvisiongTemplate 함수를 이용하여 CSR와 CSR Key를 받으면, 상위 구조와 얼추 비슷하게 흘러간다. 

Claim 과 차이라고하면, CSR를 누가 갖고 있는냐고, 이기능은 AWS Lamda를 미사용 


https://d1.awsstatic.com/whitepapers/device-manufacturing-provisioning.pdf


AWS API (CreateProvisiongTemplate) HTTP로 구현 

CreateProvisiongTemplate 는 AWS CLI에서 어떻게 하는것으로 생각되어짐 


1.3 Fleet Provisiong PC기반 테스트 

  • Fleet Provisiong PC기반테스트 방법
  1. Create a provisiong temlate  (aws iot 로 진행)
  2. Create claim cirtificate and key (Claim 인증서/Key 생성)
  3. 상위 결과의 JSON에서  .certificateArn 값을 얻어옴 
  4. AWS IoT의 Policy를 claim certificate를 위해서 생성 및 이를 연결  
  5. Device에서 python code 로 fleet provision 진행 (Serial 과 Device 정보)
  6. fleet provisiong이 완료 후 이를 검증 
  7. mosquitto로 fleet provisiong 후 얻은 certificate와 key로 진행  (root.ca)


2. FreeRTOS AWS SDK Provisiong 관련자료 

  • CreateCertificateFromCsr: TOPIC도 가능하며, 예제참조 
Fleet Provisiong의 기본개념은 CSR을 이용하여 AWS IoT에게 X.509를 받아 저장 후 이를 기반으로 등록한 후 TLS통신을 하는 개념이다.  
이때 사용되어지는 것이 MQTT이며, 이를 이용하여 요청 및 인증서를 받는다. 


AWS MQTT Demo의 구성
AWS MQTT에서 내부적으로 Backoff 기능을 사용되는 것으로 파악(Back Off가 무엇인지?)
한글문서는 오타가 너무 많음(재미있는 것은 현재 ESP32는 MQTT QoS 1기반 TLS 이지만 아래는 QoS2 사용)  

AWS IoT Device SDK C 관련문서: Fleet Provisioning
현재 이상한 것은 이 관련된 함수는 AWS FreeRTOS에는 없는 것으로 파악 (API가 서로 다른 것으로 파악되며 최신꺼에도 아래 함수가 없어짐?? 선택?)
CSR기반으로 하는 인증 찾음 (관련 한글설명도 나옴)

CSR기반으로 하는 인증의 전체구조 
현재 Provisiong Library 없어진것으로 파악, 주의해야 함 (참조만 해야할 것 같음)


AWS MQTT Fleet Provisioning
MQTT Provisiong을 하는데, CSR을 사용하는 것으로 추측 

AWS FreeRTOS  관련문서 
AWS FreeRTOS와 상위 IoT Device의 소스에서 사용되는 함수 다르며, 이것도 글을 읽어보면 CSR기반??

AWS FreeRTOS Build 및 개발환경 (ESP32)
ESP-IDF가 전부 4.2기준으로 작성되며 이 부분 확인 

Fleet Provisioning 관련 정보
글을 읽다보면, CSR을 이용하여 동작이 되는 것 같으며, 이유는 ROM size를 줄이기 위해서 X.509를 사용하지 않는 것으로 보이는데, 전의 KCMVP 와 좀 다른 구조?
어째든 ECDSA 기반으로 구성되는 것으로 보임 

AWS 개발자 Guide로 CA 및 인증서 등록방법 추후 알아야 할 거 같음 

AWS CLI
GCP와 구조가 비슷한 것으로 보이며, 일단 이거 사용법은 나중에 알아야 할 거 같음



2.2 PKCS#11 의 이해

PKCS는 공개키 암호화 표준으로 AWS IoT에서 PKCS#11을 사용하며, 이곳에 Ceritificate를 보관하여 동작하는 구조이다.

PKCS(Public Key Cryptography Standards)

PKCS#11 (Cryptographic Token Interface Base Specification)
문서를 읽어보면, Smart Card, TPM(Trusted Platform Module), HSM(Hardware Security Module)에 사용되어진다고 하며,
Secure Key를 Storage에 저장하는 역할이라고 하며,
표준은 두 군데에서 진행하며 주로 보면 OASIS가 주체적으로 하는 것으로 보임



AWS corePKCS11 
AWS에서는 처음 PKCS11 Sessiong을 생성한 후 Cerficate와 Key를 PKCS11를 이용하여 RSA 혹은 ECDSA 방식 corePKCS11를 이용하여 Provising을 Flash Storage 저장한다.
이 PKCS11으로 저장된 Cerficate와 Key의 기반으로 Session을 만들어 TLS를 사용하여 접속진행
현재 ESP32 OpenSSL이 아닌 mbedTLS를 사용하는 구조임

xInitializePkcs11Session
SlotList를 가져오고, PKCS11 Login

Certificate 와 Key를 PKCS11으로 Provisiong 진행
provisionCertificate

provisionPrivateKey

Mbedtls_Pkcs11_Connect
Mbedtls_Pkcs11_Recv
Mbedtls_Pkcs11_Send


소스보면, Fleet Provisiong을 해보면 내부에 DER형식으로 Template으로 Certificate와 Key를 별도생성하는데,
이 API를 이용하며 RSA/ECDSA 방식으로 각 Certificate와 Private Key를 저장한 후 PKCS11 Session 기반의 TLS을 사용하는데,
일반적인 TLS와는 다른 방식으로 보인다.
현재로 보면 AWS에서 PKCS11는 필요할 것으로 보임

PKCS11
관련 한글자료


2.3 FreeRTOS의 AWS Provisiong 관련소스

현재 Embedded 용으로 파악되는 것은 아래와 같이 Provisiong을 위해서 두개의 OpenSource 이며
관련내용은 아래의 링크를 참조해서 파악하자.

  • AMAZON FREERTOS (AWS FreeRTOS)
Amazon에서 FreeRTOS기반으로 SDK가 포함되어져 만들었으며, Provisiong을 어떻게하는지 파악을 못함

  • AWS IoT Device SDK 관련소스 (Version에따라 구조가 다름)
AWS 에서 IoT를 위한 SDK로 MQTT는 QoS2 기반으로 TLS통신하는 것으로 파악되며, 현재 ESP32의 MQTT는 지원불가능??(ESP QoS1까지만 지원)
WSS로 사용할 경우에도 RootCA 설정하는 곳이 없음 

AWS IoT Device SDK 문서 

  • AWS Provisioning Python로 PC 테스트 용 (AWS CLI 필요)
PC에서 가장 손쉽게 테스트 하는 방법으로 상위 PC 테스트 Manual에서 aws cli 와 함께 진행

10/14/2021

ESP32 와 FreeRTOS

1. FreeRTOS 관련정보 

FreeRTOS 관련문서 

사용하면서 오래전에 Vxworks 나 다른 RTOS가 생각나며 자동으로 비교가 되어지는데, 물론 상용 RTOS에 비교하는 것이 좀 무리일수도 있지만,
무료인 Linux 와 변종 RTLinux 도 있기때문에 비교되어지며, 기능이 부족하다고 생각했으나, 의외로 괜찮은 무료 RTOS인 것 같다. 

  • ESP32의 FreeRTOS의 Version 확인 (IDFv4.2.2)
ESP32에서 사용하는 FreeRTOS Version v8.2.0기반으로 했으나, 특정함수는 v9.0.0 라고한다
아래를 읽어보면, SMP기반으로 동작한다. 


1.1 FreeRTOS의 Config 확인 

  • FreeRTOS 설정 
FreeRTOS의 각 설정으로 모든 API에서 이 설정기준으로 동작하므로 관련설정을 확인하자

  • ESP32의 FreeRTOSConfig.h / FreeRTOS.h 
ESP32의 경우, FreeRTOSConfig.h가 존재하며, 이는 FreeRTOS.h에 포함되며, 상위와 다르게, 다시 Wrap 해서 CONFIG를 진행 

ESP32의 FreeRTOSConfig.h / FreeRTOS.h 파일 

일반 FreeRTOSConfig.h 파일
FreeRTOS 관련설정값들로 이 값과 상위값을 비교 


  • 각 ESP32 설정들을 확인 

#define configUSE_PREEMPTION			1
#define configUSE_IDLE_HOOK			1
#define configUSE_TICK_HOOK			1

#define configTICK_RATE_HZ				( CONFIG_FREERTOS_HZ )    //Tick Time 100Hz, Linux 와 동일 

#ifdef SMALL_TEST
#define configMAX_PRIORITIES			( 7 )
#else
#define configMAX_PRIORITIES			( 25 )           // 숫자가 높을수록 우선순위가 높음
#endif


.....

#define configAPPLICATION_ALLOCATED_HEAP 1                // Heap 사용여부 결정, heap_1/2 or 4.c 사용시 ucHeap 와 array 와 dimension 사용  
#define configTOTAL_HEAP_SIZE			(&_heap_end - &_heap_start) // Size를 직접 넣거나, Linker Scirpt에서 설정 
//esp32의 heap의 구성 (heap 3으로 추정)


#define configSUPPORT_DYNAMIC_ALLOCATION    1
ESP32의 FreeRTOSConfig.h 


FreeRTOS Memory Management (Heap)

ESP32 Memory Management


1.2  FreeRTOS의 Scheduler 

Vxworks 처럼 Schduling  알고리즘이 여러 개 존재하여 선택가능할 줄 알았는데, 현재 찾아본 것으로는 없는 것으로 보인다.
기본적으로 운영되어지는 Scheduling 알고리즘을 우선적으로 파악하고 특징을 좀 알아야겠다.

  • Scheduler 동작 on/off
vTaskStartScheduler/vTaskEndScheduler

  • FreeRTOS의 우선순위 와 Scheduling 알고리즘
아래글을 읽어보면, 우선순위는 숫자가 높을수록 높으며, Round-Robin이 기본인것 같음 
하지만 상위 FreeRTOSConfig.h을 보면 숫자가 높으면, 우선순위가 높다 

  • FreeRTOS의 기본 및 동작방법 확인
RTOS이니 선점방식이 지원될 것이며, 처음에 각 Scheduing 알고리즘설정부분이 있을 줄 알았는데, 아직 찾지못함

Real-Time Scheduling
아래의 링크의 그림을 보면 선점방식으로 동작되는 것을 알수 있음 (높이가 우선순위)
RTOS에서 좀 애매한 것은 우선순위에 대한 Queue의 설명이 없음, 추후에 다시 확인 
  
FreeRTOS의 Scheduling 관련개념자료
보통 Priority Queue 관련설명도 같이 해주는데, 그 부분이 없음  


1.3 FreeRTOS의 AMP/SMP 방식  


ARM용 Multi Core방식소개 
오래전에 ARM용 Multi Core 방식을 간단히 정리 

  • FreeRTOS의 Single-Core 와 Multi-Core 의 RTOS Scheduling
  1. Single-Core: default
  2. AMP(asymmetric multicore): multiple kernel multi-core
  3. SMP(symmetric multicore): one kernel multicore (Linux에서 많이 사용하며 ARM용)

  • Single Core
Single Core의 경우 고정된 우선순위 선점 Scheduing 과 Round-Robin의 Time-slicing 방식 
한마디로 각각의 우선순위 Level 1 ~ 128 를 만든 후 각각 Level 독자 공간에 Round-Robin 방식으로 돌리는 방식  (Vxworks도 거의 동일)
상위방식으로 하면 우선순위가 높으면 항상 선점되어 돌려지며, 동일한 우선순위는 Round-Robin 방식으로 돌아감 
(주의, Scheduler 알고리즘은 Round-Robin 이외 FIFO 등 선택해서 사용하지만, 상위에 언급했듯이, FreeRTOS는 아직 발견못함)

  • AMP(asymmetric multicore)
Multi-Core일 경우 사용하며, 비대칭형으로 2개의 경우, 각 Core마다 각 FreeRTOS를 생성구축하며, 중요한 것은 Parrellel Programing 별도로 진행
말이 좀 어려운가?, 간단히 설명해서 각 Core마다 각 Scheduler가 개별존재.
사실 거의 잘 안쓴다. 
(하지만, 필요할 경우가 있으며, 각 Core가 독자적으로 각 Scheduler 에 따라 동작하기 원할 경우)

  • SMP(symmetric multicore)
Multi-Core 사용시 가장 일반적으로 사용하는 방식으로 FreeRTOS가 직접 각 Core를 Control하는 방식이며, Linux에서도 많이 사용되어진다.
한 마디로 1개 Scheduler 가 각 여러 Core들을 관리하며 동작하는 방식이다. 

FreeRTOS의 Single/AMP/SMP

FreeRTOS의 SMP관련정보 

ESP32의 SMP 관련정보 
개인적으로 궁금한 것은 Cache는 어떻게 운영이 되는지가 궁금하며, 각자 Cache로 사용하는지 공용 Cache로 사용하는지는 추후 알아보도록하자 

  • ESP32 Interrupt 
Interrupt의 경우도 현재 우선순위가 있는 것로 보아서 Nested Interrupt (중첩 인터럽트) 허용하는 것으로 보인다. 
추후 좀 더 자세히 읽고 파악한 후 관련부분 수정 
  1. ESP_INTR_FLAG_IRAM
  2. ESP_INTR_FLAG_LOWMED
  3. ESP_INTR_FLAG_HIGH



1.4  FreeRTOS의 API  

기본적인 통신방법인 Queue 와 Semahpore 를 좀 알아보도록 하자 

  • Queue API 
처음 Queue  사용하면서 Queue 사이즈를 알 수가 없어 사용하기가 불편하며, 솔직히 잘 구현된 API는 아닌것 같다. 

Queue의 Size 문제를 알지 못해 회사지인이 알려주어, 아래 함수로 Queue 사이즈 확인가능하나, 불편하다. 
참고로, Counting Semaphore도 제공하며, 상위 Queue도 본인이 원하면, Counting Semaphore로 구현가능하다. 

  • Semaphore API 
일반 2진 Semaphore 역시 Data Sync용이 아닌 Signal Event 용으로 잘 동작되지가 않는다. 
강제로 이진 Semaphore를 내부 값을 0으로 만든 다음 Singal 용으로 Take /Give로 Task를 Control하려고 했는데 아예 동작되지 않는다.
이유는 아래에 별도의 Task용 Semahphore 제공해서 그런거 같다.  
(Semaphore 동작은 아주 간단하다 값이 0이되면 Task Blocking 되는 시스템) 
 
  • ISR 용 Semaphore
재미 있는 것은 ISR용 SemaphoreTake가 있는데, Blocking Time을 허용하지 않는다고 함
Linux Kernel 의 보통 필요할 경우, Spin lock을 사용한다 (Spin lock 과 Semahpore 다름)

  • Task Control Semaphore 
즉 Signal 목적으로 사용할 경우 아래 함수로 사용하면 될 것 같다. 

지속적으로 관련함수, 즉 API들을 파악 중이지만, 익숙해지는 수 밖에 없는 것으로 보인다. 
FreeRTOS는 무료이고, MCU/MPU 혹은 ESP32 기반에 사용하니 일단 좀 더 공부를 해야 할 것 같다. 




1.6 ESP32의 app의 Version 

OTA를 진행할 경우, application binary format안에 다음 구조체가 존재하며, image안에서 쉽게 볼수 있다. 

  • esp_app_desc 구조체 
PROJECT_VER 값

2. ESP32의 FreeRTOS Task의 Memory 관리 


  

configSUPPORT_DYNAMIC_ALLOCATION


xTaskCreate ->xTaskCreatePinnedToCore

xTaskCreatePinnedToCore

xTaskCreatePinnedToCore
내부 heap (pvPortMallocTcbMem/pvPortMallocStackMem)
MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT

ESP32의 Task Heap 관리
Task Heap 확인 
heap_caps_get_free_size(MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)

configSUPPORT_STATIC_ALLOCATION

외부에서 설정가능 

xTaskCreateStatic->xTaskCreateStaticPinnedToCore

xTaskCreateStaticPinnedToCore


Coredump (Flash)

SPIRAM Config

COMPONENT_EMBED_FILES
COMPONENT_EMBED_TXTFILES

Performance

ESP32의 내부 회로도 확인 
  1. SPI Flash는    QPI/QSPI지만, 일반 SPI Interface 이용     (Data bus: 1bit)
  2. SPI PSRAM는 QPI/QSPI Interface                              (Data bus: 4bit)
  3. 둘다 같은 Bus를 이용하므로 동시사용은 불가능 CS에의 선택 

SPI Flash /SPI Memory Bus는 공유 회로도 확인
문제는 같은 버스라서 동시사용이 불가능 

SPI의 XIP 자료(QSPI) 
SPI 의 XIP의 이용은  QSPI를 이용하여 4bit Parallel 로 통신하여 가능 (Nor의 16/8) 보다가 4bit는 나도 신기할뿐

SPI의 XIP(Execute in place)의 구성 
  1. SPI-SRAM에서는 
  2. SPI Flash에서는 XiP가 가능한걸로 보임 Serial로 Command/ Address/ Data 형식  
Nor Flash의 경우는 Address Bus/Data bus Parallel 이며 존재하므로 XIP가 Read로 가능하지만, SPI Flash도  역시 가능하다고함 


Cypress의 QSPI RAM Datasheet
구조를 보면 , Command / Address / Data 방식으로 전달하여 XiP가 가능함 

ESP32의 Techincal Reference

ESP32 Hardware Degine Guide

ESP32의 Cache Policy 확인

ESP SPI의 DIO/QIO


esptool.py -p COM5 flash_id
Manufacturer: 20 // 0x20: ST ID
Device: 4016   // 0x4016  WINBOND_NEX_W25Q32_V
Detected flash size: 4MB
Hard resetting via RTS pin...


Coredump
  assert(0)   test 진행


3. FreeRTOS Task 정보 와 IDE 관련사항  


FreeRTOS의 전체 Task 정보와 각 실시간 통계 및 점유율을 비롯하여 우선순위들을 알려고자 할 때 아래의 함수들을 이용하도록하자. 


3.1  FreeRTOS의 실시간 통계 및 모니터 

Linux 처럼 각 Task의 점유율과 각 상태의 통계를 알고 싶어 찾기 시작했으며, 관련함수들을 찾았는데, 
간단히 시험만 해보았다. 

  • Run Time Statistics


  • Task의 점유율 확인 
vTaskGetRunTimeStats 함수로 FreeRTOS의 각 Task의 점유율을 쉽게 볼수 있다. 
{
    char dbgBuffer[ 1028*4 ];
    
    printf("Task            Abs-Time       Per-Time       \n");
    printf("----------------------------------------------\n");   
    vTaskGetRunTimeStats( dbgBuffer );
    printf("%s",dbgBuffer);
}

관련정보 및 설정확인 

  • Task 의 상태 및 우선순위 확인 
vTaskList 함수로 FreeRTOS의 각 Task의 아래 정보를 확인 ESP32의 경우 Core도 확인

{
    char dbgBuffer[ 1028*4 ];
    
    printf("Name          State    Prio     Stack   Num    Core? \n");
    printf("-----------------------------------------------------\n");   
    vTaskList( dbgBuffer );
    printf("%s",dbgBuffer);
}
관련정보 및 설정확인 



vTaskList 예제 


3.2  ESP32의 FreeRTOS IDE 관련내용

현재 ESP에서 Ecplise 에 OpenOCD 기반 제공을 해주고 있지만, 아래와 같이 Cadence에서 별도로 제공을 해주는 것으로 보임 

Ecplise 기반의 OpenOCD 연결 

VS Code 기반의 OpenOCD 연결 

Tensilica FreeRTOS IDE 관련내용 
Cumtomized Ecplise된 Ecplise인 것 같으며 추후 각각 사용해보고 비교 
  

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 사용부분 참조하시길 


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