Esempio n. 1
0
static void task_softint(void *arg)
{
    UVAR_t intno = (UVAR_t) arg;
    JIF_t  now, exptime;
    UVAR_t c;

    c = 0;
    now = jiffies;

    for (;;)
    {
        /* do busy waiting for 1 2/3 seconds */
        exptime = now + HZ + (2*HZ / 3);
        do
        {
            now = jiffies;
        }
        while (!POS_TIMEAFTER(now, exptime));

        /* rise software interrupt every 1.67 seconds */
        posSoftInt(intno, 6);

        c++;
        if (c == 2)
        {
            posTaskYield();
        }
        if (c == 3)
        {
            posTaskSleep(1);
            c = 0;
        }
    }
}
Esempio n. 2
0
static void pollTask(void *arg) {
    uint8_t *valuePtr = (uint8_t*) arg;
    uint8_t value = *valuePtr;

    for (;;) {
        PORTB = value;
        posTaskYield();
    }
}
Esempio n. 3
0
NOSTASK_t POSCALL nosTaskCreate(POSTASKFUNC_t funcptr, void *funcarg,
                                VAR_t priority, UINT_t stacksize,
                                const char* name)
{
  POSTASK_t task;
#if NOSCFG_FEATURE_REGISTRY != 0
  REGELEM_t re;
#endif
#if POSCFG_TASKSTACKTYPE == 0
  void *stk;
#endif

#if NOSCFG_FEATURE_REGISTRY != 0
  re = nos_regNewSysKey(REGTYPE_TASK,
                        name == NULL ? (const char*)"t*" : name);
  if (re == NULL)
    return NULL;
#else
  (void) name;
#endif

  /*===============================================*/
#if POSCFG_TASKSTACKTYPE == 0

  if (stacksize == 0)
    stacksize = NOSCFG_DEFAULT_STACKSIZE;

  task = NULL;
  stk = nosMemAlloc(NOSCFG_STKMEM_RESERVE + stacksize);
  if (stk != NULL)
  {
    posTaskSchedLock();
#if NOSCFG_STACK_GROWS_UP == 0
    task = posTaskCreate(funcptr, funcarg, priority, 
                         (void*) (((MEMPTR_t)stk) + stacksize -
                                  (NOSCFG_STKMEM_RESERVE + 1)));
#else
    task = posTaskCreate(funcptr, funcarg, priority,
                         (void*) (((MEMPTR_t)stk) + NOSCFG_STKMEM_RESERVE));
#endif
    if (task != NULL)
    {
      task->nosstkroot = stk;
      task->exithook   = nos_taskExitHook;
#if NOSCFG_FEATURE_REGISTRY != 0
      nos_regEnableSysKey(re, task);
      POS_SETTASKNAME(task, re->name);
#else
      POS_SETTASKNAME(task, name);
#endif
    }
    posTaskSchedUnlock();

#if POSCFG_FEATURE_SLEEP != 0
    posTaskSleep(0);
#elif POSCFG_FEATURE_YIELD != 0
    posTaskYield();
#endif
  }

  /*-----------------------------------------------*/
#elif POSCFG_TASKSTACKTYPE == 1

  if (stacksize == 0)
    stacksize = NOSCFG_DEFAULT_STACKSIZE;

#if NOSCFG_FEATURE_REGISTRY != 0
  posTaskSchedLock();
#endif

  task = posTaskCreate(funcptr, funcarg, priority, stacksize);

#if NOSCFG_FEATURE_REGISTRY != 0
  if (task != NULL)
  {
    task->exithook = nos_taskExitHook;
    nos_regEnableSysKey(re, task);
    POS_SETTASKNAME(task, re->name);
  }
  posTaskSchedUnlock();
#else
  POS_SETTASKNAME(task, name);
#endif

  /*-----------------------------------------------*/
#elif POSCFG_TASKSTACKTYPE == 2

#if NOSCFG_FEATURE_REGISTRY != 0
  posTaskSchedLock();
#endif

  (void) stacksize;
  task = posTaskCreate(funcptr, funcarg, priority);

#if NOSCFG_FEATURE_REGISTRY != 0
  if (task != NULL)
  {
    task->exithook = nos_taskExitHook;
    nos_regEnableSysKey(re, task);
    POS_SETTASKNAME(task, re->name);
  }
  posTaskSchedUnlock();
#else
  POS_SETTASKNAME(task, name);
#endif

#endif /* POSCFG_TASKSTACKTYPE == 2 */

  /*===============================================*/
#if NOSCFG_FEATURE_REGISTRY != 0
  if (task == NULL)
  {
    nos_regDelSysKey(REGTYPE_TASK, NULL, re);
  }
#endif

  return (POSTASK_t) task;
}