Главная » Bascom-8051, Basic, Железо » Распределение памяти при определении переменных, память программ и ограничения Bascom

0

Распределение оперативной памяти, предлагаемое Bascom-8051представлено в таблице.

Область

Адрес

Назначение

00 – 1Fh

00 – 11h

Рабочие регистры программ Bascom, временно используемые при обработке и

преобразовании данных. Сохраняются в стеке, если не применена директива

“$NOSP”

12 – 1Fh

Неизвестно как используются, но в стеке при прерываниях не  сохраняются.

Очевидно, некоторые из указанных регистров могут использоваться в качестве переменных  в  ассемблерных   вставках.  Блок  регистров  3  иногда  можно использовать   в    подпрограммах    прерывания    пользователя    для    прямой адресации R0 – R7 (но только после проверки).

20  – 2Fh

00 – 09h*

Битовые переменные Bascom.

09 – 7Fh*

Битовые переменные пользователя. Они располагаются здесь независимо от

порядка объявления.

$ – ($+11h)

Глобальные  переменные  Bascom  и  буфер  для  формирования   выводимой

строки.

30 – 7Fh

($+12h) – $$

Переменные  пользователя  в  порядке  объявления.  Рекомендуемый  порядок

определения переменных после переменных типа Bit: вначале типа Byte, затем Word/Integer,     далее     Long,     Single,     String,     Array     (массивы).     Такая последовательность      позволяет      обеспечить      доступ      к      переменным, определенным ранее,  как к прямо адресуемым регистрам, что почти всегда требуется в ассемблерных программах, вставляемых в текст  Бейсика  (ради такой возможности их и применяют). Кроме  того, компилятор для одно- и двухбайтных   переменных   тоже   часто   применяет   библиотеки   c   прямой адресацией регистров. Длинные переменные Long, Single, String, Array всегда считываются  и  записываются  с  использованием   косвенной  адресации,  и поэтому могут располагаться выше 7Fh.

80 – FFh

$$+1 – 7F(FFh)

Стек процессора начинается после окончания последней переменной, записью

в             указатель         стека         адреса         последней         занятой         ячейки

(Mov SP,#$$)

* – адреса битов. $ – адрес первой ячейки, не занятой битовыми переменными. $$ – адрес  последней ячейки,

занятой переменной.

Bascom использует такое расположение многобайтных переменных в  памяти, при  котором  меньшему адресу соответствует младший байт (младшие разряды), хранимого числа. Это же относится и к числу в формате с плавающей точкой, у которого в  ячейке с наименьшим адресом  расположены младшие разряды мантиссы, а в ячейке  с  наибольшим  адресом  содержатся  старшие  разряды  порядка  и  бит  знака.  Строковые переменные занимают в  памяти на одну ячейку  больше,  чем были объявлены. Единственное назначение дополнительного байта – хранить знак  конца строки (значение 00h) . Причем он используется только в  случае, когда строковая переменная имеет максимально возможную длину. Если длина записанной строки меньше длины переменной, то знак конца строки переносится соответственно  ближе к началу переменной, а в  дополнительном байте так и остается   нулевое  значение.   Информация   о   расположении   переменных   необходима   при   использовании ассемблерных  команд,  дающих  возможность  простого  доступа  к  частям  переменных.  Особенно  внимательно нужно  производить  заполнение  строковых  переменных,  не  забывая записать  знак  конца  строки  (00h)  после последнего символа. Иначе работа многих операторов, использующих строковые данные, станет невозможной.

Внешняя   оперативная  память   используется   только   программой   пользователя,  а    представление переменных в  ней такое же, как и во внутренней памяти. Только во внешней памяти  возможно расположение длинных строковых переменных (до 254 символов).

Распределение модулей в памяти программ, создаваемое компилятором Bascom представлено в следующей таблице.

Область

Адрес

Назначение

Стартовый вектор

0000h

Переход на блок начальной инициализации  – LJMP $$

Векторы прерываний

0003h

Команды перехода на подпрограммы обработки прерываний (разрешенных),

расположенные    в      блоке    программ    пользователя.     Вместо     векторов запрещенных прерываний ставится команда Reti.

Библиотечные

подпрограммы

002E*

Все используемые в  программе пользователя операции и  функции (кроме

самых   простейших)   оформлены   в    виде  подпрограмм,   вызываемых  с параметрами, заданными в программе пользователя.

Блок инициализации

процессора

$$

Программа начальной инициализации микроконтроллера и подключенных к

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

Скомпилированная

программа пользователя

$$$

Компиляция текста программы пользователя в порядке возрастания номеров

строк, т.е. первой компилируется первая строка и так далее.

* – для модели 8052. Это значение определяется в файле type.dat вслед за последним вектором прерывания. $$ -

начинается вслед за библиотекой программ Bascom. $$$ – первая  строка программы  исполняется вслед за последней командой инициализации.

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

максимально допустимое число меток – 5000. Практически это число недостижимо.

максимально допустимое число имен переменных   – 1000. Этого вполне достаточно даже  для большой программы.

максимально допустимое число переименований (Alias) – 128.

максимально  допустимое  число  битовых переменных  –  120*.  Это  ограничение  обусловлено только количеством битовых ячеек общего назначения процессора, за исключением  собственных битовых переменных Bascom. Обычно такого количества битов и не требуется.

максимально допустимое число байтовых переменных – 20*.

максимально допустимое число двухбайтовых переменных – 10*. максимально допустимое число четырехбайтовых переменных – 10*. максимально допустимое число строковых переменных по десять символов – 5*.

*            –  указано  приблизительно  допустимое  количество   переменных,  которые  можно   использовать  в программе процессора 8052 (с внутренней памятью 256 байт). Практически количество переменных каждого типа может быть любым в  пределах доступного пространства  внутренней памяти. Для моделей типа 8051(128 байт) пользователю остается 60-70 байт. При использовании старших моделей типа 8052(256 байт) реально доступно 150-180  байт.   Непропорциональное  увеличение  доступного  пространства  внутренней  памяти  приращению размера  памяти  обусловлено тем,  что  старшие  модели  используются  для  более  сложных  задач,  требующих большего стека и больше ресурсов для программ Bascom.

Рекомендуемое   максимальное   количество   используемых   программных   конструкций    не    должно превышать:

FOR .. NEXT       –             50

IF .. THEN           –             50

DO .. LOOP         –             50

WHILE .. WEND –             50

SELECT .. CASE –             25

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

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии