Мне нужно создать устройство для сбора данных, единственной задачей которого является выборка некоторых 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