Поскольку одной из ключевых особенностей архитектуры ADSP-процессоров является разделение памяти на память данных и память команд, на этапе объявления всех имен (функций, переменных/объектов и указателей) компилятор должен знать в каком пространстве памяти это имя разместить и (например, если это указатель) адрес в каком пространстве памяти содержит. По умолчанию компилятор придерживается следующих правил:
- все переменные размещаются в памяти данных;
- все функции всегда размещаются в памяти программ. Указатели на функции всегда указывают на адрес в памяти программ;
- локальные переменные всегда автоматически размещаются в стеке, который всегда располагается в памяти данных;
- для многоуровневых указателей возможно явное задание всех уровней памяти.
Компилятор поддерживает явное указание типа памяти, в которой размещается переменная или объект, если это не противоречит рассмотренным выше правилам, например:
int varstst; // размещается по умолчанию в DM
int pm varb1; // размещается в PM
|
|
float dm buf2[200]; // размещается в DM
int *xy; // xy размещается в DM и указывает на DM
int pm * dm ddd; // ddd размещается в DM и указывает на PM
int pm * asd; // asd размещается в DM и указывает на PM
float pm * pm xxy; // xxy размещается в PM и указывает на PM
int dm * pm uty; // uty размещается в PM и указывает на DM
В связи с этим компилятор отслеживает недопустимое с его точки зрение смешивание адресов и не позволяет присвоить указателю на DM адрес, находящийся в PM.
int pm x;
int dm y;
x = y; // все нормально
int pm *x;
int dm * y;
int dm a;
x = y; // недопустимо
x = &a; // недопустимо
Для глобальных статических данных возможно указание секции, в которую компилятор должен пометить переменную, например:
static section("sec_pmda") int x;
переменная x будет размещена в секции sec_pmda.