Перейти к содержанию
    

Вложенные прерывания на BlackFin

Произвели несколько попыток реализовать вложенные прерывания, использую среду Visual DSP 4.0 на процессоре ADSP-BF537, результат прямо сказать отрицательный. Это вообще реально без хитро выввернутых ассемблерных вставок? Заранее спасибо за помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве на сигнальниках в этом есть реальная необходимость?!

с BF не работал, но работал с одноклассниками: имхо, всё решаемо вешанием периферии на каналы DMA (решаемо в плане отказа от вложенности)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Произвели несколько попыток реализовать вложенные прерывания, использую среду Visual DSP 4.0 на процессоре ADSP-BF537, результат прямо сказать отрицательный. Это вообще реально без хитро выввернутых ассемблерных вставок? Заранее спасибо за помощь.

Если можно, по-подробнее. Что значит "результат отрицательный"?

У меня проект на VDK одовременно крутит восемь потоков +

PPI_DMA + Ethernet_DMA + MDMA и у каждого DMA свое прерывание.

Все ISR на асме со вставками визарда для обхода багов проца (ревизия 0.2).

При входе в ISR вложенные прерывания не запрещены.

Работает без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отрицательный результат означает то, что С компилятор VDSP не генерирует код, который бы позволял вложенные прерывания, например, сработало прерывание по низкому приоритету и выполняется какое-то время, во время этого процесса срабатывает прерывание с большим приоритетом, но оно не выполняется, а ждет завершения обработчика предыдущего прерывания. Но для моей задачи такое ожидание недопустимо. Это решается настройкой VDSP или надо извращаться на ассемблере ? Ревизия проца 0.2. А про баги можно что-нибудь услышать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А про баги можно что-нибудь услышать?
Про баги можно почитать здесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отрицательный результат означает то, что С компилятор VDSP не генерирует код, который бы позволял вложенные прерывания, например, сработало прерывание по низкому приоритету и выполняется какое-то время, во время этого процесса срабатывает прерывание с большим приоритетом, но оно не выполняется, а ждет завершения обработчика предыдущего прерывания. Но для моей задачи такое ожидание недопустимо. Это решается настройкой VDSP или надо извращаться на ассемблере ?

а с какого перепуга Си-компилятор будет генерировать код, позволяющий это? Вы вообще описание на процессор читали? У TI, например, при входе в обработчик автоматически глобально запрещаются прерывания - но это не мешает при необходимости из Си сбросить этот глобальный флаг в начале кода обработчика и взвести при выходе из него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описание на процессор читал, дело не в описании, а в том, что генерируемый компилятором код не сохраняет адрес возврата (регистр RETI ). Вопрос собственно в том, как заставить его это делать, если это возможно? А про перепуг компилятора могу сказать, что это идиотизм не поддерживать вложенность прерываний на процессоре, где предусмотрены приоритеты. Зачем тогда они вообще сдались?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описание на процессор читал, дело не в описании, а в том, что генерируемый компилятором код не сохраняет адрес возврата (регистр RETI ). Вопрос собственно в том, как заставить его это делать, если это возможно?

А если мне не надо иметь вложенные прерывания, а он будет автоматом разрешать? Зачем мне такое поведение? В доке четко написано, что при входе в ISR прерывания запрещаются. Если нужно иметь вложенные, разрешайте руками путем сохранения RETI в стек. Что мешает это делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У всех разные задачи, кому-то надо, кому-то нет. Плохо, что компилятору нельзя указать, вложенные прерывания или нет, было бы весьма полезно. Для DSP приложений вложенные прерывания, как правило, не нужны, но поскольку BlackFin представляется как универсальное решение, то можно было бы и компилятор поуниверсальней сделать, но это уже к Analog Devices. Просто не хотелось ассемблерных вставок, вот и вся цена вопроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У всех разные задачи, кому-то надо, кому-то нет. Плохо, что компилятору нельзя указать, вложенные прерывания или нет, было бы весьма полезно. Для DSP приложений вложенные прерывания, как правило, не нужны, но поскольку BlackFin представляется как универсальное решение, то можно было бы и компилятор поуниверсальней сделать, но это уже к Analog Devices. Просто не хотелось ассемблерных вставок, вот и вся цена вопроса.

Ассемблерная вставка чем не нравится? Эстетически или по каким-то другим причинам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был неприятный опыт с компилятором от IAR, который по своему усмотрению перемещал эти вставки по коду. Тогда сохраняли некоторые регистры в стек, так вот, между вставками количество PUSH иногда не равнялось количеству POP, легко представить, к чему это приводило. В конце концов переписали весь обработчик на асм, чего бы очень не хотелось сейчас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был неприятный опыт с компилятором от IAR, который по своему усмотрению перемещал эти вставки по коду. Тогда сохраняли некоторые регистры в стек, так вот, между вставками количество PUSH иногда не равнялось количеству POP, легко представить, к чему это приводило. В конце концов переписали весь обработчик на асм, чего бы очень не хотелось сейчас.

Хм, странно. Никогда с подобным не сталкивался. Главный неприятный момент с асмовыми вставками - это то, что компилятор не анализирует их содержимое и может подавлять оптимизации во избежание. С IAR'ом еще фигово то, что между асмовыми вставками и другим ЯВУ-кодом нет определенного интерфейса, т.е. они живут там сами по себе. В VDSP ситуация гораздо лучше - можно указать и аргументы для вставки, и выходные значения. Я широко не использовал, но там, где пришлось, никаких нехороших эффектов не заметил. В том числе и по оптимизации.

 

Попробуйте такой вариант. Напишите класс-обертку (для автоматизации действий):

 

class TNestISREnable
{
    TNestISREnable()  { asm"  [--sp] = RETI;"); }
    ~TNestISREnable() { asm"  RETI = [sp++];"); }
};

 

И использование:

 

void ISR()
{
    ... // some code [optional]

    TNestISREnable NestISREnable;

    ... // other ISR code

}

 

Здесь прерывания вложенные будут разрешены от точки объявления до конца блока (что немаловажно, при выходе из прерыавния значение RETI будет автоматом восстановлено, что можно и забыть, если делать руками). Т.е. вы можете выбрать не только между разрешить вложенные прерывания или не разрешить, но и выбрать момент разрешения - иногда это может оказаться полезным, когда часть кода надо выполнить при запрещенных прерываниях. Т.е. гибкость. В общем, попробуйте, должно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...