Site Loader

Настройка IDE Arduino для генерации листинга на ассемблере

Порой возникает необходимость в изучении кода, генерируемого компилятором. Это помогает понять, что получается «на выходе» при использовании тех или иных функций, приемов, алгоритмов. Существуют специализированные инструменты — дизассемблеры, преобразующие машинный код в текст на языке ассемблера, но это в основном платные программы. Мне же в большинстве случаев вполне хватает результатов программы avr-objdump, которой и посвящена эта публикация.

avr-objdump — это программа, отображающая различную информацию из объектных файлов. Параметры, с которыми она вызывается, определяют, какая именно информация должна быть отображена. Например, для дизассемблирования объектного файла может быть использована следующая команда:

avr-objdump -d file_name.elf

Кому-то может больше понравиться дизассемблированный код с фрагментами исходного кода, где это возможно.

Пример вызова для получения такого результата:

avr-objdump -S file_name.elf

Полный список возможных параметров вы можете найти по ссылке: http://ccrma.stanford.edu/planetccrma/man/man1/avr-objdump.1.html

Хорошо, где взять avr-objdump и объектный файл? Первый входит в состав IDE Arduino и расположен в каталоге Arduino_dir\hardware\tools\avr\bin\, где Arduino_dir — это путь установки IDE Arduino.

Что касается объектных (elf) файлов, то они создаются средой разработки при компиляции проекта и находятся во временной папке скетча. Найти их можно следующим образом:

1. Если у вас еще не включен вывод сообщений при компиляции скетчей, то перейдите в окно настроек IDE Arduino и установите соответствующую опцию:

2. После компиляции скетча в последних строках, выводимых средой разработки, вы увидите примерно следующее:

Выделенный фрагмент — это временный каталог для текущего скетча, в него помещаются все файлы, генерируемые в ходе компиляции, в том числе объектный файл.

Остается перейти в этот каталог и скопировать elf файл в Arduino_dir\hardware\tools\avr\bin\. Теперь, когда у нас avr-objdump и объектный файл находятся в одном каталоге (конечно, это необязательно, если в командах указывать полный путь к файлам), запускаем командную строку и вводим одну из приведенных ранее команд для дизассемблирования с поправкой на имя файла. В моем случае команда выглядит так:

avr-objdump.exe -S sketch_jun18a.ino.elf

В интерпретаторе командной строки необязательно вводить имя файла целиком: достаточно ввести несколько первых символов, затем нажимать TAB, пока интерпретатор не подставит нужное имя.

Итак, выполняем введенную команду и видим весьма объемный результат ее работы:

Для вывода результата работы avr-objdump в файл воспользуемся перенаправлением вывода:

avr-objdump.exe -S sketch_jun18a.ino.elf > my_file.asm

При выполнении данной команды в каталоге с avr-objdump. exe будет создан файл my_file.asm, в который будет сохранен результат работы команды:

Данный способ дизассемблирования скетчей вполне рабочий, но его использование можно упростить после небольшой настройки IDE Arduino, о чем будет рассказано далее.

Я для генерации ассемблерного листинга использую команду меню Скетч->Экспорт бинарного файла среды разработки Ардуино. При таком способе результат дизассемблирования сохраняется в каталог скетча (вместе с hex файлом), не приходится лазить по временным папкам. Для настройки IDE Arduino на генерацию ассемблерного листинга выполним следующие действия:

1. Переходим в каталог Arduino_dir\hardware\arduino\avr\ и открываем файл platform.txt в текстовом редакторе.

2. Находим команды для сохранения hex файла и добавляем после них следующую строку:

recipe.hooks.savehex.postsavehex.1.pattern=»{compiler.path}/elf2asm.bat» «{compiler.path}avr-objdump» «{build.path}/{build.project_name}. elf» «{sketch_path}/{build.project_name}.asm»

Здесь мы используем так называемый хук, который выполняется после сохранения hex файла. Описание всех доступных хуков и самого файла platform.txt доступны по ссылке https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification. Ниже скриншот моего файла platform.txt после внесения указанных изменений:

3. Переходим в каталог Arduino_dir\hardware\tools\avr\bin\, создаем файл с именем elf2asm.bat и вставляем в него следующий текст:

%1 -S %2 > %3

Параметр -S определяет генерацию смешанного листинга. Использование bat файла обусловлено тем, что мы не можем использовать перенаправление вывода непосредственно в файле platform.txt.

