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