forked from Imagelibrary/rtems
@@ -227,6 +227,8 @@ rtems_status_code rtems_task_delete(
|
|||||||
rtems_id id
|
rtems_id id
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void rtems_task_exit( void ) RTEMS_NO_RETURN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief RTEMS Task Mode
|
* @brief RTEMS Task Mode
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ librtems_a_SOURCES += src/rtemsobjectgetclassicname.c
|
|||||||
librtems_a_SOURCES += src/tasks.c
|
librtems_a_SOURCES += src/tasks.c
|
||||||
librtems_a_SOURCES += src/taskcreate.c
|
librtems_a_SOURCES += src/taskcreate.c
|
||||||
librtems_a_SOURCES += src/taskdelete.c
|
librtems_a_SOURCES += src/taskdelete.c
|
||||||
|
librtems_a_SOURCES += src/taskexit.c
|
||||||
librtems_a_SOURCES += src/taskgetaffinity.c
|
librtems_a_SOURCES += src/taskgetaffinity.c
|
||||||
librtems_a_SOURCES += src/taskgetpriority.c
|
librtems_a_SOURCES += src/taskgetpriority.c
|
||||||
librtems_a_SOURCES += src/taskgetscheduler.c
|
librtems_a_SOURCES += src/taskgetscheduler.c
|
||||||
|
|||||||
38
cpukit/rtems/src/taskexit.c
Normal file
38
cpukit/rtems/src/taskexit.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 embedded brains GmbH. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Dornierstr. 4
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.org/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/rtems/tasks.h>
|
||||||
|
#include <rtems/score/threadimpl.h>
|
||||||
|
|
||||||
|
void rtems_task_exit( void )
|
||||||
|
{
|
||||||
|
Thread_Control *executing;
|
||||||
|
Per_CPU_Control *cpu_self;
|
||||||
|
|
||||||
|
cpu_self = _Thread_Dispatch_disable();
|
||||||
|
executing = _Per_CPU_Get_executing( cpu_self );
|
||||||
|
|
||||||
|
_Thread_Exit(
|
||||||
|
executing,
|
||||||
|
THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
_Thread_Dispatch_direct( cpu_self );
|
||||||
|
RTEMS_UNREACHABLE();
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved.
|
* Copyright (c) 2014, 2018 embedded brains GmbH. All rights reserved.
|
||||||
*
|
*
|
||||||
* embedded brains GmbH
|
* embedded brains GmbH
|
||||||
* Dornierstr. 4
|
* Dornierstr. 4
|
||||||
@@ -61,6 +61,10 @@ typedef enum {
|
|||||||
DELETE_7,
|
DELETE_7,
|
||||||
DELETE_8,
|
DELETE_8,
|
||||||
DELETE_9,
|
DELETE_9,
|
||||||
|
EXIT_0,
|
||||||
|
EXIT_1,
|
||||||
|
EXIT_2,
|
||||||
|
EXIT_3,
|
||||||
INVALID
|
INVALID
|
||||||
} test_state;
|
} test_state;
|
||||||
|
|
||||||
@@ -182,6 +186,10 @@ static void delete_extension(
|
|||||||
assert_priority(PRIO_VERY_LOW);
|
assert_priority(PRIO_VERY_LOW);
|
||||||
ctx->current = DELETE_9;
|
ctx->current = DELETE_9;
|
||||||
break;
|
break;
|
||||||
|
case EXIT_2:
|
||||||
|
assert_priority(PRIO_VERY_LOW);
|
||||||
|
ctx->current = EXIT_3;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
rtems_test_assert(0);
|
rtems_test_assert(0);
|
||||||
break;
|
break;
|
||||||
@@ -213,7 +221,10 @@ static void terminate_extension(Thread_Control *executing)
|
|||||||
case DELETE_7:
|
case DELETE_7:
|
||||||
assert_priority(PRIO_LOW);
|
assert_priority(PRIO_LOW);
|
||||||
ctx->current = DELETE_8;
|
ctx->current = DELETE_8;
|
||||||
wake_up_main(ctx);
|
break;
|
||||||
|
case EXIT_1:
|
||||||
|
assert_priority(PRIO_LOW);
|
||||||
|
ctx->current = EXIT_2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rtems_test_assert(0);
|
rtems_test_assert(0);
|
||||||
@@ -292,6 +303,10 @@ static void worker_task(rtems_task_argument arg)
|
|||||||
rtems_task_delete(RTEMS_SELF);
|
rtems_task_delete(RTEMS_SELF);
|
||||||
rtems_test_assert(0);
|
rtems_test_assert(0);
|
||||||
break;
|
break;
|
||||||
|
case EXIT_0:
|
||||||
|
ctx->current = EXIT_1;
|
||||||
|
rtems_task_exit();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
rtems_test_assert(0);
|
rtems_test_assert(0);
|
||||||
break;
|
break;
|
||||||
@@ -399,8 +414,17 @@ static void test(void)
|
|||||||
set_priority(PRIO_VERY_LOW);
|
set_priority(PRIO_VERY_LOW);
|
||||||
|
|
||||||
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
|
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
|
||||||
|
set_priority(PRIO_INIT);
|
||||||
|
|
||||||
rtems_test_assert(ctx->current == DELETE_9);
|
create_and_start_worker(ctx);
|
||||||
|
|
||||||
|
change_state(ctx, DELETE_9, EXIT_0, INVALID);
|
||||||
|
set_priority(PRIO_VERY_LOW);
|
||||||
|
|
||||||
|
rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
|
||||||
|
set_priority(PRIO_INIT);
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->current == EXIT_3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Init(rtems_task_argument arg)
|
static void Init(rtems_task_argument arg)
|
||||||
|
|||||||
Reference in New Issue
Block a user