--- cpukit/score/include/rtems/score/wkspace.h | 11 +++++++++++ cpukit/score/src/wkspace.c | 5 +++++ testsuites/sptests/spwkspace/init.c | 14 ++++++++++++++ testsuites/sptests/spwkspace/spwkspace.doc | 2 ++ testsuites/sptests/spwkspace/spwkspace.scn | 2 ++ 5 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/cpukit/score/include/rtems/score/wkspace.h b/cpukit/score/include/rtems/score/wkspace.h index 7adf9df..ea8ad85 100644 --- a/cpukit/score/include/rtems/score/wkspace.h +++ b/cpukit/score/include/rtems/score/wkspace.h @@ -72,6 +72,17 @@ void *_Workspace_Allocate( ); /** + * @brief Allocate aligned memory from workspace. + * + * @param[in] size The size of the requested memory. + * @param[in] alignment The alignment of the requested memory. + * + * @retval NULL Not enough resources. + * @retval other The memory area begin. + */ +void *_Workspace_Allocate_aligned( size_t size, size_t alignment ); + +/** * @brief Free memory to the workspace. * * This function frees the specified block of memory. If the block diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c index b948296..6580686 100644 --- a/cpukit/score/src/wkspace.c +++ b/cpukit/score/src/wkspace.c @@ -114,6 +114,11 @@ void *_Workspace_Allocate( return memory; } +void *_Workspace_Allocate_aligned( size_t size, size_t alignment ) +{ + return _Heap_Allocate_aligned( &_Workspace_Area, size, alignment ); +} + /* * _Workspace_Free */ diff --git a/testsuites/sptests/spwkspace/init.c b/testsuites/sptests/spwkspace/init.c index 1441662..f6102e2 100644 --- a/testsuites/sptests/spwkspace/init.c +++ b/testsuites/sptests/spwkspace/init.c @@ -54,6 +54,17 @@ static void test_workspace_string_duplicate(void) _Workspace_Free( dup_e ); } +static void test_workspace_allocate_aligned(void) +{ + uintptr_t align = 512; + void *p = _Workspace_Allocate_aligned( 1, align ); + + rtems_test_assert( p != NULL ); + rtems_test_assert( ((uintptr_t) p & (align - 1)) == 0 ); + + _Workspace_Free( p ); +} + rtems_task Init( rtems_task_argument argument ) @@ -100,6 +111,9 @@ rtems_task Init( puts( "_Workspace_String_duplicate - samples" ); test_workspace_string_duplicate(); + puts( "_Workspace_Allocate_aligned" ); + test_workspace_allocate_aligned(); + puts( "*** END OF TEST WORKSPACE CLASSIC API ***" ); rtems_test_exit( 0 ); } diff --git a/testsuites/sptests/spwkspace/spwkspace.doc b/testsuites/sptests/spwkspace/spwkspace.doc index 3b03781..dcd4e7a 100644 --- a/testsuites/sptests/spwkspace/spwkspace.doc +++ b/testsuites/sptests/spwkspace/spwkspace.doc @@ -15,6 +15,8 @@ directives: rtems_workspace_get_information rtems_workspace_allocate rtems_workspace_free + _Workspace_String_duplicate + _Workspace_Allocate_aligned concepts: diff --git a/testsuites/sptests/spwkspace/spwkspace.scn b/testsuites/sptests/spwkspace/spwkspace.scn index 0fe8088..6431923 100644 --- a/testsuites/sptests/spwkspace/spwkspace.scn +++ b/testsuites/sptests/spwkspace/spwkspace.scn @@ -7,4 +7,6 @@ rtems_workspace_allocate - too many bytes rtems_workspace_allocate - 42 bytes rtems_workspace_free - NULL rtems_workspace_free - previous pointer to 42 bytes +_Workspace_String_duplicate - samples +_Workspace_Allocate_aligned *** END OF TEST WORKSPACE CLASSIC API *** -- 1.7.7 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel