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的大小,第二个不会。感谢你的回答,问题解决了。我更改了这些()太多了,最后我有点失去了概述:)