我必须实现一组串行移位寄存器,每个寄存器有8个输出。输出连接到开关,所以我目前在C中使用布尔数组来打开开关(true)或关闭开关(False)。
因此,每个移位寄存器都有一个包含8个布尔值的数组,它实际上是一个8位无符号整数。我可以继续处理数组,但我认为这样做要比按位操作整数慢得多。此外,将整数传递给SPI接口也比数组容易得多。
有没有一种简单的方法可以将布尔数组转换成整数,或者像操作数组一样操作这些整数?
即:
bool switch[8];
switch[0] = True; //Switch 1 on
switch[1] = False; //Switch 2 off
...等同于
uint8_t switch;
switch = 0b00000001;但在单独的交换机中思考时,更难阅读和编程。
性能是关键,因为我的SPI需要非常快。
发布于 2019-04-09 18:47:31
您不能使用数组语法(这将需要操作符重载,这在C++中是可能的)。但是您可以使用一些helperfunction来设置和获取位(/ 8和%8已针对位移位和and进行了优化,请注意,这与int作为索引类型不同)
typedef uint8_t bit_mem_t;
static inline void set_bit(bit_mem_t* array, unsigned index, bool value) {
array[index/8] = (array[index/8] | 1 << (index%8)) ^ !value << (index%8);
}
static inline bool get_bit(bit_mem_t const* array, unsigned index) {
return (array[index/8] & 1 << (index%8)) != 0;
}
static inline void flip_bit(bit_mem_t* array, unsigned index) {
array[index/8] ^= 1 << (index%8);
}
/*static inline size_t bit_array_size(size_t bit_count) {
return (bit_count+7) / 8;
}*/
#define bit_array_size(bit_count) (((size_t)(count)+7)/8)
int main() {
bit_mem_t array[bit_array_size(3)] {}; // clear it to 0s
set_bit(array, 0, true);
set_bit(array, 1, false);
set_bit(array, 2, !get_bit(array, 1));
}发布于 2019-04-09 18:56:59
使用uint8_t存储8位硬件相关数据,句号。如果它是一个内存映射的硬件寄存器,那么它也需要是volatile合格的。
如果你想给各个管脚命名,你可以通过定义来实现:
#define SWITCH3 (1u << 3);使用按位运算符进行访问。
uint8_t switch = 0;
switch = SWITCH1 | SWITCH3; // set all bits
switch |= SWITCH3; // set a specific bit
switch &= (uint8_t)~SWITCH3; // clear a specific bit发布于 2019-04-09 18:50:30
使用宏:
uint8_t sw;
#define SW_ON(s) sw=(sw|(1u<<(s)))
#define SW_OFF(s) sw=(sw&(~(1u<<(s))))并将其用作:
SW_OFF(3);
SW_ON(2);https://stackoverflow.com/questions/55590813
复制相似问题