Prima del listato devo anticiparti che io da tempo uso un semplicissimo RTOS che a dire il vero è uno schedulatore a bassissima latenza, cioè ogni funzione viene eseguita ad intervalli regolari di x tempo, questo perchè in genere ho bisogno di precisione nel timing di misure od altro, anche eventuali routine di interrupt non creano problemi perchè vengono eseguite sempre in tempi ridottissimi.
Il codice è in ANSI C e molto portatile, purtroppo uso pochissimo Arduino quindi quello che segue è per ARM o PIC.
Codice:
// Loop RTOS 12,5ms task, 100ms loop
while (1)
{
switch(u8Tic & 7)
{
case 0: //TASK 0
break;
case 1: //TASK 1
break;
case 2: //TASK 2
break;
case 3: //TASK 3
break;
case 4: //TASK 4
break;
case 5: //TASK 5
break;
case 6: //TASK 6
break;
case 7: //TASK 7
break;
}
++u8Tic;
WaitMain();
}
/*******************************************************************************|
| Function Name : WaitMain |
| Description : Routine di ritardo 12,5ms per RTOS. |
| Input : None |
| Output : None |
| Return : None |
|*******************************************************************************/
void WaitMain(void)
{
while(__HAL_TIM_GET_FLAG(&htim6,TIM_FLAG_UPDATE) == RESET);
__HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);
}
/*-----------------------------------------------------------------------------*/
/******************************************************************************|
| Function Name : Read_Voltage |
| Description : Routine lettura tensioni alimentazione e temperatura PIC. |
| Input : None |
| Output : None |
| Return : None |
|******************************************************************************/
void(Read_Voltage)(void)
{
u8PunMMV = (++u8PunMMV & 15);
u16App_ADC = ADCC_GetSingleConversion(channel_Temp); // Temperatura PIC
u32Acc_P_T = u32Acc_P_T - u16Tab_P_T[u8PunMMV] + u16App_ADC;
u16Tab_P_T[u8PunMMV] = u16App_ADC;
u16P_T = u32Acc_P_T >> 4;
__delay_ms(10);
u16App_ADC = ADCC_GetSingleConversion(P_12V); // Tensione 12V
u32Acc_12V = u32Acc_12V - u16Tab_12V[u8PunMMV] + u16App_ADC;
u16Tab_12V[u8PunMMV] = u16App_ADC;
u16P_12V = u32Acc_12V >> 4;
__delay_ms(10);
u16App_ADC = ADCC_GetSingleConversion(P_5V); // Tensione 5V
u32Acc_5V = u32Acc_5V - u16Tab_5V[u8PunMMV] + u16App_ADC;
u16Tab_5V[u8PunMMV] = u16App_ADC;
u16P_5V = u32Acc_5V >> 4;
__delay_ms(10);
u16App_ADC = ADCC_GetSingleConversion(P_3V); // Tensione 3V
u32Acc_3V = u32Acc_3V - u16Tab_3V[u8PunMMV] + u16App_ADC;
u16Tab_3V[u8PunMMV] = u16App_ADC;
u16P_3V = u32Acc_3V >> 4;
}
/*-----------------------------------------------------------------------------*/
Se hai dubbi chiedi pure.