Нагружаем контроллер STM32F407 тремя потоками и смотрим как они борятся за место под солнцем в среде FreeRTOS
Реализуем три равноправных потока.
В каждом запускаем передачу пачки импульсов через связку HAL_TIM_PWM_Start_DMA / HAL_TIM_PWM_PulseFinishedCallback / HAL_TIM_PWM_Start_DMA.
far8=0;
if((res=HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_1,(uint32_t*)pData, 8))!=HAL_OK)
printf("HAL_TIM_PWM_Start_DMA != HAL_OK");
while(far8 == 0 )
;
if((res=HAL_TIM_PWM_Stop_DMA(&htim8, TIM_CHANNEL_1))!=HAL_OK)
printf("HAL_TIM_OC_Stop_DMA != HAL_OK");
vTaskDelay(1); // вот тут если не давать другим потокам возможность поработать ,
// то возможно вообще и не поработают совсем.
И смотрим что из этого получается :
При такой высокой нагрузке (передача ШИМ за микросекунды ) каждый поток должен давать другим поработать vTaskDelay(1); . Иначе другие потоки вообще могут не заработать ни разу .
Проверьте сами. Проект можно скачать внизу.
Тут все потоки равноправные :
Самое приятное в этом примере , что это все работает и не зависает. Причем использовался только HAL и FreeRTOS.
Файлы для скачивания
*
пытаемся FreeRTOS заставить зависнуть ... (не пулучается)