Поддержка пространств памяти данных и памяти команд

Поскольку одной из ключевых особенностей архитектуры 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: