主要内容

MISRA C:2012 Dir 4.3

Assembly language shall be encapsulated and isolated

描述

指令定义

Assembly language shall be encapsulated and isolated.

理由

封装汇编语言是有益的,因为:

  • 将汇编指令封装在 C 源文件中可以清楚地标记 C 代码与汇编代码之间的边界,从而使代码更易于阅读。

  • 封装宏或函数的名称和文档明确了汇编语言的意图。

  • 为同一给定目的使用的汇编语言可以共享封装,从而提高可维护性。

  • 出于不同目标或静态分析目的需要替换汇编语言时会非常方便。

Polyspace 实现

如果在未使用封装的情况下使用汇编语言代码,则 Polyspace® 会报告违反此规则。如果汇编代码封装在下列项中,则不算违规:

  • 汇编语言函数。请参考以下代码:

    asm int h(int tt)  //Compliant            
    { 
      % reg val;                   
      mtmsr val;                  
      return 3;                   
    }; 
    
    void f(void) { 
      int x; 
      x = h(3);                    
    }
    函数 h() 被声明为封装汇编代码的 asm 函数。Polyspace 不会报告违规。

  • #pragma 指令。例如,在以下代码中:

    #pragma inline_asm(h)
    int h(int tt)  //Compliant            
    { 
      % reg val;                   
      mtmsr val;                  
      return 3;                   
    }; 
    
    void f(void) { 
      int x; 
      x = h(3);                    
    }
    #inline_asm pragma 将函数 h() 指定为汇编语言函数。Polyspace 不会报告违规。

  • 宏。例如:

    #define FUNC_H\
    asm\
    {\
     % reg val; \                  
      mtmsr val;\                  
      return 3; \                  
    }; \
    
    void f(void) { 
      int x; 
      x = FUNC_H(3);                    
    } 
    FUNC_H 封装了汇编代码。Polyspace 不会报告违规。在进行 Polyspace 分析期间,您还可以在命令行上使用预处理器定义 (-D) 选项来定义此类宏。

故障排除

如果您预计存在违规,但未看到该违规,请参阅Diagnose Why Coding Standard Violations Do Not Appear as Expected

示例

全部展开

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) { 
    isTaskActive = FALSE; 
    // Software interrupt for task switching 
    asm volatile   /* Non-compliant */
    ( 
        "SWI &02"     /* Service #1: calculate run-time */ 
    ); 
    return; 
} 

在此示例中,汇编语言代码直接嵌套在包含了其他 C 语言语句的 C 函数 taskHandler 中,因此出现了违规。

更正 - 将汇编代码封装到宏中

一种更正方法是将汇编语言代码封装到一个宏中,并在函数 taskHandler 中调用该宏。

#define  RUN_TIME_CALC \
asm volatile \
    ( \
        "SWI &02"     /* Service #1: calculate run-Time */ \
    )\

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) {
    isTaskActive = FALSE;
    RUN_TIME_CALC;
    return;
}

检查信息

组:代码设计
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出

Go to top of page