ettocap wrote on Tuesday, August 25, 2015:
Hi !
OK, I post my code. I’ve got a small overlay to create tasks, manage event groups,…
Task characterisitics :
STATIC const SV_OS_stOsTask m_akst_osTasksList[AP_OS_eTASK_NUMBER] =
{
[AP_OS_eTASK_ONE] =
{
.psz_name = "", /**< Empty name, to limit size of memory used */
.pv_taskFunc = &AP_OS_taskOne, /**< Function of task */
.pkv_taskParam = NULL, /**< Task parameters, not used */
.u16_stackSize = 512, /**< Size of task size, in words (32 bits) */
.e_priority = SV_OS_eTSK_PRIO_HIGH, /**< Priority of task */
.bCreateStarted = TRUE,
},
[AP_OS_eTASK_TWO] =
{
.psz_name = "", /**< Empty name, to limit size of memory used */
.pv_taskFunc = &AP_OS_taskTwo, /**< Function of task */
.pkv_taskParam = NULL, /**< Task parameters, not used */
.u16_stackSize = 512, /**< Size of task size, in words (32 bits) */
.e_priority = SV_OS_eTSK_PRIO_NORMAL, /**< Priority of task */
.bCreateStarted = TRUE,
},
};
Task one processing :
void AP_OS_taskOne(void * pv_iArgument)
{
u32 u32_transmitFlag = 0;
/* Conditions before test */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
/* Start HAL timer */
HAL_TIM_Base_Start_IT(DV_BOARD_CONFIG_getTIMHandler(CF_BOARD_CONFIG_eTIM2));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
/* Infinite loop */
for(;;)
{
/* Wait for event */
u32_transmitFlag = xEventGroupWaitBits( SV_OS_getEvtGrp(AP_OS_eEVT_GRP_TASK_ONE),
(AP_OS_CFG_EVT_GRP_TASK_ONE_FLAG1),
TRUE,
FALSE,
60000);
/* Event raised */
if(0 != (u32_transmitFlag & AP_OS_CFG_EVT_GRP_TASK_ONE_FLAG1))
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
}
else
{
/* Time-out */
}
}
}
Task two processing :
void AP_OS_taskTwo(void * pv_iArgument)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
/* Infinite loop */
for(;;)
{
HAL_Delay(2);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10);
}
}
Hardware timer routine (Executed each 5s) :
void AP_OS_PeriodicalActionsForTests_cbk(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
triggerEventTaskONE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
}
STATIC void triggerEventTaskONE(void)
{
BaseType_t u32_higherPriorityTaskWoken;
BaseType_t u32_error;
/* Raise flag */
u32_higherPriorityTaskWoken = pdFALSE;
u32_error = xEventGroupSetBitsFromISR(SV_OS_getEvtGrp(AP_OS_eEVT_GRP_TASK_ONE),
AP_OS_CFG_EVT_GRP_TASK_ONE_FLAG1,
&u32_higherPriorityTaskWoken);
/* Was the message posted successfully? */
if(pdFAIL != u32_error)
{
/* Request a context switch */
portYIELD_FROM_ISR( u32_higherPriorityTaskWoken );
}
else { /* No need to switch context */ }
}
Don’t hesitate if you’ve got questions ^^.
Regards.