pazi sto se freeRtos-a i generalno svih ostalih rtosa tice sve to o cemu
pricas je configurabilno... taskovi mogu da imaju stek razlicite
velicine, mogu da rade na vise jezgara, taskovi imaju razlicite
prioritete te ne moraju svi taskovi da rade tacno odredjeni broj us,
takodje taskovi mogu da imaju "safe region" gde se task switch nikad
nece desiti, imaju mutekse, semafore, mailboxove, evente etc.. pre kojih
se komunicira izmedju taskova, preko kojih se limitira pristup shared
resursima (zajednickim varijablama, seriskom portu i slicno) ...
freertos je preemtive, sto znaci da task dobije slajs vremena i onda mu
se to vreme oduzme (sto ti kazes 500us) ali takodje task moze da "preda"
vreme drugim taskovima ranije ako ceka na neki event ili prosto ako je
zavrsio sa bitnim delom pa mu za dalje nije frka (
https://freertos.org/a00020.html#taskYIELD )
pocetni stadijum da imas samo fixne taskove, koliok oces istih, i da se
se oni switchuju non stop na x us je pdim, to je 0.1% posla, i realno
par dana da se napravi, onda kada dva taska treba da komuniciraju ili
kada treba da pristupaju istim resursima i to treba da bude
standardizovano nastaju problemi jer onda moras da krenes da
implementiras jednu po jednu jos jedno 50% stvari koje u svakom rtosu
vec imas ... onih drugih 50% ti verovatno neces koristiti ali ako neko
uzme da pise sw koristeci tvoj sistem on ce hteti bar jos 10% koje nemas
i slicno...
pravis ga za sebe pa svakako pravi sta ti zanimljivo
npr
Code:
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_CAN_Init();
MX_SPI2_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_TIM2_Init();
/* Init and start scheduler */
osKernelInitialize();
MX_FREERTOS_Init();
osKernelStart();
while (1);
Code:
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 200 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
osThreadId_t readADCTaskHandle;
const osThreadAttr_t readADCTask_attributes = {
.name = "readADCTask",
.stack_size = 200 * 4,
.priority = (osPriority_t) osPriorityLow,
};
osThreadId_t readEncodersTasHandle;
const osThreadAttr_t readEncodersTas_attributes = {
.name = "readEncodersTas",
.stack_size = 200 * 4,
.priority = (osPriority_t) osPriorityLow,
};
void MX_FREERTOS_Init(void) {
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
readADCTaskHandle = osThreadNew(startReadADCTask, NULL, &readADCTask_attributes);
readEncodersTasHandle = osThreadNew(StartReadEncoders, NULL, &readEncodersTas_attributes);
}