PR 1991/cpukit - attr.c (really mode code) warning rework

This PR was about a warning for no previous prototype for
rtems_interrupt_level_attribute. This method exists (like
a few others) to have real bodies for Classic API services
implemented as macros. These macros are not available from
anything but C and C++. The most explicit use was in the Ada
binding but these would be needed from assembly language
or any other non-C based language.

On top of needing a prototype, the methods were misnamed.
They were related to modes.  This renames them, moves the
file, fixes test code, etc.
This commit is contained in:
Joel Sherrill
2012-02-02 16:57:42 -06:00
parent 1e1d018965
commit 5d44355937
7 changed files with 61 additions and 37 deletions
+2 -2
View File
@@ -206,8 +206,8 @@ pragma Elaborate_Body (RTEMS);
function Interrupt_Level (
Level : in RTEMS.Unsigned32
) return RTEMS.Attribute;
pragma Import (C, Interrupt_Level, "rtems_interrupt_level_attribute");
) return RTEMS.Mode;
pragma Import (C, Interrupt_Level, "rtems_interrupt_level_body");
Minimum_Stack_Size : RTEMS.Unsigned32;
pragma Import (C, Minimum_Stack_Size, "rtems_minimum_stack_size");
+1 -1
View File
@@ -255,7 +255,7 @@ librtems_a_SOURCES += src/dpmemdata.c
## WORKSPACE_FILES
librtems_a_SOURCES += src/workspace.c
librtems_a_SOURCES += src/attr.c
librtems_a_SOURCES += src/modes.c
librtems_a_SOURCES += src/status.c
+21
View File
@@ -96,6 +96,27 @@ typedef uint32_t Modes_Control;
#define RTEMS_INTERRUPT_LEVEL( _mode_set ) \
( (_mode_set) & RTEMS_INTERRUPT_MASK )
/**
* @brief Interrupt Mask Variable
*
* This variable is used by bindings from languages other than C and C++.
*/
extern const uint32_t rtems_interrupt_mask;
/**
* @brief Body for RTEMS_INTERRUPT_LEVEL macro.
*
* @param[in] level is the desired interrupt level
*
* @return This methods returns a mode with the desired interrupt
* @a level in the proper bitfield location.
*
* @note This variable is used by bindings from languages other than
* C and C++.
*/
Modes_Control rtems_interrupt_level_body(
uint32_t level
);
#ifndef __RTEMS_APPLICATION__
#include <rtems/rtems/modes.inl>
@@ -1,15 +1,19 @@
/**
* @file
*
* @body Body for Mode Routines Implemented as Macros
*
* This file contains bodies for Mode Macros which are
* needed by language bindings other than C and C++.
*/
/*
* Body for Attribute Routines
*
*
* COPYRIGHT (c) 1989-1999.
* COPYRIGHT (c) 1989-2012.
* On-Line Applications Research Corporation (OAR).
*
* 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$
*/
#if HAVE_CONFIG_H
@@ -21,9 +25,9 @@
#include <rtems/score/stack.h>
#include <rtems/rtems/modes.h>
uint32_t rtems_interrupt_mask = RTEMS_INTERRUPT_MASK;
const uint32_t rtems_interrupt_mask = RTEMS_INTERRUPT_MASK;
rtems_attribute rtems_interrupt_level_attribute(
Modes_Control rtems_interrupt_level_body(
uint32_t level
)
{
+20 -21
View File
@@ -1,28 +1,26 @@
/*
/**
* @brief Test for Bodies of Macros
*
* Interrupt Disable/Enable Tests
* Clock Tick from task level
*
* COPYRIGHT (c) 1989-2011.
*/
/*
* COPYRIGHT (c) 1989-2012.
* On-Line Applications Research Corporation (OAR).
*
* 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
#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
#define CONFIGURE_INIT
#include "system.h"
/* HACK: API visibilty violation */
extern rtems_attribute rtems_interrupt_level_attribute(uint32_t level);
/* prototypes */
void test_interrupt_inline(void);
void check_isr_in_progress_inline(void);
@@ -48,9 +46,9 @@ rtems_timer_service_routine test_isr_in_progress(
void test_interrupt_inline(void)
{
rtems_interrupt_level level;
rtems_attribute level_attribute;
rtems_attribute level_attribute_macro;
bool in_isr;
rtems_mode level_mode_body;
rtems_mode level_mode_macro;
bool in_isr;
puts( "interrupt is in progress (use body)" );
in_isr = rtems_interrupt_is_in_progress();
@@ -68,10 +66,10 @@ void test_interrupt_inline(void)
puts( "interrupt enable (use inline)" );
rtems_interrupt_enable( level );
puts( "interrupt level attribute (use inline)" );
level_attribute = rtems_interrupt_level_attribute( level );
level_attribute_macro = RTEMS_INTERRUPT_LEVEL(level);
if ( level_attribute_macro == level_attribute ) {
puts( "interrupt level mode (use inline)" );
level_mode_body = rtems_interrupt_level_body( level );
level_mode_macro = RTEMS_INTERRUPT_LEVEL(level);
if ( level_mode_macro == level_mode_body ) {
puts( "test case working.." );
}
}
@@ -189,7 +187,8 @@ rtems_task Init(
rtems_time_of_day time;
rtems_status_code status;
rtems_interrupt_level level;
rtems_attribute level_attribute,level_attribute_macro;
rtems_mode level_mode_body;
rtems_mode level_mode_macro;
bool in_isr;
rtems_id timer;
int i;
@@ -296,10 +295,10 @@ rtems_task Init(
puts( "interrupt enable (use body)" );
rtems_interrupt_enable( level );
puts( "interrupt level attribute (use body)" );
level_attribute = rtems_interrupt_level_attribute( level );
level_attribute_macro = RTEMS_INTERRUPT_LEVEL(level);
if ( level_attribute_macro == level_attribute ) {
puts( "interrupt level mode (use body)" );
level_mode_body = rtems_interrupt_level_body( level );
level_mode_macro = RTEMS_INTERRUPT_LEVEL(level);
if ( level_mode_macro == level_mode_body ) {
puts("test seems to work");
}
+1 -1
View File
@@ -20,7 +20,7 @@ directives:
rtems_interrupt_enable (inline/body)
rtems_interrupt_flash (inline/body)
RTEMS_INTERRUPT_LEVEL
rtems_interrupt_level_attribute
rtems_interrupt_level_body
concepts:
+4 -4
View File
@@ -2,15 +2,15 @@
*
* This include file contains information that is included in every
* function in the test set.
*
* COPYRIGHT (c) 1989-2007.
*/
/*
* COPYRIGHT (c) 1989-2012.
* On-Line Applications Research Corporation (OAR).
*
* 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$
*/
#include <tmacros.h>