mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-26 06:39:29 +08:00
2011-12-14 Sebastian Huber <sebastian.huber@embedded-brains.de>
PR 1924/cpukit * spstkalloc02/.cvsignore, spstkalloc02/Makefile.am, spstkalloc02/init.c, spstkalloc02/spstkalloc02.doc, spstkalloc02/spstkalloc02.scn: New files. * Makefile.am, configure.ac: Reflect changes above.
This commit is contained in:
@@ -1,3 +1,11 @@
|
||||
2011-12-14 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||
|
||||
PR 1924/cpukit
|
||||
* spstkalloc02/.cvsignore, spstkalloc02/Makefile.am,
|
||||
spstkalloc02/init.c, spstkalloc02/spstkalloc02.doc,
|
||||
spstkalloc02/spstkalloc02.scn: New files.
|
||||
* Makefile.am, configure.ac: Reflect changes above.
|
||||
|
||||
2011-12-13 Ralf Corsépius <ralf.corsepius@rtems.org>
|
||||
|
||||
* sp31/task1.c: Make Do_nothing static.
|
||||
|
||||
@@ -17,7 +17,7 @@ SUBDIRS = \
|
||||
sp70 sp71 sp72 sp73 sp74 sp75 sp76 sp2038 \
|
||||
spassoc01 spchain spclockget spcoverage spobjgetnext \
|
||||
spnotepad01 spprintk spprivenv01 sprbtree01 spsize spstkalloc \
|
||||
spthreadq01 spwatchdog spwkspace \
|
||||
spstkalloc02 spthreadq01 spwatchdog spwkspace \
|
||||
sperror01 sperror02 sperror03 \
|
||||
spfatal01 spfatal02 spfatal03 spfatal04 spfatal05 spfatal06 spfatal07 \
|
||||
spfatal08 spfatal09 spfatal10 spfatal11 spfatal12 spfatal13 spfatal14 \
|
||||
|
||||
@@ -180,6 +180,7 @@ spsimplesched02/Makefile
|
||||
spsimplesched03/Makefile
|
||||
spsize/Makefile
|
||||
spstkalloc/Makefile
|
||||
spstkalloc02/Makefile
|
||||
spthreadq01/Makefile
|
||||
spwatchdog/Makefile
|
||||
spwkspace/Makefile
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
@@ -0,0 +1,26 @@
|
||||
##
|
||||
## $Id$
|
||||
##
|
||||
|
||||
|
||||
rtems_tests_PROGRAMS = spstkalloc02
|
||||
spstkalloc02_SOURCES = init.c
|
||||
|
||||
dist_rtems_tests_DATA = spstkalloc02.scn
|
||||
dist_rtems_tests_DATA += spstkalloc02.doc
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
|
||||
include $(top_srcdir)/../automake/compile.am
|
||||
include $(top_srcdir)/../automake/leaf.am
|
||||
|
||||
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
|
||||
|
||||
LINK_OBJS = $(spstkalloc02_OBJECTS)
|
||||
LINK_LIBS = $(spstkalloc02_LDLIBS)
|
||||
|
||||
spstkalloc02$(EXEEXT): $(spstkalloc02_OBJECTS) $(spstkalloc02_DEPENDENCIES)
|
||||
@rm -f spstkalloc02$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
@@ -0,0 +1,162 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @ingroup sptests
|
||||
*
|
||||
* @brief Test that the task stack allocator works.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2011 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Obere Lagerstr. 30
|
||||
* 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.com/license/LICENSE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <tmacros.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <rtems/score/heap.h>
|
||||
|
||||
#define TASK_COUNT 5
|
||||
|
||||
#define PAGE_SIZE 1024
|
||||
|
||||
static Heap_Control task_stack_heap;
|
||||
|
||||
static void task_stack_init(size_t stack_space_size);
|
||||
|
||||
static void *task_stack_allocate(size_t stack_size);
|
||||
|
||||
static void task_stack_free(void *addr);
|
||||
|
||||
static void print_info(void)
|
||||
{
|
||||
Heap_Information_block info;
|
||||
|
||||
_Heap_Get_information(&task_stack_heap, &info);
|
||||
|
||||
printf(
|
||||
"used blocks = %" PRIu32 ", "
|
||||
"largest used block = %" PRIu32 ", "
|
||||
"used space = %" PRIu32 "\n"
|
||||
"free blocks = %" PRIu32 ", "
|
||||
"largest free block = %" PRIu32 ", "
|
||||
"free space = %" PRIu32 "\n",
|
||||
info.Used.number,
|
||||
info.Used.largest,
|
||||
info.Used.total,
|
||||
info.Free.number,
|
||||
info.Free.largest,
|
||||
info.Free.total
|
||||
);
|
||||
}
|
||||
|
||||
static rtems_task Init(rtems_task_argument argument)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
rtems_name name = rtems_build_name('S', 'T', 'K', 'A');
|
||||
rtems_id id = RTEMS_ID_NONE;
|
||||
int i = 0;
|
||||
|
||||
puts("\n\n*** POSIX TEST STKALLOC 02 ***");
|
||||
|
||||
print_info();
|
||||
|
||||
for (i = 2; i < TASK_COUNT; ++i) {
|
||||
sc = rtems_task_create(
|
||||
name,
|
||||
RTEMS_MINIMUM_PRIORITY,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed(sc, "rtems_task_create");
|
||||
}
|
||||
|
||||
sc = rtems_task_create(
|
||||
name,
|
||||
RTEMS_MINIMUM_PRIORITY,
|
||||
2 * RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
fatal_directive_status(sc, RTEMS_UNSATISFIED, "rtems_task_create");
|
||||
|
||||
sc = rtems_task_create(
|
||||
name,
|
||||
RTEMS_MINIMUM_PRIORITY,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed(sc, "rtems_task_create");
|
||||
|
||||
print_info();
|
||||
|
||||
puts("*** END OF POSIX TEST STKALLOC 02 ***");
|
||||
|
||||
rtems_test_exit(0);
|
||||
}
|
||||
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS TASK_COUNT
|
||||
|
||||
#define CONFIGURE_TASK_STACK_ALLOCATOR_INIT task_stack_init
|
||||
#define CONFIGURE_TASK_STACK_ALLOCATOR task_stack_allocate
|
||||
#define CONFIGURE_TASK_STACK_DEALLOCATOR task_stack_free
|
||||
#define CONFIGURE_TASK_STACK_ALLOCATOR_AVOIDS_WORK_SPACE
|
||||
#define CONFIGURE_TASK_STACK_FROM_ALLOCATOR(stack_size) \
|
||||
((stack_size) + HEAP_BLOCK_HEADER_SIZE + PAGE_SIZE - 1)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
static char task_stack_space
|
||||
[CONFIGURE_TASK_STACK_FROM_ALLOCATOR(CONFIGURE_STACK_SPACE_SIZE)];
|
||||
|
||||
static void task_stack_init(size_t stack_space_size)
|
||||
{
|
||||
bool ok = _Heap_Initialize(
|
||||
&task_stack_heap,
|
||||
task_stack_space,
|
||||
sizeof(task_stack_space),
|
||||
PAGE_SIZE
|
||||
);
|
||||
|
||||
rtems_test_assert(stack_space_size == CONFIGURE_STACK_SPACE_SIZE);
|
||||
rtems_test_assert(ok);
|
||||
}
|
||||
|
||||
static void *task_stack_allocate(size_t stack_size)
|
||||
{
|
||||
return _Heap_Allocate(&task_stack_heap, stack_size);
|
||||
}
|
||||
|
||||
static void task_stack_free(void *addr)
|
||||
{
|
||||
_Heap_Free(&task_stack_heap, addr);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 embedded brains GmbH.
|
||||
#
|
||||
# The license and distribution terms for this file may be
|
||||
# found in the file LICENSE in this distribution or at
|
||||
# http://www.rtems.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: spstkalloc01
|
||||
|
||||
directives:
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the task stack allocator works.
|
||||
@@ -0,0 +1,6 @@
|
||||
*** POSIX TEST STKALLOC 02 ***
|
||||
used blocks = 2, largest used block = 5120, used space = 10240
|
||||
free blocks = 1, largest free block = 20480, free space = 20480
|
||||
used blocks = 6, largest used block = 5120, used space = 30720
|
||||
free blocks = 0, largest free block = 0, free space = 0
|
||||
*** END OF POSIX TEST STKALLOC 02 ***
|
||||
Reference in New Issue
Block a user