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

OMAP_L138 interrupts

Добрый день.

У меня возникла проблема с DSP частью OMAPL138.
Есть программа написанная с использованием BIOS от TI т.к. многое завязано на mailbox-ы с ARM-овской частью.

Мне необходимо отлавливать прерывания более 100 КГц на GP ногу и делать элеметарное: посылать в SPI байт.
Сделал по документации

    HWREG_32(GPIO_DIR8) |= (1 << 2);  // input
    HWREG_32(GPIO_DIR8) &= ~(1 << 1); // output

    HWREG_32(GPIO_CLR_DATA8) |= (1 << 1);

    // Enabling interrupt in a busy signal
    Error_init(&errBlock);
    Hwi_Params_init(&hwiExtIntParams);
    hwiExtIntParams.eventId = GPIO_B8_EVENT_ID;
    hwiExtIntParams.priority = GPIO_B8_INT_ID;
    hwiExtIntParams.maskSetting = Hwi_MaskingOption_SELF; // don't allow this interrupt to nest itself
    hwiExtIntHandle = Hwi_create(GPIO_B8_INT_ID, hwiGP82Isr, &hwiExtIntParams, &errBlock);
    if(NULL == hwiExtIntHandle) {
        Log_print0(Diags_INFO, "-beam adc- GPIO8[2] interrupt handle was not initialized");
        return -1;
    }
    if (Error_check(&errBlock)) {
        Log_print0(Diags_INFO, "-beam adc- GPIO8[2] hardware interrupt setup failed");
        return -1;
    }
    Hwi_enable();   // TODO: Check and remove later


    // Configuring busy signal to falling egde
    HWREG_32(GPIO_SET_FAL_TRIG8) |= (1 << 2);
    HWREG_32(GPIO_CLR_RIS_TRIG8) |= (1 << 2);;
    // Enable Bank8 interrupt
    HWREG_32(GPIO_BINTEN) |= (1 << 8);


static void hwiGP82Isr(UArg arg0)
{
    SPI0_SET_CS;

    Hwi_clearInterrupt(GPIO_B8_INT_ID);
    HWREG_32(GPIO_INTSTAT8) = 0xFFFFU; //(1 << 2); // 0xFFFFU;

   SPI0_CLR_CS;
    return;
}


Процессор, судя по отдалке внутри прерывания(дергаю ногой), не успевает обработать его.
При зтом  сама обработка прерывания быстрая, по времени укладываюсь. Сложилось впечатление, что сам диспечер задач BIOS тормозит вхождение в прерывание.

Можно ли написать прерывание не привязанное к BIOS?

Если да, то как лучше это сделать?

Спасибо.

 

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


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

Лучше бы на PRU организовать: прерывать процессор на 100+кГц - не очень хорошая идея безотносительно DSP/BIOS.

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


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

Добрый день.

Долгие бодания с DMA ни к чему не привели. Т.е. привели к работе, но с полной загрузкой процессора.

Есть несколько вопросов по PRU.

1. Я правильно понимаю, что само упраление предельно простое:
Поставить через CONTROL регистр в reset и снять enable, загрузить программу и выстваить enable.

2. Можно ли написать короткую программу на C и собрать ее как-то для PRU?

3. Есть примеры работы с PRU? Я не нашел нормальных примеров работы с PRU, а в тех что есть используеся pasm, пытался собрать с asm6x - не получилось.

 

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


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

Не знаю насчёт последних версий pasm, но CCS 3.3 нормально транслировал asm.

Про си не знаю - в те времена когда я писал для PRU, си-компилятора для него не существовало. Да и к тому же - если у вас проблемы с быстродействием и хотите ногодрыжить на высоких частотах, то про си лучше забыть. имхо.

А процесс загрузки как PRU-ядер так и ARM/DSP помнится был прекрасно описан в доках TI. Пошагово. Да и примеры в CCS вроде были. Я делал по ним. Неужто их оттуда уже убрали?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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