Я в основном пытаюсь заставить светодиод загореться после нажатия кнопки. Ниже приведен фрагмент кода, который должен справиться с этим:
void task_player1(void *pvParameters)
{
while (1)
{
if (xSemaphoreTake(player1_signal, portMAX_DELAY))
{
printf(">>>Semaphore taken\n<<<");
ioport_set_pin_level(L1, HIGH);
xSemaphoreGive(player1_signal);
}
else
{
ioport_set_pin_level(L1, LOW);
}
}
}
void task_ctrl(void *pvParameters)
{
bool button1 = 0;
while (1)
{
button1 = ioport_get_pin_level(B1);
if (button1)
{
xSemaphoreGive(player1_signal);
printf("Semaphore given\n");
}
}
}
Я предполагаю, что task_ctrl
выдает семафор при нажатии кнопки. Task_player1
блокируется до тех пор, пока не займет семафор, после чего должен включиться светодиод.
Проблема в том, что он никогда не принимает семафор. Я использую операторы printf
, чтобы показать мне, насколько далеко программа заходит и никогда не попадает в ту часть, где горит светодиод. Но когда я запускаю xSemaphoreGive
без нажатия кнопки task_ctrl
, семафор берется.
Странная часть заключается в том, что оператор "Semaphore given\n"
распечатывается при нажатии кнопки, что должно означать, что семафор также передается, но никогда не используется.
Задачи работают сами по себе, мне даже удалось передать семафор без if-оператора нажатия кнопки, как я сказал выше.
Я предполагаю, что это что-то с кодом нажатия кнопки, который также работает сам по себе вне задач. Так что я делаю не так? Я неправильно использую FreeRTOS?
Изменить: включая код создания задачи
#define TASK_STACK_SIZE (2048/ sizeof(portSTACK_TYPE))
xTaskCreate(task_ctrl, (const signed char * const) "Control", TASK_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(task_player1, (const signed char * const) "Player1", TASK_STACK_SIZE, NULL, 1, NULL);
Изменить 2: Вероятно, я должен был упомянуть, что я использую FreeRTOS 7.3, поскольку у Atmel Studio нет более новых версий. Так что, насколько я могу судить, никаких функций доходности нет.