2009-11-24 4 views
6

В целях обучения я намереваюсь приступить к созданию эмулятора микроконтроллера 8051. Мне удобно программировать на C/C++/C#. Это не классный проект и т. Д., А инициатива обучения с моей стороны.Как сделать эмулятор 8051

Я нашел довольно много вопросов, обсуждая это. Тем не менее, я хотел разбить его немного на гранулированном уровне, чтобы я мог знать, в каких областях мне нужно сосредоточиться, прежде чем я начну писать код.

Мои первоначальные требования:

  1. текстовый редактор (можно использовать управление EditBox), где пользователь может написать код сборки

  2. Validate, если синтаксис является правильным

  3. Есть небольшое окно который показывает значения регистра во время выполнения.

  4. Когда пользователь запускает программу, инструкции должны быть шаг за шагом обновлять окна регистра.

Больше, чем элемент GUI, мне больше интересно узнать, как эмулировать микроконтроллер.

Я так понимаю, я могу дополнительно разбить его:

  1. мне нужно иметь справочную таблицу для получения инструкций или какой-либо другой способ хранения доступные инструкции и проверки синтаксиса. Любые указатели, как реализовать это, пожалуйста, дайте мне знать.

  2. Как эмулировать каждую инструкцию для 8051?

  3. Для регистров я могу использовать un/signed integers на основе типа и обновлять таблицу.

  4. Поскольку микроконтроллер имеет ограниченную оперативную память, как я могу проверить длину кода или, скорее, код, который выполняется в памяти, чтобы избежать переполнения буфера или других проблем.

Если есть какие-то проекты с открытым исходным кодом, которые подробно описывают, как эмулятор строится на земле, оценят.

+2

@Kavitech Singh. Как ваш проект сейчас? –

ответ

7

Я думаю, вы немного неясны в отношении объема этого проекта, по крайней мере, связанного с названием.

эмулятор выполняет двоичный код и ничего больше. Эмулятор не включает редактор (это инструмент разработки), а также ассемблер (то же самое). Обязанность ассемблера выполнять проверку синтаксиса и перевод, таким образом, у эмулятора есть только относительно простая работа по выполнению предварительно проверенного юридического кода.

Похоже, вы хотите построить полную среду IDE. Это обернет много графического интерфейса вокруг редактора, ассемблера и эмулятора. Я оставил бы этот шаг как последний.


Что касается ваших вопросов, касающихся самого эмулятора:

Вы можете использовать массив до (например) 64K байт в оперативной памяти эмулятора. Вы используете переменные в своей программе для эмуляции регистров. Я бы использовал unsigned char * для эмуляции счетчика программ и int s для большинства других вещей ...

Операция довольно проста: запустите счетчик программ в 0 (или предварительно определенное место для загрузки) и запустите цикл, который извлекает инструкции через этот указатель и применяется к регистрам и памяти, независимо от того, какая операция связана с инструкцией. Простая реализация будет сосредоточена вокруг огромного оператора switch, который включает в себя все возможные коды команд.

Как я уже сказал, вашему эмулятору не нужно беспокоиться о незаконных инструкциях, потому что ассемблер не должен производить никаких действий. У вас может быть ваша программа (т. Е. Основной цикл), если она попадает в незаконную операцию.

Аналогично, вашему эмулятору не нужно беспокоиться о превышении диапазона, индекса или размера ... это также проблема ассемблера или, может быть, компоновщик, если он у вас есть.


Update: несколько указателей от прямо здесь в SO:

Emulator Framework

+1

Или, по крайней мере, сделать это отдельными проектами. – ziggystar

+0

Carl: Вы правы, говоря, что я ищу тип среды IDE. Тем не менее, умысел состоит в том, чтобы иметь не очень привлекательные функции графического интерфейса, такие как подсветка синтаксиса и т. Д. Чтобы сделать это очень просто, я мог бы использовать небольшой editbox в главном окне, пользователь может ввести несколько инструкций и запустить код. Больше интересует, как на самом деле команды будут эмулироваться/имитировать на ПК. –

+0

Я добавил несколько подробностей. Те должны помочь вам в этом аспекте вашего вопроса. –

6

Недавно я собрал эмулятор для чипа AVR, который также является небольшой 8-разрядный микроконтроллер. Источник находится на GitHub как ghewgill/emulino. Самый интересный файл - cpu.c, который содержит реализации для каждой инструкции ЦП. Основные линии в cpu_run() (опуская некоторые подробности):

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

Это загружает 16-битное слово из памяти программы, на которую указывает регистр PC, а затем использует это в качестве индекса в таблице переходов инструкции (которая представляет собой массив объектов размером 64 тыс. - фактическая таблица генерируется скриптом во время компиляции). Эта функция будет одной из функций 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

Greg: Спасибо за ссылку. Может ли он быть скомпилирован под визуальную студию 2005/2008? Любая дополнительная документация, которая может помочь мне легко понять вашу работу. Также подробно о чипе, который вы эмулируете? –

+0

это чип http://www.atmel.com/products/AVR/ –

+0

Я только построил его под OS X, но он должен быть достаточно портативным. Там никаких гарантий нет (патчи приняты!). Чип, который он имитирует, является ATmega168P, вы можете получить техническое описание: http://www.atmel.com/dyn/products/datasheets.asp?family_id=607 –

Смежные вопросы