[开发工具] IAR怎么用C或内嵌汇编读写PRIMASK(中断标志位)??

[复制链接]
5304|4
 楼主| ATmega32L 发表于 2008-2-17 17:46 | 显示全部楼层 |阅读模式
IAR怎么用C或内嵌汇编读写PRIMASK(中断标志位)?

static inline uint32 __get_primask(void)
{
  uint32 flags=PRIMASK;
  return flags;
}

static inline void __set_primask(uint32 flags)
{
    PRIMASK=flags;
}
香水城 发表于 2008-2-17 18:05 | 显示全部楼层

在STM32的固件库中,这是用一段汇编实现的

请看STM32F10xFWLibFWLibprojectEWARM目录下的cortexm3_macro.s文件,其中有两个函数:__SETPRIMASK 和 __RESETPRIMASK

在C程序中只需包含头文件STM32F10xFWLibFWLiblibraryinccortexm3_macro.h,即可使用这两个函数。
 楼主| ATmega32L 发表于 2008-2-18 13:25 | 显示全部楼层

看来只能:

看来只能: 
uint8 __get_primask(void) 

  asm( 
      "mrs r0,primask  " 
       "bx lr   "    
        ); 
  return 0; 


 void __set_primask(uint8 flags) 

  asm( 
      "msr primask,r0  "  
        ); 

 楼主| ATmega32L 发表于 2008-2-18 13:47 | 显示全部楼层

临界断宏

临界断宏:
#define CRITICAL()
  for(uint8 __flags=CriticalEnter(),__ToDo=1;__ToDo;__ToDo=0,CriticalExit(__flags))

uint8 __get_primask(void);

void __set_primask(uint8 flags);

static inline uint8 CriticalEnter(void)

  uint8 flags=__get_primask();
  __disable_interrupt();
  return flags;
}

static inline void CriticalExit(uint8 flags)
{
  __set_primask(flags);
}



使用:
CRITICAL()
{
………………//临界断
}

香水城 发表于 2008-2-19 22:10 | 显示全部楼层

在经典的操作系统层面上,临界段的保护可以不用屏蔽中断

条件是不可分的原子操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部