2009-11-24 6 views
6

학습 목적으로 i는 8051 마이크로 컨트롤러 에뮬레이터를 만들기 시작하려고합니다. 나는 C/C++/C#에서 편하게 프로그래밍 할 수있다. 이것은 수업 프로젝트가 아니지만 내 측면에서 학습 이니셔티브입니다.8051 에뮬레이터 만드는 법

나는이 논의의 질문을 꽤 많이 발견했다. 그러나 실제로 코드를 작성하기 전에 어느 부분을 집중해야 하는지를 알 수 있도록 세부적인 수준에서 조금 더 나누고 싶었습니다.

내 초기 요구 사항은 다음과 같습니다

  1. 텍스트 편집기 (편집 상자 컨트롤을 사용할 수 있습니다) 구문이

  2. 작은 창문이 맞다면 사용자가 어셈블리 코드를

  3. 유효성 검사를 쓸 수있는 곳 런타임시 레지스터 값을 보여줍니다. 사용자가 프로그램을 시작할 때

  4. , 지침은 레지스터 창을 업데이트 단계적으로해야한다.

GUI 요소 이상으로 저는 마이크로 컨트롤러를 에뮬레이션하는 방법을 알고 싶어합니다.

나는 그것을 더 분해 할 수 이해하는 방법은 :

  1. 나는 지침에 대한 룩업 테이블 또는 구문을 사용할 수 지침을 저장하고 확인하는 다른 방법이 필요합니다. 어떤 방법으로 이것을 구현할 수 있는지 알려주세요.

  2. 어떻게 8051에 대한 각각의 명령을 에뮬레이트합니까?

  3. 레지스터를 들어, 내가 유형에 따라 사용되지 않은/부호있는 정수를 가지고 테이블을 업데이트 할 수 있습니다.

  4. 마이크로 컨트롤러에는 제한된 RAM 메모리가 있기 때문에 오버플로 또는 기타 문제를 피하고 메모리를 막기 위해 코드 길이 또는 메모리에서 실행중인 코드를 어떻게 유지해야합니까?

감사하겠습니다 에뮬레이터 지상 업을 구축 방법을 자세히 일부 오픈 소스 프로젝트가있는 경우.

+2

@Kavitech Singh. 지금 당신의 프로젝트는 어떻게되어 가고 있습니까? –

답변

7

나는 당신이 제목에 적어도 관련이 프로젝트의 범위에 약간 불분명 것 같아요.

에뮬레이터 바이너리 코드 및 아무것도를 실행합니다. 에뮬레이터에는 편집기 (개발 도구) 또는 어셈블러 (동등한 것)가 포함되어 있지 않습니다. 구문 검사 및 변환을 수행하는 것은 어셈블러의 책임이므로 에뮬레이터는 사전 검증 된 법적 코드를 실행하는 것이 상대적으로 쉽습니다.

완전한 IDE를 만들고 싶습니다. 이것은 편집기, 어셈블러 및 에뮬레이터 주위에 많은 GUI를 래핑합니다. 나는 마지막 단계로 그 단계를 떠날 것이다.당신은 에뮬레이터의 작업 메모리로 (예를 들어) 64K 바이트까지의 배열을 사용할 수 있습니다

: 에뮬레이터 자체에 대한 질문에 대해서는


. 프로그램에서 변수를 사용하여 레지스터를 에뮬레이트합니다. 나는 unsigned char *을 사용하여 프로그램 카운터를 에뮬레이트하고, int은 대부분의 다른 것들에 대해 사용합니다.

작업은 매우 간단합니다 : 0 (또는 미리 결정된 부팅 위치)에서 프로그램 카운터를 시작하고 시작합니다. 그 포인터를 통해 명령을 가져 오는 루프와 명령과 관련된 모든 연산이 레지스터와 메모리에 적용됩니다. 간단한 구현은 가능한 모든 명령어 코드를 포함하는 거대한 switch 문을 중심으로 이루어집니다.

