From b31e5a8675908b80f75491e59d2a9955b173b718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= Date: Wed, 13 Aug 2014 09:08:50 +0200 Subject: [PATCH] core: introduce KERNEL_PID_FIRST and KERNEL_PID_LAST --- core/include/kernel_types.h | 24 ++++++++++++++++++++---- core/include/sched.h | 3 +-- core/thread.c | 20 +++++++++----------- sys/ps/ps.c | 4 ++-- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/core/include/kernel_types.h b/core/include/kernel_types.h index 5a6530f6b..af5f03927 100644 --- a/core/include/kernel_types.h +++ b/core/include/kernel_types.h @@ -5,19 +5,35 @@ #include /** - * @def KERNEL_PID_UNDEF - * @brief Identifier to detect an invalid PID + * @def MAXTHREADS + * @brief The maximum number of threads to be scheduled + */ +#ifndef MAXTHREADS +#define MAXTHREADS 32 +#endif + +/** + * Canonical identifier for an invalid PID. */ #define KERNEL_PID_UNDEF -1 +/** + * The first valid PID (inclusive). + */ +#define KERNEL_PID_FIRST (KERNEL_PID_UNDEF + 1) + +/** + * The last valid PID (inclusive). + */ +#define KERNEL_PID_LAST (KERNEL_PID_FIRST + MAXTHREADS - 1) + /** * Macro for printing formatter */ #define PRIkernel_pid PRIi16 /** - * @brief Unique process identifier - * + * Unique process identifier */ typedef int16_t kernel_pid_t; diff --git a/core/include/sched.h b/core/include/sched.h index 041fd505e..5346262e0 100644 --- a/core/include/sched.h +++ b/core/include/sched.h @@ -84,8 +84,7 @@ #include "bitarithm.h" #include "tcb.h" #include "attributes.h" - -#define MAXTHREADS 32 /**< the maximum number of threads to be scheduled */ +#include "kernel_types.h" /** * @def SCHED_PRIO_LEVELS diff --git a/core/thread.c b/core/thread.c index 4d30e3506..f501698b3 100644 --- a/core/thread.c +++ b/core/thread.c @@ -39,7 +39,7 @@ inline kernel_pid_t thread_getpid(void) volatile tcb_t *thread_get(kernel_pid_t pid) { - if ((pid != KERNEL_PID_UNDEF) && (0 <= pid) && (pid < MAXTHREADS)) { + if ((pid != KERNEL_PID_UNDEF) && (KERNEL_PID_FIRST <= pid) && (pid <= KERNEL_PID_LAST)) { return sched_threads[pid]; } return NULL; @@ -158,19 +158,14 @@ kernel_pid_t thread_create(char *stack, int stacksize, char priority, int flags, dINT(); } - kernel_pid_t pid = 0; - - while (pid < MAXTHREADS) { - if (sched_threads[pid] == NULL) { - sched_threads[pid] = cb; - cb->pid = pid; + kernel_pid_t pid = KERNEL_PID_UNDEF; + for (kernel_pid_t i = KERNEL_PID_FIRST; i <= KERNEL_PID_LAST; ++i) { + if (sched_threads[i] == NULL) { + pid = i; break; } - - pid++; } - - if (pid == MAXTHREADS) { + if (pid == KERNEL_PID_UNDEF) { DEBUG("thread_create(): too many threads!\n"); if (!inISR()) { @@ -180,6 +175,9 @@ kernel_pid_t thread_create(char *stack, int stacksize, char priority, int flags, return -EOVERFLOW; } + sched_threads[pid] = cb; + + cb->pid = pid; cb->sp = thread_stack_init(function, arg, stack, stacksize); cb->stack_start = stack; diff --git a/sys/ps/ps.c b/sys/ps/ps.c index 9fee28732..5744eb25a 100644 --- a/sys/ps/ps.c +++ b/sys/ps/ps.c @@ -21,6 +21,7 @@ #include "hwtimer.h" #include "sched.h" #include "tcb.h" +#include "kernel_types.h" /* list of states copied from tcb.h */ const char *state_names[] = { @@ -40,7 +41,6 @@ const char *state_names[] = { void thread_print_all(void) { const char queued_name[] = {'_', 'Q'}; - int i; #ifdef DEVELHELP int overall_stacksz = 0, overall_used = 0; #endif @@ -56,7 +56,7 @@ void thread_print_all(void) "\n" , "name", "state"); - for (i = 0; i < MAXTHREADS; i++) { + for (kernel_pid_t i = KERNEL_PID_FIRST; i <= KERNEL_PID_LAST; i++) { tcb_t *p = (tcb_t *)sched_threads[i]; if (p != NULL) {