Страница на этапе разработки.
В данном уроке мы посмотрим, зачем нужна система FreeRTOS, и как ней можно пользоваться.
В качестве примера мы на одну ножку подключим светодиод, который будет мигать с определённой частотой, а на вторую ножку подключим кнопку, при нажатии которой у нас будет включаться светодиод на третей ножке, а при отпускании будет выключать данный светодиод. Заодно решим вопрос с дребезгом контактов.
*******
схема
*******
Для начала создадим три задачи(как создавать задачи смотрите Урок №1):
/* definition and creation of Led1 */ osThreadDef(Led1, vLed, osPriorityIdle, 0, 128); Led1Handle = osThreadCreate(osThread(Led1), NULL); /* definition and creation of Button */ osThreadDef(Button, vButton, osPriorityIdle, 0, 128); ButtonHandle = osThreadCreate(osThread(Button), NULL); /* definition and creation of result */ osThreadDef(result, vresult, osPriorityIdle, 0, 128); resultHandle = osThreadCreate(osThread(result), NULL);
Далее опишем действия каждой задачи:
Мигаем светодиодом:
/* USER CODE END Header_StartTask02 */ void vLed(void const * argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14); osDelay(500); } /* USER CODE END StartTask02 */ }
Проверяем нажата кнопка или нет, при этом, проверяем в течении 50 тиков пропал сигнал от кнопки или нет. Если нет — выполняем определенное действие. Таким образом мы решили проблему дребезга контактов.
/* USER CODE END Header_vButton */ char t=0; /* Infinite loop */ for(;;){ if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13) == 0){ while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13) == 0){ vTaskDelay(50); } t = 0; } if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13) == 1) && ( t == 0 )){ while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13) == 1){ vTaskDelay(50); } t = 1; if (k == 1) k =0; else k =1; } osDelay(100); } /* USER CODE END vButton */ }
В данной задаче мы будем включать светодиод и выключать его, в зависимости от того нажата кнопка или нет.
/* USER CODE END Header_vresult */ void vresult(void const * argument) { /* USER CODE BEGIN vresult */ /* Infinite loop */ for(;;){ if (k==1){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15, GPIO_PIN_SET); } else HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15, GPIO_PIN_RESET); osDelay(100); } /* USER CODE END vresult */
Таким образом мы создали несколько задач, которые работают автономно. При этом нам не нужно каждый раз выдумывать как нам организовать задержки не останавливая выполнение других задач.
Так же вы заметили, что мы используем два вида задержки:
osDelay — задержка аргументом которой является число в миллисекундах.
vTaskDelay — задержка аргументом которой является количество тиков.