Семафоры — для разделения использования задачами разделяемых ресурсов.
Так например две задачи должны использовать один и тот-же USART. Одновременно они это делать не должны. И если вдруг задача 1 использует usart и произошла смена контекста на задачу 2. И задача 2 тоже хочет использовать USART, то семафор должен помешать задаче 2.
Семафор это переменная(счетчик). Вначале она инициализируется значением — максимальное количество задач, которые могут одновременно использовать разделяемый ресурс.
Каждый раз при входе задачи в разделяемый ресурс данная переменная уменьшается на 1, а при выходе увеличивается на 1. Вторая задача проверяет эту переменную и если она больше нуля — вход разрешен, меньше — запрещен. При входе и выходе задача 2, так-же изменяет эту переменную.