Программа-загрузчик для модуля «Ядро-51»
или Что нужно, чтобы начать программировать,
а также немного истории
Александр Бельченко
23 сентября 2003
Сегодняшний рассказ о программе-загрузчике для модуля «Ядро-51». Раньше я уже говорил, что я разработал специальную программу-загрузчик, которая изначально записывается в ПЗУ, и которая позволяет по командам от компьютера через интерфейс RS-232 писать/читать ОЗУ и запускать пользовательскую программу на исполнение с адреса 0x8000. Также я расскажу об истории и предпосылках создания подобного процессорного модуля.
Исторически сложилось так, что я разрабатывал модуль «Ядро-51», имея за плечами опыт работы с так называемыми Bootloader-ами: программами, которые выполняются на самом микроконтроллере и позволяют загружать с компьютера новые версии программ для этого же самого микроконтроллера. Такой подход мне очень понравился. В основном потому, что однажды работая над одним проектом, я имел в своем распоряжении 4 отладочных кристалла с ППЗУ с ультрафиолетовым стиранием. Все 4 процессора мне приходилось 1-2 раза в день ставить под УФ-лампу на стирание. Да еще и в придачу каждый раз вытаскивать процессор из платы, чтобы перепрограммровать его новой версией программы, даже чтобы убедиться, что программа по-прежнему не работает как положено.
Чуть позже я занимался другим проектом, для которого был выбран микроконтроллер типа PIC16F877, который имел внутри flash-память программ и к тому же этот микроконтроллер умел сам изменять свою память программ. В Application Note AN732 «Implementing a Bootloader for the PIC16F87X» от Microchip описывается простой загрузчик для этого процессора. Я несколько изменил предлагавшуюся программу под свои нужды, в частности, изменил протокол обмена между ПК и микроконтроллером при загрузке программы, в результате чего загрузка происходила гораздо быстрее. Также я написал специальную терминальную программу под Windows, которая умела загружать программу в микроконтроллер. Позже в интернете я нашел множество подобных реализаций bootloader для PIC16F87X. Но это не главное. Главное в том, что однажды сделав загрузчик самостоятельно, я мог делать подобные вещи и для других микроконтроллеров.

