Tym razem bardzo szybki post dotyczący systemu freeRTOS. W nim chciałbym przedstawić obsługę systemu FreeROTS, a dokładniej jednej części tzn. funkcji Task.
[Źródło: http://www.st.com/en/evaluation-tools/stm32f4discovery.html]
FreeRTOS
System FreeRTOS jest to system operacyjny czasu rzeczywistego. Daje on możliwość skorzystania z pięciu mechanizmów, które umożliwią komunikację pomiędzy różnymi zadaniami. W ich skład wchodzą semafory binarne, kolejki, semafory licznikowe, muteksy oraz muteksy rekurencjyjne.
Semafory binarne służą do sterowania wykonywanym zadaniem. Oczywiście działa to tylko wtedy gdy semafor jest włączony. Są one wykorzystywane do synchronizacji zadań lub zadania i przerwania. W drugim przypadku czynność zostaje odblokowana gdy wystąpi przerwanie.
System udostępnia także możliwość by po określonej ilości taktów przejść w stan zablokowania, jeśli dane nie pojawią się w kolejce bądź gdy znajduje się w niej za dużo elementów.
Kolejnym rodzajem są semafory licznikowe czyli połączenie kolejki i semafora binarnego. Stosuje się w programach które wymagają zliczania ilości wystąpień danego zdarzenia oraz jego przetworzenia.
Teraz pora na muteksy, które mają podobne działanie co semafory licznikowe z wyjątkiem posiadania systemu priorytetów. Stosuje się głównie w miejscach gdzie należy dzielić dostępny zasób sprzętowy
Program:
Efektem działania programu będzie mruganie diodami wbudowanymi w płytkę Discovery. Każda z nich będzie działała z różnym interwałem czasowym, który został dobrany na etapie kompilacji projektu.
- /* Include core modules */
- #include "stm32f4xx.h"
- #include "main.h"
- #include "freeRTOS.h"
- #include "freeRTOSConfig.h"
- #include "task.h"
- #include "system_stm32f4xx.h"
- void vApplicationIdleHook(void)
- {
- }
- void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
- {
- }
- void vApplicationTickHook(void)
- {
- }
- void vApplicationMallocFailedHook(void)
- {
- }
- void LED_Task(void* pParams)
- {
- while(1)
- {
- GPIO_SetBits(GPIOD, GPIO_Pin_14);
- vTaskDelay(300);
- GPIO_ResetBits(GPIOD, GPIO_Pin_14);
- vTaskDelay(300);
- }
- }
- void LED_Task2(void* pParams)
- {
- while(1)
- {
- GPIO_SetBits(GPIOD, GPIO_Pin_12);
- vTaskDelay(500);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- vTaskDelay(500);
- }
- }
- void LED_Task3(void* pParams)
- {
- while(1)
- {
- GPIO_SetBits(GPIOD, GPIO_Pin_13);
- vTaskDelay(800);
- GPIO_ResetBits(GPIOD, GPIO_Pin_13);
- vTaskDelay(800);
- }
- }
- void LED_Task4(void* pParams)
- {
- while(1)
- {
- GPIO_SetBits(GPIOD, GPIO_Pin_15);
- vTaskDelay(1050);
- GPIO_ResetBits(GPIOD, GPIO_Pin_15);
- vTaskDelay(1050);
- }
- }
- void LED_INIT(void)
- {
- GPIO_InitTypeDef GPIO_InitDef;321
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_Init(GPIOD, &GPIO_InitDef);
- }
- int main()
- {
- SystemCoreClockUpdate();
- SysTick_Config(SystemCoreClock/1000);
- LED_INIT();
- xTaskCreate(LED_Task, "LED_BLINK", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- xTaskCreate(LED_Task2, "LED_BLINK", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- xTaskCreate(LED_Task3, "LED_BLINK", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- xTaskCreate(LED_Task4, "LED_BLINK", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- vTaskStartScheduler();
- while (1)
- { }
- }
Bibliografia
http://ep.com.pl/files/2562.pdf
http://www.scienceprog.com/freertos-on-stm32/