Без шедулера всё равно ни как - контекст переключает он. Можно
только принудительно заставить шедулер переключится на требуемую
задачу и то только если её приоритет выше той задачи что была
прервана этим прерыванием: Пример взят из ссылки:
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();
}
}
}