На этом настройка IDE Arduino завершена. Можно переключиться в нее и проверить корректность работы, выбрав команду «Экспорт бинарного файла» в меню «Скетч». В каталоге со скетчем должен появиться файл с расширением asm.

Приведенный способ дизассемблирования скетча пригодится нам в следующей публикации для анализа кода и продолжения темы обработки прерываний.

Введение в программирование на машинном языке Arduino — Arxterra

Микроконтроллер AVR и встраиваемые системы с использованием ассемблера и C Мухаммад Али Мазиди, Сармад Наими и Сепер Наими

Вот некоторые из источников, которые я использовал для разработки материала, использованного в лекции. ряд.

0010 0111 0000 0000 → 1110 1111 0001 1111 → 1011 1001 0000 0111 → 1011 1001 0001 1000
1011 1001 0000 0100 → 1011 0000 0111 0110 → 1011 1000 0111 0101 → 1100 1111 1111101110 → 1011 1000 0111 → 1100 1111 11111101

1 0101 → 1100 1111 11111101

1 0101.0002 Напишите программу на ассемблере для включения и выключения света с помощью переключателя. Похожая программа использовалась при разработке The Wake-up Machine.

Важной частью этого курса является понимание дизайна и языка «Компьютера».

Компьютер реализует классический цифровой вентиль , который вы изучили в классе Digital Logic (EE201) в программном обеспечении с такими инструкциями, как and, or, и eor/xor.

Вам также придется плавно переходить от двоичного к шестнадцатеричному и обратно (т. е. Системы счисления ).

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

Наконец, вместо проектирования с помощью вентилей (EE201) вы будете проектировать с помощью кода. Таким образом, вам нужно будет просмотреть такие концепции Программирование , как: передача данных (выражения присваивания), арифметические и логические операторы, передача управления (ветвление и цикл), а также битовые и битовые тестовые операторы, которые вы использовали в своем классе программирования (CECS174 или CECS100). .

Хорошей новостью является то, что справка по доступна в Главе 0: «Введение в вычислительную технику» вашего учебника, в дополнительных материалах, приведенных в начале этого документа, в Интернете и в Приложении A – Системы счисления.

Числа и их компьютерное представление

Введение

Результат десяти пальцев с основанием 10 символ предшествует другому символу или следует за ним. Бывший. IV = 4 против VI = 6. Это была очень неуклюжая система для арифметических операций.

Позиционная запись (положительные действительные целые числа)

Дробные числа не будут рассматриваться, но следует отметить, что добавление указанного было бы простым и логичным дополнением к представленной теории.

Значение каждой цифры определяется ее позицией. Обратите внимание на произношение 256 «Двести пятьдесят шесть?

Пример. 256 = 2*10 2 + 5*10 1 + 6*10 0

Обобщение по любому основанию или основанию

Основание или основание = количество различных цифр, которые могут встречаться в каждой позиции в системе счисления.

N = A n r n + A n-1 r n-1 + … + A 1 r 1 + A 0 r 0   (or simple A 1 r + A 0 )

Введение в двоичную систему

Работа большинства цифровых устройств по своей природе является двоичной, они либо включены, либо выключены.

Примеры: переключатель, реле, лампа, транзистор и транзисторно-транзисторно-логическая интегральная схема (TTL IC)

Таким образом, для цифрового компьютера вполне логично использовать основание 2.

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

В двоичной системе допускается только 2 состояния; 0 и 1 (ЛОЖЬ или ИСТИНА, ВЫКЛ или ВКЛ)

Пример:      Старший бит

Бит = одна двоичная цифра (0 или 1)

Это уравнение, связанное с позициями, также дает нам инструмент для преобразования заданной системы счисления в основание 10 — в этом примере двоично-десятичный.

Основание восемь и основание шестнадцать

В начале разработки цифрового компьютера фон Нейман осознал полезность работы в промежуточных системах счисления, таких как основание 8 (или восьмеричное)

Путем группировки 3 двоичных цифр или битов формируется одна восьмеричная цифра . Обратите внимание, что 2 3 = 8

Двоина для восьмиугольника Таблица

2 2 2 1 2 0

0 0 = 0

0 0 1 = 1

0,00002 0 0 = 0 200

0 0. 0 = 1

0,0002 0 0 = 0

0 0 = 1

0. =  2

