FreeRTOS Sempahore от ISR не работает

Мне нужно создать устройство для сбора данных, единственной задачей которого является выборка некоторых GPIO, запись статуса GPIO и отправка его на ПК через UART для отображения на ПК. Я выбрал алгоритм (пожалуйста, поправьте меня, так как я очень новичок в ОСРВ) создать таймер, работающий на 1 мкс, а затем опросить статус всех необходимых GPIO. Для этого я использовал таймер в демо freertos. И укажите семафор в таймере ISR, который должен вызывать задачу, которая выполняет всю оставшуюся работу.

Не знаю почему, но код, который я редактировал, не работает

Мой main () -

int main(void) {
  /* Prepare the hardware to run this demo. */
  prvSetupHardware();

  vSemaphoreCreateBinary(SemaphoreTask);
  if( SemaphoreTask != NULL )
  {
    xTaskCreate( SemaphoreTakeTask, "SemaphoreTakeTask", 240, NULL , 3, NULL );
    vTaskStartScheduler();
  }
  for(;;);
  return 0;
}

Задача 1 - фиктивная функция, которую я написал, чтобы проверить, работает ли семафор.

void SemaphoreTakeTask(void* parameter){
  vSetupTimerTest(10);                 // Timer initialization function in FreeRtos DEMO
  TRISEbits.TRISE6 = 0;                // Set the GPIO as Output
  xSemaphoreTake( SemaphoreTask, 0 );  // As mentioned in user guide just take the semaphore once to clear the semaphore at start
  for(;;){
    xSemaphoreTake( SemaphoreTask, portMAX_DELAY );
    LATEbits.LATE6 ^= 1;               // Toggle an IO to see whether its working
  }
}

Обработчик таймера ISR

void vT2InterruptHandler(void) {
  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  /* Clear the timer interrupt. */
  IFS0CLR = _IFS0_T2IF_MASK;
  xSemaphoreGiveFromISR(SemaphoreTask, &xHigherPriorityTaskWoken);
  if (xHigherPriorityTaskWoken != pdFALSE) {
    portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
  }
}

Когда я помещаю точку останова в обработчике ISR, он приходит, но GPIO не переключается (что я поместил в Задачу 1)

Я новичок в ОСРВ, прошу прощения, если я пропустил какие-то базовые вещи в коде.

Мне просто нужно передать семафор из обработчика ISR

После некоторых тренировок я обнаружил, что вся проблема возникает при вызове xSemaphoreGiveFromISR. Управление переходит к функции vAssertCalled и остается в бесконечном цикле.

xSemaphoreTake () всегда возвращает pdFALSE


person Able Eldhose    schedule 23.01.2014    source источник
comment
На чем вы это запускаете? Вам придется пойти на некоторые, чтобы обслуживать частоту прерываний на 1 МГц. Когда я тестировал FreeRTOS на ARM Cortex-M3 с тактовой частотой 72 МГц, только время переключения контекста потока составляло порядка 15 мкс (кстати, FreeRTOS была самой медленной из трех оцененных мной ОСРВ, лучшая по-прежнему обеспечивала время переключения контекста только 5 мкс). Задержка прерывания для некоторых целей также значительна в зависимости от архитектуры. Вместо того, чтобы опрашивать GPIO по таймеру, он больше использует прерывание GPIO. Если вам нужна информация о времени, вы можете опросить таймер прерывания GPIO или использовать вход захвата таймера.   -  person Clifford    schedule 26.01.2014


Ответы (1)


Приоритет прерывания должен быть ниже configMAX_SYSCALL_INTERRUPT_PRIORITY

Чтобы получить более четкое представление, посетите форум SourceForge

person Able Eldhose    schedule 24.01.2014