Язык программирования PLM-51 позволяет писать многомодульные программы.
Оттранслированный программный модуль сохраняется в виде отдельного файла в объектном формате, где кроме машинных команд сохраняется информация о именах переменных, адресах команд, требующих модификации при объединении модулей в единую программу и отладочная информация.
Раздельная трансляция программы возможна при использовании двух программ: транслятора исходного текста программы plm-51 и редактора связей rl-51.
На первый взгляд раздельная трансляция не должна вызывать каких либо проблем. Однако это не так. При компиляции исходного текста программы если транслятор обнаружит переменную или подпрограмму, которые не были заранее объявлены, то будет сформировано сообщение об ошибке и объектный модуль будет стёрт с диска компьютера.
Для того, чтобы транслятор вместо формирования сообщения об ошибке записал в объектный модуль информацию, необходимую для редактора связей, нужно осуществить объявление внешних переменных подпрограмм и меток. Для объявления внешних переменных после обычного объявления добавляется слово EXTERNAL. При таком объявлении при трансляции исходного текста программы для переменной память данных для переменных не распределяется, а создаются соответствующие записи для редактора связей, позволяющие осуществить соответствующие вызовы подпрограмм и переходы между модулями, а также обращение к переменным другого модуля. Пример объявления внешних переменных на языке программирования PLM-51:
declare RejRab byte external, UrovGr byte external, NomKan word external, Sost bit external, Soob bit external;
В этом объявлении перечисляются переменные, точное значение которых редактор связей должен получить из другого модуля и модифицировать все команды микроконтроллера, в которых эти переменные используются.
Все используемые подпрограммы тоже должны быть предварительно объявлены. При использовании подпрограмм из других модулей они должны быть объявлены как внешние. При этом должны быть полностью объявлены все параметры подпрограмм. Пример объявления внешних подпрограмм на языке программирования PLM-51:
TestOZU: procedure byte external; end TestOZU; Rd558: procedure (AdrRAM,NachAdr,Nbyte) byte external; var (AdrRAM,NachAdr,Nbyte )byte; end Rd558; Wr558: procedure (AdrRAM,NachAdr,Nbyte) byte external; var (AdrRAM,NachAdr,Nbyte )byte; end Wr558;
Для того, чтобы редактор связей мог связать вызов подпрограммы из одного модуля с самой подпрограммой в другом модуле, информация об этой подпрограмме должна быть помещена в объектный модуль. Для этого подпрограмма должна быть оттранслирована с атрибутом PUBLIC. Пример определения подпрограммы, доступной для других модулей, в исходном тексте модуля:
WrNadp: procedure(i,StrPtr) public; declare StrPtr address, char based StrPtr byte constant, i byte; do while char<>0; BufInd(i)=char; StrPtr=StrPtr+1; i=i+1; end; end WrNadp; IndNom: procedure public; declare Adres byte; if BufInd(2)=0 then Adres=0; else Adres=8; if RejNab=NabTlf1 then call WrNadp(Adres,.('T1',0)); if RejNab=NabTlf2 then call WrNadp(Adres,.('T2',0)); if RejNab=NabRadA then call WrNadp(Adres,.NadpRa); if Adres=0 then call WrInd; else call InitPolnInd(2); end IndNom;
Переменные, к которым можно обращаться из других модулей, тоже должны быть объявлены с атрибутом PUBLIC.