0 1 1 = 3

1 0 0 = 4

1 0 1 = 5

1 1 0 = 6

1 1 1 = 7 Символы (не числа) 8 и 9 не используются в октелале .

Пример: 100 001 010 110

4 1 2 6 8 = 4*8 3 + 1*8 2 + 2*8 1 + 6*8 0 = 2134

Это это еще один эффективный способ перехода от основания 2 к основанию 10

Резюме: Основание 8 позволяет вам работать на языке компьютера, не имея дело с большим количеством единиц и нулей. Это стало возможным благодаря простоте преобразования с основанием 8 в основание 2 и обратно.

В микрокомпьютерах используется группировка из 4 бит (вместо 3 бит) или основание 16 (2 4 ). Первоначально произносившийся шестнадцатеричным, основание 16 было быстро переименовано в шестнадцатеричное (на самом деле это должно быть основание 6).

Двоирный в шестнадцатеричный преобразование Таблица

2 3 2 2 2 1 2 0

0 0 0 = 0

0 0 1 = 1

0 0 0 0 = 0 = 0

0 0 0 = 1

0 0 0 0 0 0 = 0 0

0 0 0 = 1

0 0 0. 2

0 0 1 1   =  3

0 1 0 0   =  4

0 1 0 1 = 5

0 1 1 0 = 6

0 1 1 1 = 7

1 0 0 0 = 8

1 0 0 1 = 9

1 0 1 0 = A

1 0 1 1 = B

1 1 0 0 = C

1 1 0 1 = D

1 1 1 0 = E

1 1 1 1 = F

в HEX Символы для 10-15 из алфавита. Это показывает, насколько относительными являются числа на самом деле, или, другими словами, они действительно являются просто символами.

Пример:    1000 0101 0110

8        5       6 16  = 8*16 2 + 5*16 1 + 6*16 0 = 2134

требует небольшой практики.

Преобразование из базы 10 в заданное основание (или основание)

Последовательное деление            лучше всего продемонстрировать на примере

Чтобы получить цифры в правильном порядке, пусть они падают вправо.

Для этого примера:  43 10 = 101011 2 Быстрая проверка (октальная) 101 011 = 5*8 + 3 = 43 10

Другой пример: преобразовать 43 10 от десятичного к октально : 43 10 = 53 8              Быстрая проверка (восьмеричная) 5*8 + 3 = 43 10

Обобщение процедуры ИЛИ Почему это работает ИЛИ Почему это работает ИЛИ = A

0 9 остаток, а n = количество цифр в основании r для числа N. Деление обычно выполняется по основанию 10.

Еще один способ выразить вышеуказанную таблицу:

N = R*N 1 + A 0

N 1 = R*N 2 + A 1

9002 N 2 + A 1

9002 N 2 + A 1

9002 N 2 + A 1 9003 9002 N 2 + A 2 = R*N 3 + A 2

:

N N-1 = R*N N + A N-1

N N = R*0 + A n

или (теперь на рукоприкладство)

N   = r*(r*n 2 + A 1 ) + A 0 заменитель N 1

n = R 2 N 2 + RA 1 + A 0 2 + RA 1 + A 0 2 + RA 1 + A 0 2 + RA 1 + A 0 2 + RA 1 + A 0 2 + RA 1 + A 0 2 + R через уравнение

n = R 2 (R*N 3 + A 2 ) + RA 1 + A 0 Заместитель N 2

:

9006

N = N R N + A N-1 R N-1 +… + A 1 R 1 + A 0 R 0

Nomenclat

бит = 1 бинарная цифра

байт = 8 бит

Nibble = один половина байта = 4 бита

слово = компьютерный зависимый

Двоина арифметика

Двонное добавление

Двоичное сложение выполняется аналогично десятичному сложению с использованием следующих правил двоичного сложения:

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 10 (0 с переносом 1)

Примеры:

Проблема 21 10 + 10 10 = 31 10 45 10 + 54 10 = 99 10 3 10 + 7 10 = 10 10
         10101 2

+       01010 2

_______________

11111 2

         101101 2

+       110110 2

_______________

1100011 2

         011 2

+       111 2

_______________

1010 2

Чек 1*2 3 + 0*2 2 + 1*2 1 + 0*2 0 =

1*8 + 0*4 + 1*2 + 0*1 = 10 10

Восьмеричное сложение

