⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitops.h

📁 小型操作系统,以VC为开发环境,需要boachs调试
💻 H
字号:
/***************************************************************************
**     File name   : const.h
**     Author      : x.cheng
**     Create date :
**
**	  Comments:
**		Bit operations.
**	
**     Revisions:
**     $Log: bitops.h,v $
**     Revision 1.1  2005/08/18 06:32:50  x.cheng
**     add into repositories
**
**
***************************************************************************/
#ifndef __BITOPS_H__
#define __BITOPS_H__

#include <const.h>

#define ADDR	( *(volatile long *)addr )

//! Determine whether a bit is set.
//static inline int test_bit(int nr, volatile void * addr)
static inline int iTestBit(int nr, volatile void * addr)
{
	int oldbit;

	__asm__ __volatile__ (
		"btl %2, %1\n"
		"sbbl %0, %0\n"
		:"=r"(oldbit)
		: "m"(ADDR), "Ir"(nr) );

	return( oldbit );
}

//! Atomically set a bit in memory.
static inline void set_bit(int nr, volatile void * addr)
{
	__asm__ __volatile__ (
		"lock ; btsl %1, %0"
		:"=m"(ADDR)
		: "Ir"(nr) );
}

//! Atomically clear a bit in memory.
static inline void clear_bit(int nr, volatile void * addr)
{
	__asm__ __volatile__ (
		"lock ; btrl %1, %0"
		: "=m"(ADDR)
		: "Ir"(nr) );
}

//! Toggle a bit in memory (complement).
static inline void change_bit( int nr, volatile void *addr )
{
	__asm__ __volatile__ (
		"lock ; btcl %1, %0"
		: "=m"(ADDR)
		: "Ir"(nr) );
}

//! Set a bit and return its old value.
static inline int test_and_set_bit( int nr, volatile void *addr )
{
	int oldbit;

	__asm__ __volatile__ (
		"lock\n"
		"btsl %2, %1\n"
		"sbbl %0, %0"
		: "=r"(oldbit), "=m"(ADDR)
		: "Ir"(nr)
		: "memory" );
	return oldbit;
}

#endif /* end of __BITOPS_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -