rtems: Add rtems_task_exit()

Update #3533.
This commit is contained in:
Sebastian Huber
2018-10-01 09:25:06 +02:00
parent 57a7ecdee5
commit e50e3f7087
4 changed files with 68 additions and 3 deletions

View File

@@ -227,6 +227,8 @@ rtems_status_code rtems_task_delete(
rtems_id id
);
void rtems_task_exit( void ) RTEMS_NO_RETURN;
/**
* @brief RTEMS Task Mode
*

View File

@@ -33,6 +33,7 @@ librtems_a_SOURCES += src/rtemsobjectgetclassicname.c
librtems_a_SOURCES += src/tasks.c
librtems_a_SOURCES += src/taskcreate.c
librtems_a_SOURCES += src/taskdelete.c
librtems_a_SOURCES += src/taskexit.c
librtems_a_SOURCES += src/taskgetaffinity.c
librtems_a_SOURCES += src/taskgetpriority.c
librtems_a_SOURCES += src/taskgetscheduler.c

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

View File

@@ -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
* Dornierstr. 4
@@ -61,6 +61,10 @@ typedef enum {
DELETE_7,
DELETE_8,
DELETE_9,
EXIT_0,
EXIT_1,
EXIT_2,
EXIT_3,
INVALID
} test_state;
@@ -182,6 +186,10 @@ static void delete_extension(
assert_priority(PRIO_VERY_LOW);
ctx->current = DELETE_9;
break;
case EXIT_2:
assert_priority(PRIO_VERY_LOW);
ctx->current = EXIT_3;
break;
default:
rtems_test_assert(0);
break;
@@ -213,7 +221,10 @@ static void terminate_extension(Thread_Control *executing)
case DELETE_7:
assert_priority(PRIO_LOW);
ctx->current = DELETE_8;
wake_up_main(ctx);
break;
case EXIT_1:
assert_priority(PRIO_LOW);
ctx->current = EXIT_2;
break;
default:
rtems_test_assert(0);
@@ -292,6 +303,10 @@ static void worker_task(rtems_task_argument arg)
rtems_task_delete(RTEMS_SELF);
rtems_test_assert(0);
break;
case EXIT_0:
ctx->current = EXIT_1;
rtems_task_exit();
break;
default:
rtems_test_assert(0);
break;
@@ -399,8 +414,17 @@ static void test(void)
set_priority(PRIO_VERY_LOW);
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)