Восьмеричное сложение также выполняется аналогично десятичному сложению, за исключением того, что каждая цифра имеет диапазон от 0 до 7 вместо 0 до 9.

Задача 21 10 + 10 10 = 31 10 45 10 + 54 10 = 99
10
3 10 + 7 10 = 10 10
         25 8

+       12 8

_______________

37 8

         55 8

+       66 8

_______________

143 8

         3 8

+       7 8

_______________

12 8

Чек 3*8 1 + 7*8 0

3*8 + 7*1 = 31 10

1*8 2 + 4*8 1 + 3*8 0

64 + 32 + 3 = 99 10

1*8 1 + 2*8 0

8 + 2 = 10 10

Шестнадцатеричное сложение

Шестнадцатеричное сложение также выполняется аналогично десятичному сложению, за исключением того, что каждая цифра имеет диапазон от 0 до 15 вместо 0 до 9.

Задача 21 10 + 10 10 = 31 10 45 10 + 54 10 = 99 10 3 10 + 7 10 = 10 10

         15 16

+       0A 16

_______________

1F 16

         2D 16

+       36 16

_______________

63 16

         3 16

+       7 16

_______________

А 16    (не 10)

Чек 1*16 1 + 15*16 0

16 + 15 = 31 10

6*16 1 + 3*16 0

96 + 3 = 99 10

10*16 0

10 10

Двоичное умножение
Десятичное число Двоичный

11 10

x        13 10

_______________

33 10

11 10–

_______________

143 10

     1011 2

x 1101 2

_______________

1011 2

0000 2-

1011 2–

1011 2—

_______________

10001111 2

Чек 8*16 1 + 15*16 0

128 + 15 = 143 10

Двоичное подразделение

Проверка: 1*16 1 + 5*16 0 = 16 + 5 = 21 10

Практические арифметические операции, подняв проблемы и затем их обратно к основанию 10 через разные основания (например, 2, 8 и 16).

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

Дополнения и отрицательные числа ИЛИ добавление бита знака

Сложение, умножение и деление — это хорошо, но как насчет вычитания и отрицательных чисел? Из начальной школы вы узнали, что вычитание — это просто сложение отрицательного числа. Математики вместе с инженерами использовали этот принцип вместе с арифметикой по модулю — естественным результатом сумматоров конечной длины — чтобы позволить компьютерам работать с отрицательными числами без добавления каких-либо новых аппаратных элементов в арифметико-логическое устройство (АЛУ).

Величина знака

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

Знак величина

Пример: — 2 = 1 0010 2

Один комплемент

Вот решение, которое немного более сложное. Добавьте бит знака и инвертируйте каждый бит, составляющий величину — просто измените 1 на 0 и 0 на 1.

Знак величина

Пример: — 2 = 1 1101 2

, чтобы вычесть в комплементе 1, вы просто добавляете знаки и биты величины, позволяя последнему биту (из знака) вмещается в биту . затем добавьте 1 к ответу. Еще раз позвольте последнему биту переноса упасть в ведро с битами. Битовое ведро возможно из-за физического размера сумматора.

0 1010 2                       10

+_ 1 1101 2 +(-2)

0 1000 2 8

+______ 1 2 Регулировка

0 1001 2

Несмотря на , теперь вам нужно добавить 1 к ответу. Это снова означает добавление оборудования. Усугубляя эту проблему, дополнение до единицы позволяет двум числам равняться 0 ( шизофренический ноль ).

Двойки Дополнение

Вот решение, которое немного сложнее в настройке, но не требует корректировок в конце добавления. Есть два способа получить дополнение числа до двух.

Метод 1 = Возьмите дополнение до 1 и добавьте 1

__0 0010 2              2

+1 1101 2 1 комплемент (т.е. инверт)

+1 2 Добавить 1

1 1110 2

Метод 2 = Двигайтесь справа налево, пока не встретите 1, затем инвертируйте.

0 0010 2 начало = 2 10
0 2 без изменений
10 2 нет изменений, но встречается одно
110 2 инвертировать = изменить 0 на 1
1110 2 инвертировать = изменить 0 на 1
1 1110 2 инвертировать = изменить 0 на 1

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

0 1010 2 10

+1 1110 2 +(-2)

0 1001 2 8

Примеры:

Проблема 33 10 – 19 10 = 14 10 69 10 – 84 10 = -15 10

         0 100001 2

+       1 101101 2

