//============================================================================
//文件名称：common.c
//功能概要：实现构件公共要素的服务
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：2012-10-30  V2.0
//============================================================================
#include "common.h"
static  uint_32_t  int_disable_level; // 当前中断嵌套层数

//=========================================================================
//函数名称：init_critical
//参数说明：无
//函数返回：无
//功能概要：初始化临界区访问控制
//=========================================================================
void  init_critical(void)      //需要对内存中的特定数据进行保护，初始化为第一次
{                              //可访问的状态
    ENABLE_INTERRUPTS;
    int_disable_level = 0;
}

////#define ENABLE_INTERRUPTS  asm(" CPSIE i");    //开总中断
////CPSIE,Center Process System Interrupt Enable,中央处理系统中断使能
////实现原理：将PRIMASK(Primary Exception Mask Register)/FAULTMASK(一位的)置0，即为开中断
//=========================================================================
//函数名称：enter_critical
//参数说明：无
//函数返回：无
//功能概要：进入临界区                           //(1).是以中断的形式请求进入临界区的吗？请求的对象是什么？
//                             //应该是以中断的形式进入的，对象也应该是ISR  
//=========================================================================
void  enter_critical(void)     //进入临界区之前，需要先判断有没有中断服务例程(准确吗)
{                              //(2).已在访问临界区，如果有(不让该ISR继续访问吗?)，那么+1;
    if (0 == int_disable_level)//否则，进入临界区，关中断，不让其他中断打断执行，加1，为其他调用
    {                          //该函数enter_critical的ISR做判断，(调用时有循环吗，应该没有，进入与退出一一对应关系不匹配)
        DISABLE_INTERRUPTS;    //(3).不是已经使用DISABLE_INTERRUPTS语句了吗，屏蔽一切中断，除NMI和(硬(件)错误)外，其余ISR
    }                          //能打断正在执行的ISR吗?
    int_disable_level++;       //(4).这个值会是2吗？      如果可以，当第2个ISR调用该函数时，抢占吗，与优先级有关吗？不抢占的话，之后
}                              //到来的ISR继续以中断的形式请求，直到临界区无ISR占用吗？若抢占，关中断还有意义吗？(中断嵌套，值必会大于2)
                               //如果与优先级有关，只把更低的中断请求屏蔽掉吗？

//NMI和(硬(件)错误)?
//硬件错误是由于硬件的损害或缺陷造成的，因此数据总是不正确，此类错误是无法纠正的；
//软错误是随机出现的，例如在内存附近突然出现电子干扰等因素都可能造成内存软错误的发生。
//=========================================================================
//函数名称：exit_critical
//参数说明：无
//函数返回：无
//功能概要：离开临界区
//=========================================================================
void  exit_critical(void)       //如果没有成对使用，int_disable_level就会非零，临界区不就关不掉了吗，更低优先级的ISR进来，就不受限制
{                               //此时屏蔽不屏蔽完全失去意义 
    if (int_disable_level)
{
        int_disable_level--;
        if (0 == int_disable_level)
        {
            ENABLE_INTERRUPTS;
        }
    }
}
