Tareas en tiempo real con CooOs

0

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();
}
    
pregunta ChiPlusPlus

1 respuesta

0

Este es solo un enfoque que funcionará.

Comience creando una quinta tarea de "administrador", que se ejecuta con una prioridad más alta que las cuatro tareas que harán el trabajo.

Desde el administrador, cree las cuatro tareas administradas, todas con la misma prioridad que debe ser menor que la prioridad de la tarea del administrador, y todas inicialmente en el estado "TASK_WAITING".

El administrador entra en un bucle:

  1. Despertar tarea del trabajador 'x'. %código%
  2. Retraso por 3 segundos. %código%
  3. Suspender la tarea del trabajador 'x'. %código%
  4. Incremento y, si es necesario, ajuste 'x' CoAwakeTask(workerid[x]);
  5. bucle
respondido por el markt

Lea otras preguntas en las etiquetas