점프 테이블이 뭐죠?
누가 점프 테이블의 메커니즘과 임베디드 시스템에 필요한 이유를 설명할 수 있습니까?
점프 테이블은 함수에 대한 포인터의 배열 또는 기계 코드 점프 명령의 배열일 수 있습니다.비교적 정적인 함수 세트(시스템 호출이나 클래스의 가상 함수 등)가 있는 경우 이 테이블을 한 번 만들고 간단한 인덱스를 사용하여 함수를 배열로 호출할 수 있습니다.이는 포인터를 가져와 함수를 호출하거나 사용되는 테이블의 종류에 따라 기계 코드로 이동하는 것을 의미합니다.
임베디드 프로그래밍에서는 다음과 같은 이점이 있습니다.
- 인덱스는 머신 코드나 포인터보다 메모리 효율이 높기 때문에 제약이 있는 환경에서는 메모리를 절약할 수 있습니다.
- 특정 함수에 대해서는 인덱스가 안정적으로 유지되며 함수를 변경하면 함수 포인터를 교환하기만 하면 됩니다.
테이블 액세스에 약간의 퍼포먼스가 필요한 경우는 있습니다만, 이것은 다른 가상 함수 콜과 비교해도 손색이 없습니다.
점프 테이블은 일반적으로 유한 상태 기계에서 데이터 구동으로 사용하기 위해 사용됩니다(단, 배타적이지는 않습니다).
네스트된 스위치/케이스 대신
switch (state)
case A:
switch (event):
case e1: ....
case e2: ....
case B:
switch (event):
case e3: ....
case e1: ....
또는 2D를 호출하기만 .handleEvent[state][event]
분기 테이블이라고도 하는 점프 테이블은 일련의 명령으로, 모두 코드의 다른 포인트로 무조건 분기됩니다.
모든 케이스가 채워진 스위치(또는 선택) 스테이트먼트라고 생각할 수 있습니다.
MyJump(int c)
{
switch(state)
{
case 0:
goto func0label;
case 1:
goto func1label;
case 2:
goto func2label;
}
}
반환은 없습니다.점프된 코드는 반환을 실행하고 myjump가 호출된 곳으로 돌아갑니다.
이것은 상태 변수를 기반으로 특정 코드를 실행하는 상태 머신에 유용합니다.그 밖에도 여러 가지 용도가 있지만, 이것이 주된 용도 중 하나입니다.
스택을 만지작거리지 않고 코드 공간을 절약하기 위해 사용합니다.특히 인터럽트 핸들러에서는 속도가 매우 중요하며 인터럽트의 원인이 된 페리페럴은 1개의 변수에 의해서만 인식됩니다.이것은 인터럽트 컨트롤러가 있는 프로세서의 벡터테이블과 비슷합니다.
한 가지 용도는 0.60달러 마이크로컨트롤러를 사용하여 비디오 애플리케이션용 복합(TV) 신호를 생성하는 것입니다.마이크로파워는 강력하지 않습니다.사실 각 스캔 라인을 쓸 수 있을 정도로 거의 빠르지 않습니다.메모리에서 비트맵을 로드하는 데 시간이 너무 오래 걸리고 비트맵을 밀어내기 위해 for() 루프를 사용하기 때문에 점프 테이블을 사용하여 문자를 그릴 수 있습니다.대신, 문자와 스캔 행에 대한 별도의 점프와 실제로 포트에 데이터를 직접 쓰는 8개 정도의 명령이 있습니다.
-아담
Wikipedia에서:
컴퓨터 프로그래밍에서 분기 테이블(점프 테이블이라고도 함)은 분기 명령 테이블을 사용하여 프로그램의 다른 부분(또는 동적으로 로드되었을 수 있는 다른 프로그램)으로 프로그램 제어(분기)를 전송하는 효율적인 방법을 설명하는 데 사용되는 용어입니다.분기 테이블 구조는 어셈블리 언어로 프로그래밍할 때 일반적으로 사용되지만 컴파일러에 의해 생성될 수도 있습니다.
분기 테이블은 무조건 분기 명령의 시리얼 리스트로 구성됩니다.이 시리얼 리스트는 순차 인덱스에 명령 길이(각 분기 명령이 차지하는 메모리 내의 바이트 수)를 곱한 오프셋을 사용하여 분기됩니다.분기용 기계 코드 명령이 고정 길이를 가지며 대부분의 하드웨어에서 매우 효율적으로 실행될 수 있다는 사실을 활용하며, 순차 인덱스 값으로 쉽게 변환할 수 있는 원시 데이터 값을 처리할 때 가장 유용합니다.이러한 데이터가 주어지면 브랜치테이블은 매우 효율적입니다.보통 다음 단계로 구성됩니다.옵션으로 입력 데이터를 검증하여 허용 가능한지 확인하고 데이터를 오프셋으로 변환하며 명령 길이를 고려하여 데이터를 곱하거나 이동하며 주소로의 분기를 수행합니다.s는 테이블의 베이스와 생성된 오프셋으로 구성됩니다.이는 종종 프로그램 카운터 레지스터에 오프셋을 추가하는 것을 포함합니다.
위키피디아는 이를 꽤 잘 요약하고 있다.
컴퓨터 프로그래밍에서 분기 테이블(점프 테이블이라고도 함)은 분기 명령 테이블을 사용하여 프로그램의 다른 부분(또는 동적으로 로드되었을 수 있는 다른 프로그램)으로 프로그램 제어(분기)를 전송하는 효율적인 방법을 설명하는 데 사용되는 용어입니다.분기 테이블 구조는 어셈블리 언어로 프로그래밍할 때 일반적으로 사용되지만 컴파일러에 의해 생성될 수도 있습니다.
메모리 가격이 비싸고 CPU가 느리고 콤팩트한 데이터 표현과 효율적인 대체 선택이 중요했던 컴퓨팅 초기에는 브랜치 테이블 및 기타 원시 데이터 인코딩을 사용하는 것이 일반적이었습니다.오늘날에는 임베디드 프로그래밍 및 운영 체제 개발에 일반적으로 사용됩니다.
즉, 임베디드 플랫폼의 경우와 같이, 시스템의 메모리나 CPU가 지극히 한정되어 있는 경우에 사용하는 것이 편리합니다.
여기서는 점프 테이블에 대해 설명하지만 간략하게 설명하면 CPU가 특정 조건에 따라 점프해야 하는 주소의 배열입니다.예를 들어, C 스위치 문은 종종 점프 테이블로 구현되며, 여기서 각 점프 엔트리는 특정 "케이스" 라벨로 보내집니다.
메모리 사용량이 많은 임베디드 시스템에서는 대량의 if-else-if와 같은 메모리 집약적인 방법 대신 점프 테이블을 사용하여 더 나은 서비스를 제공합니다.
흔히 분기 테이블로 알려진 점프 테이블은 일반적으로 기계에서만 사용됩니다.
컴파일러는 어셈블리 프로그램의 모든 라벨 목록을 작성하고 모든 라벨을 메모리 위치에 링크합니다.점프 테이블은 함수나 변수, 또는 라벨이 메모리에 저장되어 있는 장소를 나타내는 참조 카드입니다.
즉, 함수가 실행되면 그 함수는 이전 메모리 위치로 돌아가거나 다음 함수로 넘어갑니다.
그리고 제가 생각하는 것은 임베디드 시스템뿐만 아니라 컴파일/인터프리터 환경에도 필요합니다.
브라이언 지안포르카로
언급URL : https://stackoverflow.com/questions/48017/what-is-a-jump-table
'programing' 카테고리의 다른 글
Vuex를 사용하여 사용자를 로그인 상태로 유지하는 방법 (0) | 2022.08.10 |
---|---|
Intelij IDEA Java 클래스가 저장 시 자동으로 컴파일되지 않음 (0) | 2022.08.10 |
ASCII 문자열 및 엔디안니스 (0) | 2022.08.10 |
Vue-test-utils 래퍼가 정의되지 않았습니다. (0) | 2022.08.10 |
코딩 규칙 - 명명 규칙 (0) | 2022.08.10 |