_______________

0 001110 2

         0 1000101 2

+       1 0101100 2

_______________

1 1110001 2

Чек преобразовать в промежуточную базу E 16 = 14 10 преобразовать обратно в знак величины

– 0001111 2

преобразовать в промежуточную базу (16)

– F 16 = – 15 10

Почему это работает

Реальные сумматоры имеют конечное число битов, что естественным образом приводит к арифметике по модулю — битовому ведру.

Переполнение

Теперь, когда арифметика сводится к хождению по кругу, положительные числа могут суммироваться с отрицательными и наоборот. Два теста позволяют быстро проверить, существует ли состояние «переполнения».

Тест 1 = Если два числа отрицательные, а ответ положительный, произошло переполнение.

Тест 2 = Если два числа положительные, а ответ отрицательный, произошло переполнение.

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

Коды символов ИЛИ нечисловая информация

Проблема с десятичными числами

Представление десятичных чисел в двоичном компьютере. Двоичное представление десятичного числа несколько лет назад могло быть «зашито» в арифметико-логическое устройство (АЛУ) компьютера. Сегодня он, скорее всего, просто представляет некоторую информацию, которая естественным образом представлена ​​в базе 10, например, ваш студенческий билет.

Решение

В этой задаче нужно представить десять различных цифр. Использование 4 бит 2 4 или 16 комбинаций могут быть созданы. Используя 3 бита 2 3 или 8 комбинаций, можно создать. Таким образом, для представления одной десятичной цифры потребуется 4 бита. Здесь следует указать, как из 4 битов (0000–1111) можно создать 16 комбинаций, в то время как наибольшее числовое значение, которое может быть представлено, равно 15. Причина, по которой наибольшее числовое значение и количество комбинаций различаются, связана с ноль (0) является одной из комбинаций. Эта разница указывает на необходимость всегда следить за тем, мокрее вы работаете, ноль или один родственник, и что именно вы ищете — двоичное число или комбинации.

Наиболее распространенный способ представления десятичного числа называется двоично-десятичным кодом (BCD). Здесь каждое двоичное число соответствует своему десятичному эквиваленту, а числа больше 9 просто не допускаются. BCD также известен как код 8-4-2-1, поскольку каждое число представляет соответствующий вес двоичных цифр. Напротив, код Excess-3 представляет собой невзвешенный код, использовавшийся в более ранних компьютерах. Его кодовое назначение происходит от соответствующего двоично-десятичного кода плюс 3. Преимущество кода Excess-3 заключалось в том, что, дополняя каждую цифру представления двоичного кода десятичной цифры (дополнение до 1), 9будет сформировано дополнение этой цифры. В следующей таблице перечислены все десятичные цифры и их эквиваленты в кодах BCD и Excess-3. Я также включил отрицательный эквивалент каждой десятичной цифры, закодированной с использованием кода Excess-3. Например, дополнение 0100 (1 десятичный знак) равно 1011, то есть 8 десятичных знаков. Вы можете найти больше десятичных кодов на странице 18 «Цифрового дизайна» М. Морриса Мано (текст курса).

Двоично-десятичный код (BCD) Превышение-3
Десятичная цифра Двоичный код 8-4-2-1 Десятичная цифра Двоичный код 9 комплиментов

0

1

2

3

4

5

6

7

8

9

Н/Д

Н/Д

Н/Д

Н/Д

Н/Д

Н/Д

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

н/д

Н/Д

Н/Д

0

1

2

3

4

5

6

7

8

9

Н/Д

Н/Д

Н/Д

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

1111

1110

1101

1100

1011

1010

1001

1000

0111

0110

0101

0100

0011

0010

0001

0000

Проблема с буквенно-цифровыми символами

Представляет буквенно-цифровые данные (строчные и прописные буквы алфавита (az, A-Z), цифровые числа (0-9) и специальные символы (возврат каретки, перевод строки, точка и т. д.). .).

Решение

