Заготовка проекта для написания программ под «Ядро-51»

Александр Бельченко
19 октября 2004
Цель данной статьи — ознакомить начинающих пользователей учебно-отладочной платформы «Ядро-51» с принципами и спецификой построения программ для данной платформы. Для облегчения создания новых проектов предлагается использовать готовую заготовку-проект для Keil C51.

Для начала вкратце опишу идеологию работы «Ядра-51» в плане загрузки и запуска программ. Программа загружается через UART в имеющееся на плате ОЗУ. Автоматического старта программы при этом не происходит. Для того, чтобы запустить программу на выполнение, необходимо послать команду процессору через терминальную программу Loader4. Эта команда достаточно проста: наберите S и нажмите Enter. Подтверждением запуска программы будет ответ процессора: ok. Если программа не была загружена, то процессор откажется запускать программу. Признаком наличия программы считается наличие по адресу 0x8000 кода 0x02, который соответствует команде ассемблера LJMP.

Теперь перейдем к тому файлу, который можно загружать в «Ядро-51».

Это должен быть скомпилированный бинарный файл. Раньше я работал с ассемблером 2500 AD, который генерировал бинарный файл с расширением tsk. Теперь я перешел на Keil, но переделывать программу Loader4 на другой формат пока не стал.

Keil умеет делать файлы в формате hex. Такие файлы при помощи утилиты hex2bin можно легко переконвертировать в нужный нам бинарный формат.

Утилиту hex2bin можно скачать с сайта http://www.keil.com, но я вложил ее в пример проекта, чтобы вам было проще.

Для того, чтобы получить hex-файл в результате компиляции программы, необходимо в настройках проекта указать соответствующую опцию. Для этого откройте настройки проекта (Options for Target) на вкладке Output в средней части поставьте галочку возле текста Create HEX file. В результате компиляции программы Вы получите hex-файл.

Для конвертации hex файла в бинарный формат необходимо воспользоваться утилитой hex2bin, строка запуска будет выглядеть следующим образом:

hex2bin /O-32768 blinky.hex blinky.tsk

Здесь blinky.hex — имя hex-файла для рассматриваемого проекта Blinky.

Здесь есть странная опция «/O-32768». Ее смысл в том, что нам необходимо получить бинарный файл для записи в старшие 32К памяти программ процессора. Поэтому мы принудительно обрезаем младшие 32К программы этой оцией. В общем случае эта опция указывает смещение адресов в результирующем бинарном файле относительно адресов в исходном hex-файле.

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

Startup (стартап-код) — это та часть программы, которая выполняется после того, как процессор вышел из режима сброса, и до того, как будет запущена на выполнение главная функция программы main.

Сначала разберемся с настройками проекта. Откройте окно настроек проекта (Option for Target). На вкладке Device выберите свой процессор, но на первых порах более предпочтительно использовать процессор 8031 или 8032 из группы Generic. На вкладке Target в поле Off-chip Code memory введите:

Start: 0x8000   Size: 0x1000

  • Start — это адрес, с которого должна начинаться программа
  • Size — размер памяти, отводимой под программу

В поле Off-chip XDATA memory введите:

Start: 0x1000   Size: 0x7000

Поскольку внешнее ОЗУ служит для хранения и программы, и данных, то мы вышеописанными опциями указываем компилятору, что память данных в ОЗУ должна располагаться после программы (если бы не было программы в ОЗУ, то мы могли бы использовать все 32К == 0x8000 и расположили бы ОЗУ с адреса 0x0000).

Также укажем компилятору, что программа у нас лежит по адресу 0x8000. Для этого в опциях проекта Option for Target перейдите на вкладку С51. В правой части окна вы найдете опцию Interrupt vectors at address.

Убедитесь, что эта опция выбрана (стоит галочка) и впишите в текстовое поле справа от надписи адрес начала программы: 0x8000 вместо 0x0000.

Вот собственно и все настройки. Но чтобы это все-таки заработало еще нужен немного скорректированный стартап-код. Я сделал необходимый ассемблерный файл и подключил его в проект-заготовку (имя файла: Startup-core.a51).

Если скомпилировать — получается hex-файл. Этот хекс потом прогоняем через hex2bin — получаем бинарный tsk. Полученый бинарный tsk загружаем на плату. И потом запускаем на выполнение набирая большую латинскую букву S и нажимая Enter.

И еще. В настройках проекта на вкладке Output я добавил автоматический вызов утилиты hex2bin в конце компиляции. Хотя предупреждаю, что иногда эта опция дает сбои.

Возможно, описанная мною процедура необходимых действий покажется на первый взгляд громоздкой и сложной. Но вы должны понимать, что это следствие того, что в «Ядре-51» используется нестандартная конфигурация памяти программы и данных.

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

Файлы

  • t_core51.zip (19 КБ) — проект-заготовка для создания своих собственных программ, предназначенных для выполнения на платформе «Ядро-51».
  • blinky.zip (18 КБ) — проект «Blinky», взятый из примеров, поставляемых вместе с Keil C51. Этот проект скорректирован соответствующим образом, чтобы его можно было запускать на «Ядре-51».