Rule 2.1
Moderators: misra-c, david ward
-
- Posts: 4
- Joined: Wed Feb 01, 2006 11:08 am
- Location: Bangalore, INDIA
Rule 2.1
What are the possible scenarios in which Rule 2.1 will be violated?
Rule allows for Macros, C-functions and Assembly functions.
If any assembly code is used directly it will be reported as an compliler error for undefined identifier etc.
Rule allows for Macros, C-functions and Assembly functions.
If any assembly code is used directly it will be reported as an compliler error for undefined identifier etc.
-
- Posts: 572
- Joined: Thu Jan 05, 2006 1:11 pm
C statements and assembler statements should not co-exist in a function unless the assembler is encapsulated in a macro.
The following example violates this rule.
The following example violates this rule.
Code: Select all
static void foo ( void )
{
asm { \"CLI\" };
foobar();
asm { \"SEI\" };
}
---
Posted by and on behalf of
the MISRA C Working Group
Posted by and on behalf of
the MISRA C Working Group
-
- Posts: 4
- Joined: Wed Feb 01, 2006 11:08 am
- Location: Bangalore, INDIA
Do the following code snippets violate Rule 2.1?
1. macro encapsulation:
#pragma asm
MOV A,B
....
....
#pragma endasm
2.function call
asm(\"CLI\");
or
move(\"MOV A,B\");
Also statements like
asm{ \"CLI\" };
seem to be compiler specific.
What are the other possible ways of violating this rule (compiler specific/not specific).
Also, please can you give examples where the rule is not violated.
1. macro encapsulation:
#pragma asm
MOV A,B
....
....
#pragma endasm
2.function call
asm(\"CLI\");
or
move(\"MOV A,B\");
Also statements like
asm{ \"CLI\" };
seem to be compiler specific.
What are the other possible ways of violating this rule (compiler specific/not specific).
Also, please can you give examples where the rule is not violated.
-
- Posts: 9
- Joined: Mon Oct 31, 2005 12:47 pm
In my understanding, there are the three solutions compliant with MISRA 2.1:Also, please can you give examples where the rule is not violated.
a) Assembler function:
nop.h:
Code: Select all
extern void nop(void);
Code: Select all
NOP PROC
nop
ret
NOP ENDP
Code: Select all
#include \"nop.h\"
static void function(void)
{
... /* do somthing */
nop();
... /* do somthing */
}
b) C-function encapsulation
nop.h:
Code: Select all
extern void nop(void);
nop.c:
Code: Select all
#include \"nop.h\"
void nop(void)
{
/* No code between bracket and pragma */
#pragma ASM
nop
#pragma ENDASM
/* No code between pragam and bracket */
}
/* No other function in nop.c, except other ASM encapsulation. */
Code: Select all
#include \"nop.h\"
static void function(void)
{
... /* do somthing */
nop();
... /* do somthing */
}
In this solution nop.c is not MISRA but the code is isolated.
Foo.c is MISRA.
c) macro-function
nop.h:
Code: Select all
#define nop()\ asm(\"nop\")
/* No other definition in nop.h file, except other assembleur encapsulation */
Code: Select all
#include \"nop.h\"
static void function(void)
{
... /* do somthing */
nop();
... /* do somthing */
}
Some (most of?) compiler requier to compile with a specific option when assembler code is use in C file.
This last solution should compliant with MISRA 2.1 but not with MISRA 1.1
(inline assembler is not C standard).