Для представления прописных и строчных букв алфавита плюс десять цифр необходимо не менее 62 (2×26+10) уникальных комбинаций. 2 6 или 64 уникальные комбинации будут работать, для специальных символов останется только 2 комбинации. С другой стороны, код, использующий 7 бит, обеспечивает 2 7 или 128 комбинаций, что дает более чем достаточно места для алфавита, цифр и специальных символов. Итак, кто решает, какие бинарные комбинации каким символам соответствуют. Здесь нет «лучшего пути». Около тридцати лет назад IBM выпустила новую серию компьютеров, в которых для хранения одного символа использовалось 8 бит (2 8 = 256 комбинаций), и разработала расширенный двоично-десятичный код обмена (EBCDIC, произносится как ep-su-dec). для этой цели. Поскольку у IBM была почти монополия в области компьютеров, в то время другие производители компьютеров отказались принять EBCDIC, и именно так появился 7-битный американский стандартный код для обмена информацией (ASCII). В настоящее время ASCII принят практически всеми производителями микрокомпьютеров и мини-компьютеров. В таблице ниже показан частичный список кодов ASCII. На странице 23 текста перечислены все 128 кодов с пояснениями к управляющим символам.

ДЕКАБРЬ ШЕСТИГР. СИМВОЛ ДЕКАБРЬ ШЕСТИГР. СИМВОЛ
32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

20

21

22

23

24

25

26

27

28

29

2D

2F

30

31

32

33

34

35

36

37

38

39

3D

3F

!

»

#

$

%

и

(

)

*

+

,

*

/

0

1

2

3

4

5

6

7

8

9

:

;

?

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

40

41

42

43

44

45

46

47

48

49

4D

4F

50

51

52

53

54

55

56

57

58

59

5F

@

А

Б

С

Д

Е

Ф

Г

Х

я

Дж

К

л

М

Н

О 9

_

Слово «строка» обычно используется для описания последовательности символов, хранящихся в виде их числовых кодов (например, ASCII).

Хотя для ASCII требуется только 7 бит, в компьютерах стандартом является использование 8 бит, где крайний левый бит равен 0. Это позволяет вам кодировать еще 128 символов (включая такие символы, как греческие буквы), что дает вам расширенных символов. набор символов , просто заставив крайний левый бит быть 1. Это также может привести к компьютерной версии Вавилонской башни. В качестве альтернативы крайний левый бит может использоваться для обнаружения ошибок при передаче символов по телефонной линии. Что подводит нас к нашей следующей проблеме.

Synthesis

Хотя ASCII решает проблему связи между англоязычными компьютерами, как насчет японских, китайских или русских компьютеров, которые имеют разные, и во всех этих примерах, более крупные алфавиты?

Проблемы со связью

Двоичная информация может передаваться последовательно (по одному биту за раз) через какую-либо форму связи, такую ​​как телефонная линия или радиоволна. Любой внешний шум, внесенный в среду, может изменить битовые значения с 1 на 0 или наоборот.

Решение

Самое простое и наиболее распространенное решение проблемы связи заключается в добавлении к отправляемой информации бита четности . Функция бита четности состоит в том, чтобы сделать общее количество отправляемых единиц либо нечетным (нечетная четность), либо четным (четная четность). Таким образом, если было отправлено любое нечетное количество единиц, но получено четное число единиц, вы знаете, что произошла ошибка. В приведенной ниже таблице показаны соответствующие биты четности (нечетные и четные), которые будут добавлены к 4-битному фрагменту данных.

Синтез

Что произойдет, если две двоичные цифры изменят значения битов? Можно ли разработать систему не только для обнаружения ошибок, но и для идентификации и исправления измененных битов? Один из наиболее распространенных кодов исправления ошибок был разработан Р. У. Хэммингом. Его решение, известное как код Хэмминга, можно найти в самых разных местах, от схемы оперативной памяти (ОЗУ) до телекоммуникационной линии космического корабля. Дополнительные сведения о кодах исправления ошибок см. на стр. 29.9 к 302 текста.

Хотя обнаружение ошибок — это хорошо, предотвращение их появления — еще лучше. Что, конечно же, подводит нас к нашей следующей проблеме.

Ошибка энкодера вала

Когда вал вращается, вам необходимо преобразовать его радиальное положение в двоично-цифровое число.

Решение

Тип кодера, который будет кратко описан ниже, преобразует положение вала в двоично-кодированное цифровое число. Это преобразование будет выполнено несколькими различными типами устройств; описываемый тип представляет устройства, используемые в настоящее время, и следует понимать, что более сложные кодеры могут обеспечить дополнительную точность. Кроме того, обычно возможно преобразовать физическое положение в электрический сигнал аналогового типа, а затем преобразовать этот сигнал в цифровую систему. Однако в целом можно построить более прямые и точные кодеры, исключив промежуточный этап преобразования физического положения в аналоговый электрический сигнал. На рисунке ниже показан диск с кодированными сегментами, соединенный с валом.

