mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 03:05:40 +08:00
include/, sched/, and libc/: Add support for sporadic scheduling parameters in struct sched_param, posix_spawnattr_t, and pthread_attr_t. Update all user interfaces to pass sporadic scheduling parameters. Feature is dependent on EXPERIMENTAL and no changes have yet been made to core scheduling logic.
This commit is contained in:
@@ -10756,3 +10756,4 @@
|
|||||||
planned scheduling policies (2015-07-23).
|
planned scheduling policies (2015-07-23).
|
||||||
* pthread_create: Fix an (unlikely) error in fallback value in the
|
* pthread_create: Fix an (unlikely) error in fallback value in the
|
||||||
event of a failure (which should never occur) (2015-07-23).
|
event of a failure (which should never occur) (2015-07-23).
|
||||||
|
* include/, sched/, and libc/: Add support for sporadic scheduling parameters in struct sched_param, posix_spawnattr_t, and pthread_attr_t. Update all user interfaces to pass sporadic scheduling parameters. Feature is dependent on EXPERIMENTAL and no changes have yet been made to core scheduling logic (2015-07-23).
|
||||||
|
|||||||
+21
-7
@@ -51,13 +51,27 @@
|
|||||||
|
|
||||||
/* Default pthread attribute initializer */
|
/* Default pthread attribute initializer */
|
||||||
|
|
||||||
#define PTHREAD_ATTR_INITIALIZER \
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
{ \
|
# define PTHREAD_ATTR_INITIALIZER \
|
||||||
PTHREAD_STACK_DEFAULT, /* stacksize */ \
|
{ \
|
||||||
PTHREAD_DEFAULT_PRIORITY, /* priority */ \
|
PTHREAD_DEFAULT_PRIORITY, /* priority */ \
|
||||||
SCHED_RR, /* policy */ \
|
SCHED_RR, /* policy */ \
|
||||||
PTHREAD_EXPLICIT_SCHED, /* inheritsched */ \
|
PTHREAD_EXPLICIT_SCHED, /* inheritsched */ \
|
||||||
}
|
0, /* low_priority */ \
|
||||||
|
0, /* max_repl */ \
|
||||||
|
PTHREAD_STACK_DEFAULT, /* stacksize */ \
|
||||||
|
{0, 0}, /* repl_period */ \
|
||||||
|
{0, 0}, /* budget */ \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define PTHREAD_ATTR_INITIALIZER \
|
||||||
|
{ \
|
||||||
|
PTHREAD_DEFAULT_PRIORITY, /* priority */ \
|
||||||
|
SCHED_RR, /* policy */ \
|
||||||
|
PTHREAD_EXPLICIT_SCHED, /* inheritsched */ \
|
||||||
|
PTHREAD_STACK_DEFAULT, /* stacksize */ \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Data
|
* Public Data
|
||||||
|
|||||||
@@ -485,7 +485,8 @@ struct tcb_s
|
|||||||
uint8_t base_priority; /* "Normal" priority of the thread */
|
uint8_t base_priority; /* "Normal" priority of the thread */
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SCHED_SPORADIC
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
int32_t low_priority; /* Sporadic low priority */
|
uint8_t low_priority; /* Sporadic low priority */
|
||||||
|
uint8_t max_repl; /* Max. replenishments */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t task_state; /* Current state of the thread */
|
uint8_t task_state; /* Current state of the thread */
|
||||||
@@ -498,7 +499,7 @@ struct tcb_s
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SCHED_SPORADIC
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
uint32_t spstart; /* Start time of execution budget */
|
uint32_t spstart; /* Start time of execution budget */
|
||||||
uint32_t replen; /* Sporadic replenishment interval */
|
uint32_t repl_period; /* Sporadic replenishment period */
|
||||||
uint32_t budget; /* Sporadic execution budget */
|
uint32_t budget; /* Sporadic execution budget */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+16
-5
@@ -1,7 +1,7 @@
|
|||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* include/pthread.h
|
* include/pthread.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009, 2011-2012, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -166,10 +166,21 @@ typedef pthread_startroutine_t pthread_func_t;
|
|||||||
|
|
||||||
struct pthread_attr_s
|
struct pthread_attr_s
|
||||||
{
|
{
|
||||||
size_t stacksize; /* Size of the stack allocated for the pthread */
|
uint8_t priority; /* Priority of the pthread */
|
||||||
int16_t priority; /* Priority of the pthread */
|
uint8_t policy; /* Pthread scheduler policy */
|
||||||
uint8_t policy; /* Pthread scheduler policy */
|
uint8_t inheritsched; /* Inherit parent prio/policy? */
|
||||||
uint8_t inheritsched; /* Inherit parent prio/policy? */
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
uint8_t low_priority; /* Low scheduling priority*/
|
||||||
|
uint8_t max_repl; /* Maximum pending replenishments */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t stacksize; /* Size of the stack allocated for the pthread */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
struct timespec repl_period; /* Replenishment period */
|
||||||
|
struct timespec budget; /* Initial budget */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
typedef struct pthread_attr_s pthread_attr_t;
|
typedef struct pthread_attr_s pthread_attr_t;
|
||||||
|
|
||||||
|
|||||||
+11
-2
@@ -49,7 +49,6 @@
|
|||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
|
|
||||||
/* Task Management Definitions **************************************************/
|
/* Task Management Definitions **************************************************/
|
||||||
|
|
||||||
/* POSIX-like scheduling policies */
|
/* POSIX-like scheduling policies */
|
||||||
@@ -71,7 +70,17 @@
|
|||||||
|
|
||||||
struct sched_param
|
struct sched_param
|
||||||
{
|
{
|
||||||
int sched_priority;
|
int sched_priority; /* Base thread priority */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
int sched_ss_low_priority; /* Low scheduling priority for sporadic
|
||||||
|
* server */
|
||||||
|
struct timespec sched_ss_repl_period; /* Replenishment period for sporadic
|
||||||
|
* server. */
|
||||||
|
struct timespec sched_ss_init_budget; /* Initial budget for sporadic server */
|
||||||
|
int sched_ss_max_repl; /* Maximum pending replenishments for
|
||||||
|
* sporadic server. */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
|
|||||||
+14
-1
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* include/spawn.h
|
* include/spawn.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -78,6 +78,7 @@
|
|||||||
* because the user will be required to allocate this memory.
|
* because the user will be required to allocate this memory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct timespec;
|
||||||
struct posix_spawnattr_s
|
struct posix_spawnattr_s
|
||||||
{
|
{
|
||||||
/* Used by posix_spawn, posix_spawnp, and task_spawn */
|
/* Used by posix_spawn, posix_spawnp, and task_spawn */
|
||||||
@@ -85,6 +86,12 @@ struct posix_spawnattr_s
|
|||||||
uint8_t flags; /* See POSIX_SPAWN_ definitions */
|
uint8_t flags; /* See POSIX_SPAWN_ definitions */
|
||||||
uint8_t priority; /* Task scheduling priority */
|
uint8_t priority; /* Task scheduling priority */
|
||||||
uint8_t policy; /* Task scheduling policy */
|
uint8_t policy; /* Task scheduling policy */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
uint8_t low_priority; /* Low scheduling priority*/
|
||||||
|
uint8_t max_repl; /* Maximum pending replenishments */
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_SIGNALS
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
sigset_t sigmask; /* Signals to be masked */
|
sigset_t sigmask; /* Signals to be masked */
|
||||||
#endif
|
#endif
|
||||||
@@ -94,6 +101,12 @@ struct posix_spawnattr_s
|
|||||||
|
|
||||||
size_t stacksize; /* Task stack size */
|
size_t stacksize; /* Task stack size */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
struct timespec repl_period; /* Replenishment period */
|
||||||
|
struct timespec budget; /* Initial budget */
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct posix_spawnattr_s posix_spawnattr_t;
|
typedef struct posix_spawnattr_s posix_spawnattr_t;
|
||||||
|
|||||||
+35
-21
@@ -68,31 +68,45 @@
|
|||||||
|
|
||||||
/* POSIX feature set macros */
|
/* POSIX feature set macros */
|
||||||
|
|
||||||
#define POSIX_VERSION
|
#define POSIX_VERSION
|
||||||
#undef _POSIX_SAVED_IDS
|
#undef _POSIX_SAVED_IDS
|
||||||
#undef _POSIX_JOB_CONTROL
|
#undef _POSIX_JOB_CONTROL
|
||||||
#define _POSIX_REALTIME_SIGNALS 1
|
#define _POSIX_REALTIME_SIGNALS 1
|
||||||
#define _POSIX_MESSAGE_PASSING 1
|
#define _POSIX_MESSAGE_PASSING 1
|
||||||
#undef _POSIX_MAPPED_FILES
|
#undef _POSIX_MAPPED_FILES
|
||||||
#undef _POSIX_SHARED_MEMORY_OBJECTS
|
#undef _POSIX_SHARED_MEMORY_OBJECTS
|
||||||
#define _POSIX_PRIORITY_SCHEDULING 1
|
#define _POSIX_PRIORITY_SCHEDULING 1
|
||||||
#define _POSIX_TIMERS 1
|
#define _POSIX_TIMERS 1
|
||||||
#undef _POSIX_MEMLOCK
|
#undef _POSIX_MEMLOCK
|
||||||
#undef _POSIX_MEMLOCK_RANGE
|
#undef _POSIX_MEMLOCK_RANGE
|
||||||
#undef _POSIX_FSYNC
|
#undef _POSIX_FSYNC
|
||||||
#define _POSIX_SYNCHRONIZED_IO 1
|
#define _POSIX_SYNCHRONIZED_IO 1
|
||||||
#undef _POSIX_ASYNCHRONOUS_IO
|
|
||||||
#undef _POSIX_PRIORITIZED_IO
|
#ifdef CONFIG_FS_AIO
|
||||||
|
# define _POSIX_ASYNCHRONOUS_IO 1
|
||||||
|
#else
|
||||||
|
# undef _POSIX_ASYNCHRONOUS_IO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef _POSIX_PRIORITIZED_IO
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
# define _POSIX_SPORADIC_SERVER 1
|
||||||
|
# define _POSIX_THREAD_SPORADIC_SERVER 1
|
||||||
|
#else
|
||||||
|
# undef _POSIX_SPORADIC_SERVER
|
||||||
|
# undef _POSIX_THREAD_SPORADIC_SERVER
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Execution time constants (not supported) */
|
/* Execution time constants (not supported) */
|
||||||
|
|
||||||
#undef _POSIX_CHOWN_RESTRICTED
|
#undef _POSIX_CHOWN_RESTRICTED
|
||||||
#undef _POSIX_NO_TRUNC
|
#undef _POSIX_NO_TRUNC
|
||||||
#undef _POSIX_VDISABLE
|
#undef _POSIX_VDISABLE
|
||||||
|
|
||||||
#define _POSIX_SYNC_IO 1
|
#define _POSIX_SYNC_IO 1
|
||||||
#undef _POSIX_ASYNC_IO
|
#undef _POSIX_ASYNC_IO
|
||||||
#undef _POSIX_PRIO_IO
|
#undef _POSIX_PRIO_IO
|
||||||
|
|
||||||
#define fdatasync(f) fsync(f)
|
#define fdatasync(f) fsync(f)
|
||||||
|
|
||||||
|
|||||||
@@ -45,26 +45,6 @@
|
|||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Type Declarations
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Global Variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -98,13 +78,18 @@ int pthread_attr_getschedparam(FAR const pthread_attr_t *attr,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
param->sched_priority = attr->priority;
|
param->sched_priority = (int)attr->priority;
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
param->sched_ss_low_priority = (int)attr->low_priority;
|
||||||
|
param->sched_ss_max_repl = (int)attr->max_repl;
|
||||||
|
param->sched_ss_repl_period.tv_sec = attr->repl_period.tv_sec;
|
||||||
|
param->sched_ss_repl_period.tv_nsec = attr->repl_period.tv_nsec;
|
||||||
|
param->sched_ss_init_budget.tv_sec = attr->budget.tv_sec;
|
||||||
|
param->sched_ss_init_budget.tv_nsec = attr->budget.tv_nsec;
|
||||||
|
#endif
|
||||||
ret = OK;
|
ret = OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbg("Returning %d\n", ret);
|
sdbg("Returning %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/pthread/pthread_attrsetschedparam.c
|
* libc/pthread/pthread_attrsetschedparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009, 2011, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -45,30 +45,6 @@
|
|||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Type Declarations
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Global Variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: pthread_attr_setschedparam
|
* Function: pthread_attr_setschedparam
|
||||||
*
|
*
|
||||||
@@ -86,7 +62,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int pthread_attr_setschedparam(FAR pthread_attr_t *attr,
|
int pthread_attr_setschedparam(FAR pthread_attr_t *attr,
|
||||||
FAR const struct sched_param *param)
|
FAR const struct sched_param *param)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -98,11 +74,18 @@ int pthread_attr_setschedparam(FAR pthread_attr_t *attr,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
attr->priority = (short)param->sched_priority;
|
attr->priority = (short)param->sched_priority;
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
attr->low_priority = (uint8_t)param->sched_ss_low_priority;
|
||||||
|
attr->max_repl = (uint8_t)param->sched_ss_max_repl;
|
||||||
|
attr->repl_period.tv_sec = param->sched_ss_repl_period.tv_sec;
|
||||||
|
attr->repl_period.tv_nsec = param->sched_ss_repl_period.tv_nsec;
|
||||||
|
attr->budget.tv_sec = param->sched_ss_init_budget.tv_sec;
|
||||||
|
attr->budget.tv_nsec = param->sched_ss_init_budget.tv_nsec;
|
||||||
|
#endif
|
||||||
ret = OK;
|
ret = OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbg("Returning %d\n", ret);
|
sdbg("Returning %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/string/lib_psa_getschedparam.c
|
* libc/string/lib_psa_getschedparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -70,5 +70,13 @@ int posix_spawnattr_getschedparam(FAR const posix_spawnattr_t *attr,
|
|||||||
{
|
{
|
||||||
DEBUGASSERT(attr && param);
|
DEBUGASSERT(attr && param);
|
||||||
param->sched_priority = attr->priority;
|
param->sched_priority = attr->priority;
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
param->sched_ss_low_priority = (int)attr->low_priority;
|
||||||
|
param->sched_ss_max_repl = (int)attr->max_repl;
|
||||||
|
param->sched_ss_repl_period.tv_sec = attr->repl_period.tv_sec;
|
||||||
|
param->sched_ss_repl_period.tv_nsec = attr->repl_period.tv_nsec;
|
||||||
|
param->sched_ss_init_budget.tv_sec = attr->budget.tv_sec;
|
||||||
|
param->sched_ss_init_budget.tv_nsec = attr->budget.tv_nsec;
|
||||||
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/string/lib_psa_init.c
|
* libc/string/lib_psa_init.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013-2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013-2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -88,22 +88,35 @@ int posix_spawnattr_init(posix_spawnattr_t *attr)
|
|||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
attr->priority = param.sched_priority;
|
attr->priority = param.sched_priority;
|
||||||
|
|
||||||
/* Set the default scheduler policy to the policy of this task */
|
/* Set the default scheduler policy to the policy of this task */
|
||||||
|
|
||||||
attr->policy = sched_getscheduler(0);
|
attr->policy = sched_getscheduler(0);
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_SIGNALS
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
/* Empty signal masek */
|
/* Empty signal mask */
|
||||||
|
|
||||||
attr->sigmask = 0;
|
attr->sigmask = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Sporadic scheduling parameters */
|
||||||
|
|
||||||
|
attr->low_priority = (uint8_t)param.sched_ss_low_priority;
|
||||||
|
attr->max_repl = (uint8_t)param.sched_ss_max_repl;
|
||||||
|
attr->repl_period.tv_sec = param.sched_ss_repl_period.tv_sec;
|
||||||
|
attr->repl_period.tv_nsec = param.sched_ss_repl_period.tv_nsec;
|
||||||
|
attr->budget.tv_sec = param.sched_ss_init_budget.tv_sec;
|
||||||
|
attr->budget.tv_nsec = param.sched_ss_init_budget.tv_nsec;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_ARCH_ADDRENV
|
#ifndef CONFIG_ARCH_ADDRENV
|
||||||
/* Default stack size */
|
/* Default stack size */
|
||||||
|
|
||||||
attr->stacksize = CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE;
|
attr->stacksize = CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/string/lib_psa_setschedparam.c
|
* libc/string/lib_psa_setschedparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -69,6 +69,16 @@ int posix_spawnattr_setschedparam(FAR posix_spawnattr_t *attr,
|
|||||||
FAR const struct sched_param *param)
|
FAR const struct sched_param *param)
|
||||||
{
|
{
|
||||||
DEBUGASSERT(attr && param && (unsigned)param->sched_priority <= 0xff);
|
DEBUGASSERT(attr && param && (unsigned)param->sched_priority <= 0xff);
|
||||||
attr->priority = (uint8_t)param->sched_priority;
|
|
||||||
|
attr->priority = (uint8_t)param->sched_priority;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
attr->low_priority = (uint8_t)param->sched_ss_low_priority;
|
||||||
|
attr->max_repl = (uint8_t)param->sched_ss_max_repl;
|
||||||
|
attr->repl_period.tv_sec = param->sched_ss_repl_period.tv_sec;
|
||||||
|
attr->repl_period.tv_nsec = param->sched_ss_repl_period.tv_nsec;
|
||||||
|
attr->budget.tv_sec = param->sched_ss_init_budget.tv_sec;
|
||||||
|
attr->budget.tv_nsec = param->sched_ss_init_budget.tv_nsec;
|
||||||
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/wqueue/work_usrthread.c
|
* libc/wqueue/work_usrthread.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009-2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009-2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -375,7 +375,7 @@ int work_usrstart(void)
|
|||||||
pthread_t usrwork;
|
pthread_t usrwork;
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
struct sched_param param;
|
struct sched_param param;
|
||||||
int status;
|
int ret;
|
||||||
|
|
||||||
/* Set up the work queue lock */
|
/* Set up the work queue lock */
|
||||||
|
|
||||||
@@ -386,13 +386,26 @@ int work_usrstart(void)
|
|||||||
(void)pthread_attr_init(&attr);
|
(void)pthread_attr_init(&attr);
|
||||||
(void)pthread_attr_setstacksize(&attr, CONFIG_LIB_USRWORKSTACKSIZE);
|
(void)pthread_attr_setstacksize(&attr, CONFIG_LIB_USRWORKSTACKSIZE);
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Get the current sporadic scheduling parameters. Those will not be
|
||||||
|
* modified.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = set_getparam(pid, ¶m);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
int erroode = get_errno();
|
||||||
|
return -errcode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
param.sched_priority = CONFIG_LIB_USRWORKPRIORITY;
|
param.sched_priority = CONFIG_LIB_USRWORKPRIORITY;
|
||||||
(void)pthread_attr_setschedparam(&attr, ¶m);
|
(void)pthread_attr_setschedparam(&attr, ¶m);
|
||||||
|
|
||||||
status = pthread_create(&usrwork, &attr, work_usrthread, NULL);
|
ret = pthread_create(&usrwork, &attr, work_usrthread, NULL);
|
||||||
if (status != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
return -status;
|
return -ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Detach because the return value and completion status will not be
|
/* Detach because the return value and completion status will not be
|
||||||
|
|||||||
@@ -310,6 +310,7 @@ config RR_INTERVAL
|
|||||||
config SCHED_SPORADIC
|
config SCHED_SPORADIC
|
||||||
bool "Support sporadic scheduling"
|
bool "Support sporadic scheduling"
|
||||||
default n
|
default n
|
||||||
|
depends on EXPERIMENTAL
|
||||||
---help---
|
---help---
|
||||||
Build in additional logic to support sporadic scheduling (SCHED_SPORADIC).
|
Build in additional logic to support sporadic scheduling (SCHED_SPORADIC).
|
||||||
|
|
||||||
|
|||||||
@@ -234,10 +234,11 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr,
|
|||||||
{
|
{
|
||||||
FAR struct pthread_tcb_s *ptcb;
|
FAR struct pthread_tcb_s *ptcb;
|
||||||
FAR struct join_s *pjoin;
|
FAR struct join_s *pjoin;
|
||||||
int priority;
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
int ticks;
|
||||||
int policy;
|
|
||||||
#endif
|
#endif
|
||||||
|
int priority;
|
||||||
|
int policy;
|
||||||
int errcode;
|
int errcode;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -315,26 +316,39 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr,
|
|||||||
{
|
{
|
||||||
struct sched_param param;
|
struct sched_param param;
|
||||||
|
|
||||||
/* Get the priority for this thread. */
|
/* Get the priority (and any other scheduling parameters) for this
|
||||||
|
* thread.
|
||||||
|
*/
|
||||||
|
|
||||||
ret = sched_getparam(0, ¶m);
|
ret = sched_getparam(0, ¶m);
|
||||||
if (ret == OK)
|
if (ret == ERROR)
|
||||||
{
|
{
|
||||||
priority = param.sched_priority;
|
errcode = get_errno();
|
||||||
}
|
goto errout_with_join;
|
||||||
else
|
|
||||||
{
|
|
||||||
priority = PTHREAD_DEFAULT_PRIORITY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
priority = param.sched_priority;
|
||||||
|
|
||||||
/* Get the scheduler policy for this thread */
|
/* Get the scheduler policy for this thread */
|
||||||
|
|
||||||
policy = sched_getscheduler(0);
|
policy = sched_getscheduler(0);
|
||||||
if (policy == ERROR)
|
if (policy == ERROR)
|
||||||
{
|
{
|
||||||
policy = SCHED_FIFO;
|
errcode = get_errno();
|
||||||
|
goto errout_with_join;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Save the sporadic scheduling parameters */
|
||||||
|
|
||||||
|
ptcb->cmn.low_priority = param.sched_ss_low_priority;
|
||||||
|
ptcb->cmn.max_repl = param.sched_ss_max_repl;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m.sched_ss_repl_period, &ticks);
|
||||||
|
ptcb->cmn.repl_period = ticks;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m.sched_ss_init_budget, &ticks);
|
||||||
|
ptcb->cmn.budget = ticks;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -342,8 +356,19 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr,
|
|||||||
/* Use the priority and scheduler from the attributes */
|
/* Use the priority and scheduler from the attributes */
|
||||||
|
|
||||||
priority = attr->priority;
|
priority = attr->priority;
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
|
||||||
policy = attr->policy;
|
policy = attr->policy;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Save the sporadic scheduling parameters */
|
||||||
|
|
||||||
|
ptcb->cmn.low_priority = attr->low_priority;
|
||||||
|
ptcb->cmn.max_repl = attr->max_repl;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(&attr->repl_period, &ticks);
|
||||||
|
ptcb->cmn.repl_period = ticks;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(&attr->budget, &ticks);
|
||||||
|
ptcb->cmn.budget = ticks;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* pthread_getschedparam.c
|
* pthread_getschedparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* sched/pthread/pthread_setschedparam.c
|
* sched/pthread/pthread_setschedparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008, 2012 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008, 2012, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -118,7 +118,8 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int pthread_setschedparam(pthread_t thread, int policy, FAR const struct sched_param *param)
|
int pthread_setschedparam(pthread_t thread, int policy,
|
||||||
|
FAR const struct sched_param *param)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* sched/pthread/pthread_setschedprio.c
|
* sched/pthread/pthread_setschedprio.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -102,20 +102,30 @@ int pthread_setschedprio(pthread_t thread, int prio)
|
|||||||
struct sched_param param;
|
struct sched_param param;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Set the errno to some non-zero value (failsafe) */
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Get the current sporadic scheduling parameters. Those will not be
|
||||||
|
* modified.
|
||||||
|
*/
|
||||||
|
|
||||||
set_errno(EINVAL);
|
ret = sched_getparam((pid_t)thread, ¶m);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto errout_with_errno;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Call sched_setparam() to change the priority */
|
/* Call sched_setparam() to change the priority */
|
||||||
|
|
||||||
param.sched_priority = prio;
|
param.sched_priority = prio;
|
||||||
ret = sched_setparam((pid_t)thread, ¶m);
|
ret = sched_setparam((pid_t)thread, ¶m);
|
||||||
if (ret != OK)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
/* If sched_setparam() fails, return the errno */
|
return OK;
|
||||||
|
|
||||||
ret = get_errno();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
errout_with_errno:
|
||||||
|
#endif
|
||||||
|
ret = get_errno();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
* sched/sched/sched_getparam.c
|
* sched/sched/sched_getparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
|
||||||
|
#include "clock/clock.h"
|
||||||
#include "sched/sched.h"
|
#include "sched/sched.h"
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -96,7 +97,7 @@
|
|||||||
*
|
*
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
int sched_getparam (pid_t pid, struct sched_param * param)
|
int sched_getparam (pid_t pid, FAR struct sched_param *param)
|
||||||
{
|
{
|
||||||
FAR struct tcb_s *rtcb;
|
FAR struct tcb_s *rtcb;
|
||||||
FAR struct tcb_s *tcb;
|
FAR struct tcb_s *tcb;
|
||||||
@@ -136,6 +137,16 @@ int sched_getparam (pid_t pid, struct sched_param * param)
|
|||||||
/* Return the priority of the task */
|
/* Return the priority of the task */
|
||||||
|
|
||||||
param->sched_priority = (int)tcb->sched_priority;
|
param->sched_priority = (int)tcb->sched_priority;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Return parameters associated with SCHED_SPORADIC */
|
||||||
|
|
||||||
|
param->sched_ss_low_priority = (int)tcb->low_priority;
|
||||||
|
param->sched_ss_max_repl = (int)tcb->max_repl;
|
||||||
|
|
||||||
|
clock_ticks2time((int)tcb->repl_period, ¶m->sched_ss_repl_period);
|
||||||
|
clock_ticks2time((int)tcb->budget, ¶m->sched_ss_init_budget);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
sched_unlock();
|
sched_unlock();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* sched/sched/sched_setparam.c
|
* sched/sched/sched_setparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009, 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009, 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "clock/clock.h"
|
||||||
#include "sched/sched.h"
|
#include "sched/sched.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -105,7 +106,7 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int sched_setparam(pid_t pid, const struct sched_param *param)
|
int sched_setparam(pid_t pid, FAR const struct sched_param *param)
|
||||||
{
|
{
|
||||||
FAR struct tcb_s *rtcb;
|
FAR struct tcb_s *rtcb;
|
||||||
FAR struct tcb_s *tcb;
|
FAR struct tcb_s *tcb;
|
||||||
@@ -148,6 +149,35 @@ int sched_setparam(pid_t pid, const struct sched_param *param)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* Update parameters associated with SCHED_SPORADIC */
|
||||||
|
|
||||||
|
if ((rtcb->flags & TCB_FLAG_POLICY_MASK) == TCB_FLAG_SCHED_SPORADIC)
|
||||||
|
{
|
||||||
|
int ticks;
|
||||||
|
|
||||||
|
DEBUGASSERT(param->sched_ss_max_repl <= UINT8_MAX);
|
||||||
|
|
||||||
|
tcb->flags |= TCB_FLAG_SCHED_SPORADIC;
|
||||||
|
tcb->timeslice = MSEC2TICK(CONFIG_RR_INTERVAL);
|
||||||
|
tcb->low_priority = param->sched_ss_low_priority;
|
||||||
|
tcb->max_repl = param->sched_ss_max_repl;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m->sched_ss_repl_period, &ticks);
|
||||||
|
tcb->repl_period = ticks;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m->sched_ss_init_budget, &ticks);
|
||||||
|
tcb->budget = ticks;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tcb->low_priority = 0;
|
||||||
|
tcb->max_repl = 0;
|
||||||
|
tcb->repl_period = 0;
|
||||||
|
tcb->budget = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Then perform the reprioritization */
|
/* Then perform the reprioritization */
|
||||||
|
|
||||||
ret = sched_reprioritize(tcb, param->sched_priority);
|
ret = sched_reprioritize(tcb, param->sched_priority);
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int sched_setscheduler(pid_t pid, int policy,
|
int sched_setscheduler(pid_t pid, int policy,
|
||||||
const struct sched_param *param)
|
FAR const struct sched_param *param)
|
||||||
{
|
{
|
||||||
FAR struct tcb_s *tcb;
|
FAR struct tcb_s *tcb;
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
#if CONFIG_RR_INTERVAL > 0
|
||||||
@@ -157,22 +157,53 @@ int sched_setscheduler(pid_t pid, int policy,
|
|||||||
default:
|
default:
|
||||||
DEBUGPANIC();
|
DEBUGPANIC();
|
||||||
case SCHED_FIFO:
|
case SCHED_FIFO:
|
||||||
tcb->flags |= TCB_FLAG_SCHED_FIFO;
|
{
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
tcb->flags |= TCB_FLAG_SCHED_FIFO;
|
||||||
tcb->timeslice = 0;
|
#if CONFIG_RR_INTERVAL > 0 || defined(CONFIG_SCHED_SPORADIC)
|
||||||
|
tcb->timeslice = 0;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
tcb->low_priority = 0;
|
||||||
|
tcb->max_repl = 0;
|
||||||
|
tcb->repl_period = 0;
|
||||||
|
tcb->budget = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if CONFIG_RR_INTERVAL > 0
|
#if CONFIG_RR_INTERVAL > 0
|
||||||
case SCHED_RR:
|
case SCHED_RR:
|
||||||
tcb->flags |= TCB_FLAG_SCHED_RR;
|
{
|
||||||
tcb->timeslice = MSEC2TICK(CONFIG_RR_INTERVAL);
|
tcb->flags |= TCB_FLAG_SCHED_RR;
|
||||||
|
tcb->timeslice = MSEC2TICK(CONFIG_RR_INTERVAL);
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
tcb->low_priority = 0;
|
||||||
|
tcb->max_repl = 0;
|
||||||
|
tcb->repl_period = 0;
|
||||||
|
tcb->budget = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SCHED_SPORADIC
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
case SCHED_SPORADIC:
|
case SCHED_SPORADIC:
|
||||||
tcb->flags |= TCB_FLAG_SCHED_SPORADIC;
|
{
|
||||||
|
int ticks;
|
||||||
|
|
||||||
|
DEBUGASSERT(param->sched_ss_max_repl <= UINT8_MAX);
|
||||||
|
|
||||||
|
tcb->flags |= TCB_FLAG_SCHED_SPORADIC;
|
||||||
|
tcb->timeslice = MSEC2TICK(CONFIG_RR_INTERVAL);
|
||||||
|
tcb->low_priority = param->sched_ss_low_priority;
|
||||||
|
tcb->max_repl = param->sched_ss_max_repl;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m->sched_ss_repl_period, &ticks);
|
||||||
|
tcb->repl_period = ticks;
|
||||||
|
|
||||||
|
(void)clock_time2ticks(¶m->sched_ss_init_budget, &ticks);
|
||||||
|
tcb->budget = ticks;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -199,4 +230,3 @@ int sched_setscheduler(pid_t pid, int policy,
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* sched/task/task_spawnparms.c
|
* sched/task/task_spawnparms.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -111,7 +111,7 @@ static inline int spawn_dup2(FAR struct spawn_dup2_file_action_s *action)
|
|||||||
int errcode = get_errno();
|
int errcode = get_errno();
|
||||||
|
|
||||||
sdbg("ERROR: dup2 failed: %d\n", errcode);
|
sdbg("ERROR: dup2 failed: %d\n", errcode);
|
||||||
return errcode;
|
return -errcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -202,7 +202,7 @@ void spawn_semtake(FAR sem_t *sem)
|
|||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* Errors are not reported by this function. This is because errors
|
* Errors are not reported by this function. This is because errors
|
||||||
* cannot occur, but ratther that the new task has already been started
|
* cannot occur, but rather that the new task has already been started
|
||||||
* so there is no graceful way to handle errors detected in this context
|
* so there is no graceful way to handle errors detected in this context
|
||||||
* (unless we delete the new task and recover).
|
* (unless we delete the new task and recover).
|
||||||
*
|
*
|
||||||
@@ -229,7 +229,22 @@ int spawn_execattrs(pid_t pid, FAR const posix_spawnattr_t *attr)
|
|||||||
|
|
||||||
if ((attr->flags & POSIX_SPAWN_SETSCHEDPARAM) != 0)
|
if ((attr->flags & POSIX_SPAWN_SETSCHEDPARAM) != 0)
|
||||||
{
|
{
|
||||||
/* Get the priority from the attrributes */
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Get the current sporadic scheduling parameters. Those will not be
|
||||||
|
* modified.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = sched_getparam(pid, ¶m);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
int errcode = get_errno();
|
||||||
|
return -errcode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get the priority from the attributes */
|
||||||
|
|
||||||
param.sched_priority = attr->priority;
|
param.sched_priority = attr->priority;
|
||||||
|
|
||||||
@@ -265,6 +280,16 @@ int spawn_execattrs(pid_t pid, FAR const posix_spawnattr_t *attr)
|
|||||||
svdbg("Setting policy=%d priority=%d for pid=%d\n",
|
svdbg("Setting policy=%d priority=%d for pid=%d\n",
|
||||||
attr->policy, param.sched_priority, pid);
|
attr->policy, param.sched_priority, pid);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCHED_SPORADIC
|
||||||
|
/* But take the sporadic scheduler parameters from the attributes */
|
||||||
|
|
||||||
|
param.sched_ss_low_priority = (int)attr->low_priority;
|
||||||
|
param.sched_ss_max_repl = (int)attr->max_repl;
|
||||||
|
param.sched_ss_repl_period.tv_sec = attr->repl_period.tv_sec;
|
||||||
|
param.sched_ss_repl_period.tv_nsec = attr->repl_period.tv_nsec;
|
||||||
|
param.sched_ss_init_budget.tv_sec = attr->budget.tv_sec;
|
||||||
|
param.sched_ss_init_budget.tv_nsec = attr->budget.tv_nsec;
|
||||||
|
#endif
|
||||||
(void)sched_setscheduler(pid, attr->policy, ¶m);
|
(void)sched_setscheduler(pid, attr->policy, ¶m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user