2014-01-23 3 views
3

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

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

Мой главный() является

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)

Iam новичок в ОСРВ поэтому простите пожалуйста меня, если я пропустил любые основные вещи в коде

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

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

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

+1

Что вы используете для этого? Вам нужно будет использовать некоторые для обслуживания частоты прерываний на 1 МГц. Когда я оценивал FreeRTOS на 72MHz ARM Cortex-M3, время переключения контекста нити составляло порядка 15us (FreeRTOS был, кстати, самым медленным из трех RTOS, которые я оценил, лучшее, все еще только достигнутое 5us контекстное время переключения). Задержка прерывания по некоторым целям значительна также в зависимости от архитектуры. Вместо того, чтобы опросить GPIO на таймере, он больше использует прерывание GPIO. Если вам нужна информация о времени, вы можете опросить таймер на прерывании GPIO или использовать вход для записи таймера. – Clifford

ответ

3

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

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

Смежные вопросы