Процессорный модуль «Ядро-51» родился из необходимости перевести мой первый программатор, который успешно работал на 286, на современные и быстрые компьютеры. Поскольку мой программатор подключался к LPT-порту компьютера и использовал прямой доступ к регистрам управления порта, то однажды оказалось, что он не совсем корректно работает на некоторых новых компьютерах, и отказывается работать под управлением ОС Windows на основе ядра NT.
В первой итерации я принял решение перевести программатор на работу с переходником RS232-LPT и подключить его к стандартному СОМ-порту компьютера. Благо, работа с СОМ-портом под Windows реализована очень удобно. Позже, поразмыслив, я решил доработать всю схему программатора так, чтобы использовать все выгоды появления в системе микроконтроллера.
Параллельно с этой работой мой коллега и хороший товарищ Владимир Петрович стал проявлять настойчивый интерес в плане изучения микроконтроллеров и заинтересовался переделкой моего программатора. Вместе с ним мы собрали новую модель программатора, которая подключается к компьютеру через СОМ-порт, имеет в своем составе 3х канальный ЦАП для формирования необходимых напряжений программирования. Сердцем этого программатора стала описываемая плата «Ядро-51». Чтобы облегчить себе работу и иметь учебный макет для изучения, модуль «Ядро-51» строился таким образом, чтобы имелась возможность легкой загрузки новых программ через встроенный bootloader.
Я уже рассказывал (см. описание схемы модуля) как реализована имитация фон-неймановской памяти. Это было сделано специально, чтобы иметь возможность загружать новые версии программ при помощи простого загрузчика, не используя программатор (даже внутрисхемный).
Когда я познакомился с микроконтроллерами ADuC812 от Analog Devices, то был приятно поражен их реализацией внутрисхемного загрузчика он работает также по последовательному порту, как и мой загрузчик в модуле «Ядро-51». Похоже это одно из самых удобных решений.
Идеология работы программы-загрузчика достаточно проста. Bootloader или программа-загрузчик в процессорном модуле выполняется всегда после сброса микроконтроллера. В зависимости от различных анализируемых условий загрузчик или приступает к загрузке новой программы, или запускает на выполнение ранее записанную версию программы. Работа загрузчика и основной программы полностью независимы друг от друга, поскольку их выполнение строго разделено. И в принципе основная программа ничего «не знает» о загрузчике и не зависит от его наличия.
Моя первая версия загрузчика для модуля «Ядро-51» была написана на ассемблере. Недавно я переписал ее на Си, специально для этого сайта. К тому же в программе на Си легче проследить за алгоритмом работы загрузчика, увидеть его сильные и слабые стороны. Вариант программы на Си оказался не таким оптимальным, как ассемблерный вариант, но это хорошо известный факт: программы на Си занимают больше места, чем чистые ассемблерные программы, и выполняются несколько медленнее. В моем случае размер программы увеличился почти на 30%. Насколько стала медленнее работа я не просчитывал. В дальнейшем при разборе алгоритма программы я попытаюсь показать как можно оптимизировать те или иные Си-конструкции.
Итак, вы можете скачать:
- Core51.zip (12 кБ) вариант программы-загрузчика для модуля «Ядро-51» на Си (проект для Keil µVision2). Есть готовый hex-файл для прошивки ПЗУ памяти программ микроконтроллера модуля «Ядро-51».
- Loader51.zip (12 кБ) вариант программы-загрузчика для модуля «Ядро-51» на ассемблере (использовался ассемблер от 2500А.Д.). Есть скомпилированные hex-файл и бинарный tsk-файл, готовые для прошивки ПЗУ памяти программ микроконтроллера модуля «Ядро-51».
Обе программы (на Си и на ассемблере) имеют одинаковую функциональность, поэтому можно сравнивать, как реализованы разные части алгоритма на Си и на ассемблере.
Также вам понадобится программное обеспечение для компиляции предлагаемых программ:
- Одной из самых лучших (по моему мнению) сред разработки для микроконтроллеров семейства MCS-51 является Keil µVision2 IDE. На оффициальном сайте Keil Software вы можете скачать оценочную версию (Eval Version) этого пакета. Размер дистрибутива около 12...13МБ. От вас потребуется только заполнить карточку регистрации (обязательные поля имеют подписи жирным шрифтом). Оценочная версия не имеет ограничений по времени действия, но имеет ограничения функциональности программы, создаваемые при помощи Eval Version имеют ограничение в 2К кода программы. К счастью, программа-загрузчик достаточно мала, и этот лимит не превышает. Все дальнейшие примеры программ для работы с модулем «Ядро-51», которые вы найдете в этом разделе, также будут меньше 2К. На самом деле 2К программ это не так уж и мало!
- Если вам захочется поразбираться с ассемблерным вариантом программы-загрузчика, то вам понадобится соответствующий ассемблер/линкер (в данном случае 2500АД 4.02). Его вы можете взять в разделе Download «Древний софт». Хотя, я уверен, найдутся люди, которые до сих пор пользуются таким софтом. Я сам знаком с программистом, который и сейчас пользуется старым Си-компилятором от ИАР.
Для отладки и загрузки программ вам также понадобится моя специальная терминальная программа под Windows Loader4 (4 это номер версии). Ее функциональность в плане работы с СОМ-портом несколько ограничена, поэтому по ряду параметров она наверняка уступает другим именитым терминалкам. Однако, со своими прямыми обязанностями (а именно загрузка программ в память модуля «Ядро-51») справляется отлично. К тому же это полностью рабочая терминальная программа (написана она мной по мотивам терминальной программы Term90, с которой мне пришлось много поработать), к достоинствам которой я могу отнести то, что передаваемые и принимаемые данные отображаются на экране разным цветом. Она оказалась по-своему удачной программой, и очень удобной для целей отладки, поэтому я ею пользуюсь постоянно в своей работе.
Страница программы Loader4