west 0 14 декабря, 2006 Опубликовано 14 декабря, 2006 · Жалоба Произвели несколько попыток реализовать вложенные прерывания, использую среду Visual DSP 4.0 на процессоре ADSP-BF537, результат прямо сказать отрицательный. Это вообще реально без хитро выввернутых ассемблерных вставок? Заранее спасибо за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 14 декабря, 2006 Опубликовано 14 декабря, 2006 · Жалоба Разве на сигнальниках в этом есть реальная необходимость?! с BF не работал, но работал с одноклассниками: имхо, всё решаемо вешанием периферии на каналы DMA (решаемо в плане отказа от вложенности) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 14 декабря, 2006 Опубликовано 14 декабря, 2006 · Жалоба Произвели несколько попыток реализовать вложенные прерывания, использую среду Visual DSP 4.0 на процессоре ADSP-BF537, результат прямо сказать отрицательный. Это вообще реально без хитро выввернутых ассемблерных вставок? Заранее спасибо за помощь. Если можно, по-подробнее. Что значит "результат отрицательный"? У меня проект на VDK одовременно крутит восемь потоков + PPI_DMA + Ethernet_DMA + MDMA и у каждого DMA свое прерывание. Все ISR на асме со вставками визарда для обхода багов проца (ревизия 0.2). При входе в ISR вложенные прерывания не запрещены. Работает без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west 0 15 декабря, 2006 Опубликовано 15 декабря, 2006 · Жалоба Отрицательный результат означает то, что С компилятор VDSP не генерирует код, который бы позволял вложенные прерывания, например, сработало прерывание по низкому приоритету и выполняется какое-то время, во время этого процесса срабатывает прерывание с большим приоритетом, но оно не выполняется, а ждет завершения обработчика предыдущего прерывания. Но для моей задачи такое ожидание недопустимо. Это решается настройкой VDSP или надо извращаться на ассемблере ? Ревизия проца 0.2. А про баги можно что-нибудь услышать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dinam 1 15 декабря, 2006 Опубликовано 15 декабря, 2006 · Жалоба А про баги можно что-нибудь услышать?Про баги можно почитать здесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 15 декабря, 2006 Опубликовано 15 декабря, 2006 · Жалоба Отрицательный результат означает то, что С компилятор VDSP не генерирует код, который бы позволял вложенные прерывания, например, сработало прерывание по низкому приоритету и выполняется какое-то время, во время этого процесса срабатывает прерывание с большим приоритетом, но оно не выполняется, а ждет завершения обработчика предыдущего прерывания. Но для моей задачи такое ожидание недопустимо. Это решается настройкой VDSP или надо извращаться на ассемблере ? а с какого перепуга Си-компилятор будет генерировать код, позволяющий это? Вы вообще описание на процессор читали? У TI, например, при входе в обработчик автоматически глобально запрещаются прерывания - но это не мешает при необходимости из Си сбросить этот глобальный флаг в начале кода обработчика и взвести при выходе из него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west 0 18 декабря, 2006 Опубликовано 18 декабря, 2006 · Жалоба Описание на процессор читал, дело не в описании, а в том, что генерируемый компилятором код не сохраняет адрес возврата (регистр RETI ). Вопрос собственно в том, как заставить его это делать, если это возможно? А про перепуг компилятора могу сказать, что это идиотизм не поддерживать вложенность прерываний на процессоре, где предусмотрены приоритеты. Зачем тогда они вообще сдались? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 18 декабря, 2006 Опубликовано 18 декабря, 2006 · Жалоба Описание на процессор читал, дело не в описании, а в том, что генерируемый компилятором код не сохраняет адрес возврата (регистр RETI ). Вопрос собственно в том, как заставить его это делать, если это возможно? А если мне не надо иметь вложенные прерывания, а он будет автоматом разрешать? Зачем мне такое поведение? В доке четко написано, что при входе в ISR прерывания запрещаются. Если нужно иметь вложенные, разрешайте руками путем сохранения RETI в стек. Что мешает это делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west 0 19 декабря, 2006 Опубликовано 19 декабря, 2006 · Жалоба У всех разные задачи, кому-то надо, кому-то нет. Плохо, что компилятору нельзя указать, вложенные прерывания или нет, было бы весьма полезно. Для DSP приложений вложенные прерывания, как правило, не нужны, но поскольку BlackFin представляется как универсальное решение, то можно было бы и компилятор поуниверсальней сделать, но это уже к Analog Devices. Просто не хотелось ассемблерных вставок, вот и вся цена вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 19 декабря, 2006 Опубликовано 19 декабря, 2006 · Жалоба У всех разные задачи, кому-то надо, кому-то нет. Плохо, что компилятору нельзя указать, вложенные прерывания или нет, было бы весьма полезно. Для DSP приложений вложенные прерывания, как правило, не нужны, но поскольку BlackFin представляется как универсальное решение, то можно было бы и компилятор поуниверсальней сделать, но это уже к Analog Devices. Просто не хотелось ассемблерных вставок, вот и вся цена вопроса. Ассемблерная вставка чем не нравится? Эстетически или по каким-то другим причинам? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west 0 20 декабря, 2006 Опубликовано 20 декабря, 2006 · Жалоба Был неприятный опыт с компилятором от IAR, который по своему усмотрению перемещал эти вставки по коду. Тогда сохраняли некоторые регистры в стек, так вот, между вставками количество PUSH иногда не равнялось количеству POP, легко представить, к чему это приводило. В конце концов переписали весь обработчик на асм, чего бы очень не хотелось сейчас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 20 декабря, 2006 Опубликовано 20 декабря, 2006 · Жалоба Был неприятный опыт с компилятором от 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 будет автоматом восстановлено, что можно и забыть, если делать руками). Т.е. вы можете выбрать не только между разрешить вложенные прерывания или не разрешить, но и выбрать момент разрешения - иногда это может оказаться полезным, когда часть кода надо выполнить при запрещенных прерываниях. Т.е. гибкость. В общем, попробуйте, должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться