ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1259199 Топик полностью
Nikolaj (15.11.2022 11:51, просмотров: 231) ответил Dingo на Спрошу здесь, чтобы топики не плодить: как FreeRTOS в конфигах попросить, чтобы при событии быстро отрабатывала определённая задача? Есть прерывание АЦП, которое надо передать дальше. На пальцах - делаем задачу с высоким приоритетом, которая ждёт события/флага/сообщения/... Из прерывания это самое ожидаемое и инициируем. И чтобы задача очухалась не по тику шедулера, а по возникновению события? Чего лучше ожидать задаче(легковеснее), как попросить на "родном" языке об
Без шедулера всё равно ни как - контекст переключает он. Можно только принудительно заставить шедулер переключится на требуемую задачу и то только если её приоритет выше той задачи что была прервана этим прерыванием: 

Пример взят из ссылки:

xSemaphoreHandle xButtonSemaphore;
void vButtonHandlerTask( void *pvParameteres ) {

for( ;; ) {

xSemaphoreTake( xButtonSemaphore, portMAX_DELAY );

// Здесь нужно разместить код по нажатию кнопки.

}

}

void main() {

// Инициализация микроконтроллера

vInitSystem();


vSemaphoreCreateBinary( xButtonSemaphore );

if( xButtonSemaphore != NULL ) {

// Создание тасков. Я не включил код проверки ошибок, не стоит забывать об этом!

xTaskCreate( &vButtonHandlerTask, (signed char *)"GreenBlink", configMINIMAL_STACK_SIZE, NULL, 1, NULL );


// Запуск планировщика, т.е. начало работы тасков.

vTaskStartScheduler();

}


// Сюда стоит поместить код обработки ошибок, в случае если планировщик не заработал, или семафор не был создан. Для простоты я использую просто бесконечный цикл.

for( ;; ) { }

}

ISR_FUNCTION processButton() {

portBASE_TYPE xTaskWoken;

if( buttonOnPressed ) {

xSemaphoreGiveFromISR( xButtonSemaphore, &xTaskWoken );

if( xTaskWoken == pdTRUE) {

taskYIELD();

}

}

}