打印
[开发工具]

IAR怎么用C或内嵌汇编读写PRIMASK(中断标志位)??

[复制链接]
4162|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()
{
………………//临界断
}

使用特权

评论回复
5
香水城| | 2008-2-19 22:10 | 只看该作者

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

条件是不可分的原子操作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