Что касается моей памяти FreeRTOS, если вы создаете все свои потоки с равным приоритетом, тогда вы получите только равный доступ, если вы либо не определите USE_TIME_SLICING, либо определите его и установите для него значение ' 1' .
Когда дело касается нескольких потоков, конкурирующих за доступ к аппаратным ресурсам (или ресурсу разделяемой памяти), вы всегда хотите контролировать доступ к нему как-то. В этом случае самым простым (хотя и не самым быстрым) вариантом является использование мьютекса, FreeRTOS также имеет двоичные семафоры, которые будут выполнять одно и то же и могут быть немного быстрее. Обычно, хотя мьютекс и двоичный семафор взаимозаменяемы. Для деталей двух я бы пошел и прочитал документы FreeRTOS на них, и это должно очистить все.
если вы простите псевдокод, вы хотите, чтобы каждый поток, чтобы делать что-то вдоль линий следующего
createMutex(UART_Lock)
void task1
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
void task2
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
void task3
{
while(1)
{
if(GetLockOnMutex(UART_Lock))
{
PrintToUART();
ReleaseMutex();
}
}
}
Итак, когда каждый поток вводится в контекст будет пытаться получить блокировку мьютекса который используется для ограничения доступа к UART. Если это удастся, он отправит что-то и только после того, как функция печати вернется (которая может быть чересчур многократных временных интервалов), она освободит блокировку на UART для другого потока, чтобы попытаться получить. Если поток не может получить блокировку, тогда он просто пытается снова, пока не наступит время. У вас может быть поток, который не сможет заставить блокировку переспать до тех пор, пока он не будет приведен в контекст, но это действительно важно, если ваш процессор занят, и вам нужно подумать о том, действительно ли ваши задачи рассчитаны на график.
В принципе, если вы не контролируете доступ к UART, и нет гарантии, что в течение заданного временного фрагмента для потока он завершит доступ к UART, тогда планировщик может предварительно убрать незавершенный поток, а другие могут попытайтесь использовать UART.
Было бы логично предположить, что UARTs отправить буфера может разобраться в вашем случае, но вы действительно не хотят полагаться на него, как это только настолько большой, и нет ничего, чтобы остановить одну нить наполнения его полностью ,