Энкодер может быть физически реализован с использованием электромеханической (щеточной) или электрооптической технологии. Предполагая электрооптическое решение, кодирующий диск состоит из полос, разделенных на прозрачные сегменты (заштрихованные области) и непрозрачные сегменты (незаштрихованные области). С одной стороны диска размещен источник света, а с другой стороны — набор из четырех фотоэлементов, расположенных так, что по одной ячейке находится за каждой полосой диска кодера. Если между источником света и светочувствительной клеткой находится прозрачный сегмент, будет получен результат 1; и если перед фотоэлементом находится непрозрачная область, будет выход O.

Существует одна основная проблема с показанным кодером: если диск находится в позиции, где выходное число меняется с 011 на 100, или в любой позиции, где несколько битов изменяют значение, выходной сигнал может стать неоднозначным. Как и в любом физически реализованном устройстве, как бы тщательно оно ни было изготовлено, кодер будет иметь ошибочные выходы в нескольких позициях. Если это происходит, когда 011 изменяется на 100, возможно несколько ошибок; значение может быть прочитано как 111 или 000, любое из которых является значением со значительными ошибками. Чтобы обойти эту трудность, инженеры используют код «Грей» или «единичное расстояние» для формирования диска кодера (см. предыдущий рисунок). В этом коде 2 бита никогда не меняют значения в последовательных закодированных двоичных числах. При использовании диска с кодировкой Грея 6 может быть прочитано как 7, а 4 как 5, но больших ошибок не будет. В таблице ниже показан список 4-битного кода Грея.

Десятичный Серый Код

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

0000

0001

0011

0010

0110

0111

0101

0100

1100

1101

1111

1110

1010

1011

1001

1000

Synthesis

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

Если входные данные для двоичной машины поступают от энкодера, использующего код Грея, каждое слово должно быть преобразовано в обычный двоичный или двоично-десятичный битовый эквивалент. Как это может быть сделано? Прежде чем вы сможете ответить на этот вопрос, вам нужно узнать о булевой алгебре — какое совпадение, это тема следующего раздела.

Набор инструкций для ATmega328P (стр. 12-14)

Схема Arduino Proto-Shield

Рисунок: Arduino Proto-Shield


avr — Arduino в сборе?

спросил

Изменено 1 год, 1 месяц назад

Просмотрено 31к раз

\$\начало группы\$

Для моего предприятия микропроцессорной обработки я решил использовать Atmel AVR из-за обширных доступных ресурсов. У Arduino, кажется, тоже много чего есть, не говоря уже о том, что их стартовые наборы кажутся более «на моем уровне».

Проблема в том, что я хочу сначала изучить его на ассемблере, а затем перейти к C/C++ или тому, что использует Arduino, но я слышал, что Arduino не поддерживает сборку AVR. Это правда? Есть ли способ обойти это?

Изменить: я бы выбрал ATMEL STK500, но для новичка это выглядит ОЧЕНЬ сложно. Есть ли какая-то причина, по которой я не могу просто взять 8-битный AVR, поставить его на макетную плату и таким образом поэкспериментировать? (Думаю, мне придется придумать, как связать их как таковые.)

Edit2: Вот о чем я думал

http://www.adafruit.com/index.php?main_page=product_info&cPath=17&products_id=193

  • arduino
  • avr
  • сборка

\$\конечная группа\$

2

\$\начало группы\$

Платы Arduino можно программировать на ассемблере. Все, что вам нужно, это кабель ICSP (внутрисхемный последовательный программатор) и набор инструментов AVR (бесплатный от ATMEL) для записи на плату. Затем вы получаете преимущество встроенной отладки.

Как вы и предложили, вы можете просто поставить микросхему ATMEL на макетную плату и отправиться в город.

Набор, на который вы ссылаетесь, выглядит отличной отправной точкой. Вы можете снять микросхему прямо с платы и приклеить ее на свою макетную плату (при условии, что она имеет правильно отрегулированную мощность и вы учитываете часы).

РЕДАКТИРОВАТЬ: Очевидно, вам не нужен ICSP для загрузки программ сборки. Подробности смотрите в комментарии ниже.

\$\конечная группа\$

4

\$\начало группы\$

