[IDEC] ARM Cortex-M 프로세서 기반의 펌웨어 설계실무 2

2023. 8. 10. 16:08Embedded/ARM Cortex

728x90
  • 파이프라인

임베디드 시스템에서의 파이프라인은 프로세서의 성능을 향상시키기 위해 사용되는 중요한 개념이다. 파이프라인은 명령어 실행 과정을 여러 단계로 나누어 동시에 여러 명령어가 실행될 수 있도록 하는 기술이다. 이렇게 하면 단일 명령어의 실행 시간을 줄이고, 전체 시스템 성능을 향상시킬 수 있다. 명령어를 가지고 와서 비트단위로 분석하는 것이다.

 

sfp파일에 값이 변경되면 이 값에 따른 하드웨어가 반응을 한다.

 

Cortex -m의 메모리맵에선 pheripheral의 주소가 4천만번대이다.

 

Cortex m의 메모리맵에 맞춰서 주소를 입력해줘야 한다.

 

Peripheral2가지 존재 칩제조사가 만든 것과 cortex가 만든 것

 

Sfp파일 통해 하드웨어 설정 가능

System timer : 떨어지는 주기를 시스템 클럭에 맞춰서 설정가능

 

x값이 얼마로 설정해둬야 1ms로 맞출 수 있을까 (내부 클럭 : 72MHz)

è  X : 71999로 맞추면 1ms로 맞출 수 있다. 인터럽트를 줄지 말지 결정가능

 

 

1.초기값설정

2.주기설정

3.타이머가 0이될 시 arm core에게 인터럽트를 줄지 말지 결정

4. 클럭소스를  1로 하면 /  0으로 하면

 

카운터값이 0

시스템타이머가 인터럽트 요청을 받을 때 코어는 어떤역할을하는ㄴ가

-      main 함수 실행 -> 인터럽트 -> 무한루프 도는 중

-      시스템타이머는 벡터테이블에서 internal이다.

-      15 0x3c (xxxxxxx -> pc, 시스템 타이머에서 주소값나타냄. 해당 값의)

위의 값들은 배열로 만들어져있다.

 

어셈블리 명령어가 아닌 디렉토리 명령어

MySystemTimerIsr 디렉토리를 추가한다는 뜻

 

폴링 방식 인터럽트

Cortex m

Nor flash에 머신코드가 존재

 

Cortex-m의 코어는 nor flash의 머신코드를 들고와 수행한다. (main문의)

Nvic – 카운터값이 0이 되면 인터럽트를 주라고 코딩했다.

 

Pc0x3c번지의 4바이트를 읽으면 함수의 에섬블리 명령어에 해당하는 주소를 읽어온다.

시스템 타이머 -> nvic -> core -> core에서 시스템 타이머의 nvic에 해당하는 인터럽트를 nor flash의 벡터테이블에서 읽어온다. ->nor flash의 벡터테이블에서 읽어온 함수의 주소에 있는 변수를 sram에서 읽어온다(core) -> core에서 연산 한다. -> 결과값 반환한다. (주소값에 맞는)

 

#define rSCSR (*(int *) 0xE000E010)
#define rSRVR (*(int *) 0xE000E014)
#define rSCVR (*(int *) 0xE000E018)
	
unsigned int gTickCount;

//it use systemtimer
void MySystemTimerIsr(){
	gTickCount = gTickCount + 1;
}
void main(){
		
	rSRVR = 72000 - 1;
	rSCSR = 7;

인터럽트 서비스 루틴은 시간이 많이 걸리지 않는 작업을 걸어주는 것이 좋다.

è  많이 걸리는 것은 MAIN문에서 작업하는 것이 좋다.

 

 

 

인터럽트 주변장치 IP가 인터럽트를 주고 PROCESSOR가 받는다.

인터럽트 마스크 = 인터럽트를 ENABLE / DISABLE한다는 것

마스크 = 임베디드에서 마스크는 금지한다는 뜻

레퍼런스 매뉴얼에 해당 절대주소들이 나온다.

모든 하드웨어 제어를 SFP를 통해 하고 있다.

 

 

팬딩 = 인터럽트 서비스 루틴을 처리하기 전까지의 기다리는 시간

 

Center key PA2 -> EXTI -2 -> irq8 (이 부분부턴 processor))

arm core는 시스템 타이머로부터 1ms 주기로 동작

이 함수의 주소 / 벡터테이블의 0x60exit_2_isr함수를 집어넣는다.

 

프로세서는  while루프에서 돌고있다 키 누르는 순간 irq8로 요청을 받는다(cortex m irq로 요청받음) 그렇다면 메모리맵의 0x60번지에 있는 exit_2_isr에 있는 함수를 pc에 넣는다.

 

EXTISMT32 (칩 제조사)

IRQ ARM cortex (arm)

 

ISER = ISER | (0xIF<<6)

ISER = (0xIF<<6)

 

인터럽트가 만약 중첩으로 들어온다면 우선순위에 따라 인터럽트가 작동된다.

 

UP : EXTI – 0 (IRQ6)

RIGHT : EXTI – 4 (IRQ10)