앞에서 말했듯이, 에뮬레이터는 불법 명령어에 대해 걱정할 필요가 없습니다. 왜냐하면 어셈블러는 어떤 것도 생성해서는 안되기 때문입니다. 불법적 인 조작을 당하면 프로그램 (예 : 메인 루프)을 정지시킬 수 있습니다.

마찬가지로 에뮬레이터는 범위, 인덱스 또는 크기 오버런에 대해 걱정할 필요가 없습니다. 이것은 어셈블러의 문제 또는 링커의 문제 일 수도 있습니다.


업데이트 : SO에서 바로 여기에서 몇 포인터 :

Emulator Framework

+1

아니면 적어도 별도의 프로젝트를 만드십시오. – ziggystar

+0

Carl : 당신은 IDE 유형의 환경을 찾고 있다고 말하고 있습니다. 그러나, 의도는 구문 강조와 같은 멋진 GUI 기능을 가지고있는 것입니다. 매우 간단하게하기 위해 기본 창에서 작은 editbox를 사용할 수 있습니다. 사용자는 몇 가지 지침을 입력하고 코드를 실행할 수 있습니다. PC에서 명령을 실제로 에뮬레이트/시뮬레이션하는 방법에 대해 더 많이 관심이 있습니다. –

+0

몇 가지 세부 정보를 추가했습니다. 그것들은 당신의 질문에서 당신을 도울 것입니다. –

6

최근에 나는 또한 작은 8 비트 마이크로 컨트롤러 인 AVR 칩, 함께 에뮬레이터를 넣어. 소스는 GitHub에 ghewgill/emulino으로 있습니다. 가장 흥미로운 파일은 각 CPU 명령어에 대한 구현을 포함하는 cpu.c입니다. 핵심 라인 cpu_run() (일부 세부 사항을 생략)에 : 이것은 PC 레지스터에 의해 프로그램 메모리에서 16 비트 워드 지적을로드

while (state == CPU_RUN) { 
    u16 instr = Program[PC++]; 
    Instr[instr](instr); 
} 

, 다음 사용하는 (명령 점프 테이블에 인덱스로하는 함수 포인터의 64k 배열입니다. 실제 테이블은 컴파일 타임에 스크립트에 의해 생성됩니다. 이 함수는 해당 소스 파일의 do_XXX() 함수 중 하나가되며 실제 명령어를 실행하기 전에 추가 명령어 디코딩을 수행 할 수 있습니다. 예를 들어, do_ADD() 기능 :

static void do_ADD(u16 instr) 
{ 
    trace(__FUNCTION__); 
    // ------rdddddrrrr 
    u16 r = (instr & 0xf) | ((instr >> 5) & 0x10); 
    u16 d = ((instr >> 4) & 0x1f); 
    u8 x = Data.Reg[d] + Data.Reg[r]; 
    Data.SREG.H = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x08) != 0; 
    Data.SREG.V = (((Data.Reg[d] & Data.Reg[r] & ~x) | (~Data.Reg[d] & ~Data.Reg[r] & x)) & 0x80) != 0; 
    Data.SREG.N = (x & 0x80) != 0; 
    Data.SREG.S = Data.SREG.N^Data.SREG.V; 
    Data.SREG.Z = x == 0; 
    Data.SREG.C = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x80) != 0; 
    Data.Reg[d] = x; 
    Cycle++; 
} 

이것은 그 결과에 기초하여 모든 다양한 조건 플래그를 실제 가산 동작 (Data.Reg[d] + Data.Reg[r]) 설정 않는다.

+0

그렉 : 감사합니다. Visual Studio 2005/2008에서 컴파일 할 수 있습니까? 작업을 쉽게 이해하는 데 도움이되는 추가 문서. 또한 에뮬레이트 한 칩에 대한 세부 정보가 있습니까? 이 칩은 –

+0

입니다. http://www.atmel.com/products/AVR/ –

+0

저는 OS X에서만 만들었지 만 이식성이 있어야합니다. 아무런 보증도 없습니다 (패치는 받아 들여졌습니다!). 그것이 에뮬레이트 칩은 ATmega168P, 당신은에서 데이터 시트를 얻을 수 있습니다 : http://www.atmel.com/dyn/products/datasheets.asp?family_id=607 –