Arduino IDE может быть «исправлена» для размещения ассемблерного кода. Вот вики: https://web.archive.org/web/20171123115658/https://www.cs.nmsu.edu/~jcook/arduino/index.php?n=Notes.AssemblyMods

\$\конечная группа\$

0

\$\начало группы\$

Насколько я знаю, в загрузчике Arduino не должно быть ничего особенного, что могло бы помешать вам использовать сборку вместо C. IDE Arduino может затруднить загрузку ваших собственных файлов .hex, но похоже, что загрузчик Arduino — STK500 совместим, поэтому вы сможете использовать его с avrdude.

\$\конечная группа\$

1

\$\начало группы\$

Совсем не сложно.

http://www.dwelch.com/arduino/

Вам нужно посмотреть я думаю ser.c на моей странице, чтобы подобрать карту. некоторые по умолчанию используют разные скорости последовательного порта и разные схемы сброса для входа в режим программирования. Если вы посмотрите на прошивку arduino, вы обнаружите, что практически ни одна из команд программирования avr не поддерживается. Все равно они особо не нужны.

\$\конечная группа\$

\$\начало группы\$

Arduino можно запрограммировать на сборку с помощью встроенного ассемблера GCC-AVR. проверьте эту ссылку для GCC-AVR Inline Assembler Cookbook

http://web.stanford.edu/class/ee281/projects/aut2002/yingzong-mouse/media/GCCAVRInlAsmCB.pdf

\$\конечная группа\$

\$\начало группы\$

Платы Arduino (по крайней мере, Uno и Duemilanove) имеют стандартный разъем для программирования AVR, который поддерживается программистами и отладчиками Atmel через AVR Studio. Studio поддерживает ассемблер и C. Подходящим программатором является AVRISP MkII, а AVR Dragon предлагает как программирование, так и отладку. Я бы взял последний, он дороже на 50 долларов, но средства отладки бесценны. Вы также можете использовать эти инструменты со стандартным чипом AVR (не Arduino), подключенным к макетной плате или печатной плате.

\$\конечная группа\$

1

\$\начало группы\$

Arduino состоит из двух частей: аппаратного обеспечения и IDE. IDE в основном (если не полностью) ограничивает вас C и C++ (с некоторым синтаксическим сахаром, добавленным разработчиками, чтобы сделать его немного более похожим на Processing/Java). Есть шанс, что IDE распознает файлы .s или .S в том же каталоге, что и стандартный скетч (.pde), но я бы не стал вешать на это шляпу.

Ничего особенного в оборудовании нет. Это приятная, удобная плата с множеством отличных функций, которые оценят новички в микроСи, но если вы хотите просто запрограммировать AVR через заголовок ISP, вы тоже можете это сделать. Вам понадобится что-то вроде Atmel AVRISP mkII или любой другой программатор, который работает с разъемом 2×3 ряда на плате Arduino. Ищите те, которые совместимы с программой avrdude, которую вы будете использовать для загрузки своих приложений. Держитесь подальше от USBtinyISP от Adafruit; Мне ужасно повезло с этим, и в итоге я купил Atmel, который я связал, менее чем за 40 долларов у Mouser.

\$\конечная группа\$

2

\$\начало группы\$

Aruduino можно запрограммировать на ассемблере. И для этого вам даже не нужен кабель ICSP!

Ладно, справедливости ради, это , а не , то же самое, что и программирование на чистом ассемблере с нуля.

Но вы можете встроить ассемблирование в C. Это означает, что вы можете загрузить на Arduino код со встроенным ассемблером, который затем будет выполняться. Рассмотрим библиотеку TVOut, которая позволяет Arduino выводить NTSC/PAL на телевизор.

Эта библиотека очень чувствительна ко времени (поскольку она выводит на телевизор, каждая строка развертки должна быть записана в нужное время). Поэтому она использует встроенный ассемблер для ускорения процесса. Глядя на строку 89 этого файла из библиотеки, автор использует некоторые макросы сборки, которые он написал.

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

Удачи!

\$\конечная группа\$

1

\$\начало группы\$

Я использую Linux в качестве хост-платформы, но я думаю, что эти инструменты также доступны для разновидностей Windows.

Я использую «avra» для конвертера сборки в шестнадцатеричный код (компилятор)

Затем я программирую чип с помощью программатора USBTiny и инструмента программирования «avrdude».

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *