Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 位实用程序不';好像不行_C_Bit - Fatal编程技术网

C 位实用程序不';好像不行

C 位实用程序不';好像不行,c,bit,C,Bit,我试图指定一些定义来设置和获取寄存器中的位,但它们似乎不起作用。我认为这与基础和偏移量的增加有关。当我在单独的函数中指定这些函数时,它们确实可以工作,但我不想每次设置寄存器时都执行函数调用 #ifndef COMMON_UTILS_H_ #define COMMON_UTILS_H_ #include <inttypes.h> #include <stdbool.h> typedef volatile unsigned int * address; /* Get t

我试图指定一些定义来设置和获取寄存器中的位,但它们似乎不起作用。我认为这与基础和偏移量的增加有关。当我在单独的函数中指定这些函数时,它们确实可以工作,但我不想每次设置寄存器时都执行函数调用

#ifndef COMMON_UTILS_H_
#define COMMON_UTILS_H_

#include <inttypes.h>
#include <stdbool.h>

typedef volatile unsigned int * address;

/* Get the adresse of a register */
#define GET_REG(base, offset) ((address)(base+offset));

/* Get the value of a given register */
#define GET_REG_BIT(base, offset, pos) *((address)base+offset) & (1 << pos);

/* Set bit of given register */
#define SET_REG_BIT(base, offset, pos) *((address)(base+offset)) |= (1 << pos);

/* Clear bit of given register */
#define CLEAR_REG_BIT(base, offset, pos) *((address)(base+offset)) &= ~(1 << pos);

/* Poll register until bit is set */
#define POLL_REG_SET(base, offset, pos) while(*((address)base+offset) & (1 << pos) != 1){};

/* Clear register */
#define CLEAR_REG(base, offset) *((address)base+offset) = 0x0;

/* Get int-value of a specivied range of bits - lsb starting at 0 */
#define GET_BIT_RANGE(x,msb,lsb) (x >> lsb) & ~(~0 << (msb-lsb+1))
\ifndef COMMON\u UTILS\H_
#定义常用工具_
#包括
#包括
typedef volatile unsigned int*地址;
/*取得登记簿的地址*/
#定义GET_REG(基、偏移量)((地址)(基+偏移量));
/*获取给定寄存器的值*/

#定义GET_REG_位(基数、偏移量、pos)*((地址)基数+偏移量)和(1)向我们显示哪些有效,哪些无效,并定义“无效”。您应该在宏定义中的每个宏参数名称周围加上括号。此外,宏定义应该完全包含在括号中。最后,在宏定义末尾加分号通常是一个坏主意。我不知道这是否会导致您的问题-这只是一个应遵循的常规做法o避免将表达式作为宏参数传递时出现问题。是的,很抱歉,在运行时正确设置了定义中的所有值,但在实际执行操作时,没有设置任何值。getter确实返回一个值,因此我认为可能只有set_REG_位定义没有完成它应该做的事情。您应该知道de>(地址)base+offset
(地址)(base+offset)
不是一回事。我不确定你到底想要哪个,但你两者都用了,所以这是错误的。第一个将
offset
乘以int的大小,第二个不会。感谢你的回答,问题解决了。我更改了这些()太多了,最后我有点失去了概述:)