8051 Code Banking

6049 단어
방금 8051 메모리 모델을 다 썼는데 오늘 여러분과 함께 8051의 코드 페이지 나누기 메커니즘(code banking)을 보겠습니다.만약 의문이 있으면 저와 의논해 주십시오.
Contiki가 지원하는 플래시 크기는 주로 두 가지로 나뉘는데 하나는 256KB(cc253x) 또는 128KB(snsinode)이다.앞에서 말한 바와 같이 8051 memory spaces, flash는 주로 코드 저장 공간에 비치고 너비는 16bit이며 주소 찾기 범위는 64kb에 달한다.
우선 궁금한 게 있는데 왜 코드 뱅킹을 해야 하나요?일반적인 것은 표준 8051 부품이 64KB의 코드 공간을 찾을 수 있다는 것이다.64KB가 넘는 코드에 대해 단편기 시스템은 일반적으로 코드 페이지 나누기(CODE BANKING) 방식으로 프로그램 공간을 확장한다.코드 페이지의 기리는 주소 공간을 64KB보다 작거나 같은 다른 코드 섹션으로 나누어 선택된 방식을 통해 프로그램이 서로 다른 코드 공간에서 이동하는 것을 실현하는 것이다.
이 글은 당연히 기초적인 것들을 묘사하고 contiki가 지원하는 soc만을 대상으로 한다.자세히 참고하려면 마지막reference list를 보십시오
(오리지널 지원, 전재하려면 주소:http://blog.sina.com.cn/litianping0709저자: 예우음성(아우)
 
How does it Work
뱅크라는 게 뭐예요?플래시가 분해된 64KB보다 작거나 같은 코드 세그먼트를 뱅크라고 부른다.서로 다른 설비의 뱅크 수량은 반드시 같지는 않지만 기술은 같다.각 뱅크의 크기는 32KB이기 때문에 cc2430에는 4개의 뱅크가 있고 cc2530에는 8개의 뱅크가 있다.
플래시의 크기가 64KB를 초과하기 때문에, 우리는 어쩔 수 없이 세 바이트를 이용하여 주소를 찾아야 한다.예를 들어 cc2530의 물리적 주소 범위는 ox000000에서 0x03fff이다.
 
Common Segment
flash의 낮은 주소 위치의 32KB(물리적 주소 0x000000에서 0x007fff)는 일반적으로common segment(HOME 또는 BANKO)라고 불리며, 항상 코드 저장 공간의 낮은 32KB로 주소를 찾는다(0x0000-0x7fff).
 
Switched Segments
코드의 높은 32KB 주소 공간(0x8000-0xfff)은 주로 나머지 N-1 코드 세그먼트를 찾는 데 사용된다.주어진 시간 내에 하나의segment만 가리킬 수 있습니다.특수한 레지스터를 통해 칩이 현재 생각하고 있는 뱅크가 무엇인지 알려주는데 레지스터는 일반적으로 PSBANK 또는 FMAP라고 부른다.
 
Physical and Virtual Addresses
다음 표는 물리적 주소(on flash), 코드 저장 공간의 주소와 해당 FMAP 레지스터 사이의 값을 보여 줍니다.
Mapping between physical and virtual addresses and the value of FMAP
Segment
Physical Address
Virtual Address
FMAP
Address in CODE
HOME
0x000000 - 0x007FFF
0x000000 - 0x007FFF
0x00
0x0000 - 0x7FFF
BANK1
0x008000 - 0x00FFFF
0x018000 - 0x01FFFF
0x01
0x8000 - 0xFFFF
BANK2
0x010000 - 0x017FFF
0x028000 - 0x02FFFF
0x02
0x8000 - 0xFFFF
BANK3
0x018000 - 0x01FFFF
0x038000 - 0x03FFFF
0x03
0x8000 - 0xFFFF
...
BANK7
0x038000 - 0x03FFFF
0x078000 - 0x07FFFF
0x07
0x8000 - 0xFFFF
 
The Problem
지금까지 상술한 메커니즘은 비교적 간단하게 들리지만, 모두가 xbank의 코드가 ybank의 코드를 호출하기를 희망할 때 어떻게 해야 하는지 모르겠습니다.만약 뱅크를 전환하기 전에 해당하는 코드를 호출하면 오류가 발생할 것이다.만약에 호출하기 전에 해당하는bank로 넘어간다면 호출자는 이미 전환되고 호출도 불가능하다.
 
Writing Banked Software with SDCC
이 문제를 해결하기 위해 SDCC는trampoline라고 불리는 기술banked 함수 호출을 사용하여common segment에 있는 작은 인터페이스diate 코드 세그먼트를 통해 실현했다.간단히 설명하기 위한 절차는 다음과 같다.
caller:
RO, R1, R2에 호출할 함수의 주소를 입력하고 뱅크 번호를 포함합니다.
Invokes the trampoline (banked call)

The trampoline:
현재 뱅크의 정보를 Stack에 쓰기 새 뱅크 로드호출 함수
The callee:
Runs (and possibly makes more banked calls)
Returns to the trampoline (banked return)

The trampoline:
Loads the original bank (which is read from stack)
Returns to the caller

Normal vs Banked Calls
분명히 상술한 호출은 Stack과 호출에 대한 비용이 증가하지만banked 호출이 상대적으로 적다는 것을 우리는 알고 있다.
 
SDCC Memory Models
앞서 언급한 8051 memory spaces와 같이 SDCC는 그 중의 모델 중 하나를 이용하여 실행 가능한 프로그램을 구축한다.
 
Small, Medium and Large - Explicit Banking  
small,medium,large에 대해 개발자는banked 함수를 현저하게 호출해야 한다.
함수 선언에는 이 있어야 합니다.banked 키워드함수 원형도 필요banked 키워드예:
void foo() __banked; void bar() __banked
{
foo();
 
 
}

Huge - Implicit Banking  :  
허그 모델에 대해 말하자면 모든 함수 호출/반환은trampoline를 호출한다.예를 들다.
void foo();
void bar()
{
 
   foo();
 /* This automatically becomes a banked return */
}
Here be Dragons
물론 상술한 특성은SDCC의 불문율적인 특성이므로 당신이 어떻게 사용하느냐에 달려 있다.
코드 공간을 줄이고 성능을 향상시키기 위해nonbanked 키워드를 사용하여 SDCC에서 banked 호출/반환이 발생하지 않도록 합니다.
보안을 위해 다음 규칙을 따르는 것이 좋습니다.
사용 보장nonbanked 키워드의 함수는common segment에 있습니다.
switched segment에 존재하는 함수에 대해 같은 segment에서만 호출하면 이 있음을 설명하는 것이 좋습니다nonbanked 키워드입니다.
Bank Allocations
sdcc 개발 프로그램을 사용할 때 개발자는 모든 코드 세그먼트가 어느 segment에 존재하는지 지정해야 합니다.이것은 #pragma directive 또는 명령줄에서 지정할 수 있습니다.여기서 주로 강조하는 것은 링크기가 뱅크의 넘침을 검사하지 않는다는 것이다.같은 segment에 너무 많은 파일을 분배하고 32KB 크기를 초과하면 문제가 발생할 수 있습니다.
 
Banking in Contiki's 8051-based Ports
contiki의 컴파일링 시스템은banking-aware입니다. examples/cc2530dk 또는 examples/sensinode의makefile 파일을 보십시오. 이 줄을 보실 수 있습니다:HAVEBANKING=1;
HAVE_BANKING 옵션은 컴파일러에 bankable 미러링이 생성되는지 여부를 알려줍니다.
하면, 만약, 만약...BANKING이 정의되지 않고 uIPv6를 지원한다면 HAVEBANKING은 1이 되고 그렇지 않으면 0이 됩니다.
만약 뱅킹이 필요하다면 시스템은huge모드를 이용하여 전체 시스템을 컴파일할 것이다만약 뱅킹이 지정되지 않으면 시스템은 lage 모드를 이용하여 전체 시스템을 컴파일한다컴파일링이 끝나면 일부 정보 출력을 볼 수 있습니다. 이 정보는 오류가 발생하지 않도록 분배 상황을 검사하는 데 도움을 줄 수 있습니다.
 
Code Segment Sizes and memory footprint
마지막으로 출력된 정보는 다음과 같다.
 
위의 정보를 보면 뱅크가 넘치거나 다른 문제가 있는지 판단할 수 있습니다.
Decimal 아래에 나열된 값의 크기는 32768보다 작아야 합니다.
sensinode 장치의 경우 BANK3 값이 30720 이하여야 합니다.
Automatic Bank Allocation
sdcc banking을 이용하여 컴파일할 때, 분배기는segment의 크기를 자동으로 만족시킬 것입니다. 새로운 인터럽트 서비스 프로그램을 쓸 때, 분배기에 이 프로그램이 HOME bank에 있어야 한다는 것을 알려주십시오.다음과 같은 두 가지 방법이 있습니다.
파일을 intr.c 끝, 예를 들어 foointr.c 또는bar-intr.c.분배기가 intr에 닿습니다.c 마지막 파일은 자동으로 HOME bank 공간에 할당됩니다.
하지만 파일 이름을 foo처럼 바꾸고 싶지 않다면.c (intr.c로 끝내기를 원하지 않음), cpu 폴더에 있는segment.rules 파일에 행 추가: HOME foo.c 가능하지만 새로운 ISRs를 쓰고 싶지 않다면 어떤 것도 걱정할 필요가 없다.
컴파일링의 마지막 단계에서 분배기가 실행되면 다음과 같은 정보가 발생합니다.
 
Preallocations로 시작하는 줄 뒤에 옮길 수 없거나 없는 바이트 수가 표시됩니다.예를 들어, ISRs를 포함하는 표준 라이브러리나 파일은 HOME segment에 있어야 합니다.
Segment - max - alloc은 상대적으로 중요합니다. 마지막 열은 컴파일링이 끝난 후 각segement의 바이트 크기를 보여 줍니다.여기에 나열된 값의 크기는 Decimal 아래에 나열된 값의 크기를 기다려야 합니다.
 
reference list
The SDCC manual. Look for the section entitled 'Bankswitching'.
Section 2.2.2 'CPU Memory Space' of the 'CC253x/4x User Guide (Rev. C)' (Literature Number: SWRU191C April 2009–Revised January 2012)
Section 11.2.2 'CPU Memory Space' of the 'CC2430 Data Sheet (rev. 2.1)' (Literature Number: SWRS036F)

좋은 웹페이지 즐겨찾기