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 rtems_id id
); );
void rtems_task_exit( void ) RTEMS_NO_RETURN;
/** /**
* @brief RTEMS Task Mode * @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/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

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 * 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)