Работа по размещению величин для хранения проводится на основе глубокого анализа детализированного графического алгоритма, выраженного в физических обозначениях величин. Для каждой из переменных алгоритма проводится анализ:
· Если переменная справа от знака присвоения – она читается;
· Если переменная слева от знака присвоения – она записывается;
· Если чтение после записи – значит, переменная хранится временно;
· Если запись после чтения – значит, переменная сохраняется вне алгоритма (вне цикла или вне подпрограммы) для следующего его выполнения;
· Если величина прочитана и далее до записи в следующем цикле выполнения программы не читается, то, значит, дальнейшее её хранение не требуется.
· Если величина только читается и никогда не записываеся, то это может быть константа. Её можно хранить в ячейке памяти или возобновлять.
Нежелательно, но иногда может потребоваться введение в алгоритм дополнительных переменных. На основании анализа переменные алгоритма делятся на:
· хранимые непрерывно (например, при накоплении) – понадобится выделить отдельный регистр или ячейку для каждой такой переменной;
· хранимые кратковременно – несколько таких переменных можно сохранять в одном регистре по очереди, не допуская перекрытия отрезков времени хранения.
При выборе регистров начинать нужно с тех, которые будут служить приёмниками результатов операций, а это зависит от того, в каком из вычислительных блоков выполняется та или иная операция. Заметим, что операция сложения (а также нахождение остатка от целочисленного деления – mod) выполняется в DAG1,2. Приёмником результата там служат 14-разрядные регистры I0..I7. Эту особенность полезно использовать особенно при вычислениях, связанных с формированием адреса.
Регистры для хранения операндов выбираются в последнюю очередь с учетом тех возможностей и ограничений, которые указаны в системе команд для каждого вида операций (Приложение B, таблицы B.2..B7). Если приёмник результата окажется занятым, то могут потребоваться вспомогательные пересылки. Вариантов решения может быть несколько. Нужно стремиться выбрать оптимальный.
Не следует забывать и о существовании других подпрограмм, в которых регистры тоже будут использоваться.
Если в алгоритме имеются операции над элементами двух массивов, полезно спланировать расположение массивов в разных блоках памяти (DM и PM). Это позволит выполнять по две пересылки за один такт и получить больший эффект от применения МФИ.
Тщательное выполнение этого этапа разработки ПО при учёте физического содержания задачи позволяет избежать накладок и неувязок в использовании регистров и обеспечивает их экономное расходование. Результатом работы является диаграмма занятости регистров. В простейших случаях и для величин, хранимых по отдельности, можно ограничиться составлением таблицы вида "имя ячейки (регистра) - хранимая величина".
Рассмотрим пример для второго фрагмента алгоритма рисунка 7.5.
В списке переменных присутствуют:
М(A) – массив ячеек памяти, организованный как кольцевой буфер,
A – адрес ячейки памяти,
N – шаг изменения адреса,
Q – отсчёт сигнала, хранившийся в памяти,
Port2 – устройство вывода отсчётов.
По фрагменту детализированного алгоритма рис. 7.5, находящемуся во внутреннем цикле программы, можно провести следующие рассуждения:
· Отсчёт Q записывается в команде Q=M(A) и читается в команде port2=Q. Хранение временное.
· Адрес A читается (используется) в команде Q=M(A). В команде A=A+N имеются и чтение, и запись, то есть происходит обновление. Хранение непрерывное.
· Константа N читается каждый раз. Хранение непрерывное.
· В port2 запись отсчёта каждый раз. Хранение непрерывное для превращения отсчёта в длительно существующий сигнал.
Для наглядности время хранения величин отображают на диаграмме в масштабе, выраженном через число шагов программы, как показано на рисунке. 7.6.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.