Estoy usando CooOs con 4 tareas. El problema es que solo se ejecuta la primera tarea (indefinidamente). Lo que quiero hacer es alternar cada tarea 3 segundos y luego cambiar a la otra. Sé que puedo hacer eso con temporizadores o systick pero necesito manejar CooOs.
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "CoOS.h"
#define STACK_SIZE_TASK 100
/*---------------------------- Variable Define -------------------------------*/
OS_STK taskg_stk[STACK_SIZE_TASK];
OS_STK tasko_stk[STACK_SIZE_TASK];
OS_STK taskr_stk[STACK_SIZE_TASK];
OS_STK taskb_stk[STACK_SIZE_TASK];
void init_sys() {
SystemInit();
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14
| GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void task_g() {
while (1) {
GPIO_ResetBits(GPIOD, GPIO_Pin_All);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
}
}
void task_o() {
while (1) {
GPIO_ResetBits(GPIOD, GPIO_Pin_All);
GPIO_SetBits(GPIOD, GPIO_Pin_13);
}
}
void task_r() {
while (1) {
GPIO_ResetBits(GPIOD, GPIO_Pin_All);
GPIO_SetBits(GPIOD, GPIO_Pin_14);
}
}
void task_b() {
while (1) {
GPIO_ResetBits(GPIOD, GPIO_Pin_All);
GPIO_SetBits(GPIOD, GPIO_Pin_15);
}
}
OS_TID g, o, r, b;
void main(void) {
init_sys();
CoInitOS();
//CoCreateTaskEx(task,argv,prio,stk,stkSz,timeSlice,isWaitting)
g = CoCreateTaskEx(task_g,0,2,(int)taskg_stk,STACK_SIZE_TASK,1,0);
o = CoCreateTaskEx(task_o,0,1,(int)tasko_stk,STACK_SIZE_TASK,3,1);
r = CoCreateTaskEx(task_r,0,2,(int)taskr_stk,STACK_SIZE_TASK,3,1);
b = CoCreateTaskEx(task_b,0,3,(int)taskb_stk,STACK_SIZE_TASK,3,1);
CoStartOS();
}