首页 > 解决方案 > Raspberry Pi 4 GPPUDCLK0,C++ 赋值运算符静默失败?

问题描述

背景: 我正在尝试编辑 Raspberry Pi 4 的 GPPUDCLK0 寄存器,我可以从寄存器中读取,但是当我尝试将 (1<<21) 分配给它时,分配返回 0 而随后的读数显示寄存器保持不变不变。

问题: c++ 赋值运算符是否有可能静默失败?

资源

int fdgpio = this->open_gpio_file();
        
if (fdgpio >= 0) 
{   
unsigned int *gpio=(unsigned int *)mmap( 0, 4096, PROT_READ+PROT_WRITE, MAP_SHARED, fdgpio, 0);
    
//write the updated register value to the register
//gpio[GPIO_Control::PI_4_GPPUD_INT_OFFSET] = command;
std::cout << "equal be: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUD_INT_OFFSET] = command) << std::endl;
std::cout << "Commands: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUD_INT_OFFSET]) << std::endl;

int wait_count = 0;//count through count_limit cycles
while(wait_count < wait_limit)
{
    wait_count += 1;
}

unsigned short bit_offset;
unsigned short clock_offset;

if(32 > gpio_number)
{
    bit_offset = gpio_number;
    clock_offset = GPIO_Control::PI_4_GPPUDCLK0_INT_OFFSET;
}

else
{
    bit_offset = gpio_number - 32;
    clock_offset = GPIO_Control::PI_4_GPPUDCLK1_INT_OFFSET;
}

std::cout << "Clk Offset: " << clock_offset << std::endl;

//activate the clock
uint32_t temp = (1<<bit_offset);
std::cout << "equal be: " << std::bitset<32>(gpio[clock_offset] = temp) << std::endl;
std::cout << "Should be: " << std::bitset<32>(temp) << std::endl;
std::cout << "Clk 0: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUDCLK0_INT_OFFSET]) << std::endl;
std::cout << "Clk 1: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUDCLK1_INT_OFFSET]) << std::endl;


wait_count = 0;//count through count_limit cycles
while(wait_count < wait_limit)
{
    wait_count += 1;
}

//clear both registers
gpio[GPIO_Control::PI_4_GPPUD_INT_OFFSET] = 0;
gpio[clock_offset] = 0;

std::cout << "Commands: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUD_INT_OFFSET]) << std::endl;
std::cout << "Clk 0: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUDCLK0_INT_OFFSET]) << std::endl;
std::cout << "Clk 1: " << std::bitset<32>(gpio[GPIO_Control::PI_4_GPPUDCLK1_INT_OFFSET]) << std::endl;
}

来自对命令 01 和 10 的两个单独调用的输出

equal be:    00000000000000000000000000000010
Commands:    00000000000000000000000000000010
Clk Offset: 24
equal be:    00000000000000000000000000000000
Should be:   00000000001000000000000000000000
Clk 0:       00000000000000000000000000000000
Clk 1:       00000000000000000000000000000000
Commands:    00000000000000000000000000000000
Clk 0:       00000000000000000000000000000000
Clk 1:       00000000000000000000000000000000


equal be:    00000000000000000000000000000001
Commands:    00000000000000000000000000000001
Clk Offset: 24
equal be:    00000000000000000000000000000000
Should be:   00000000001000000000000000000000
Clk 0:       00000000000000000000000000000000
Clk 1:       00000000000000000000000000000000
Commands:    00000000000000000000000000000000
Clk 0:       00000000000000000000000000000000
Clk 1:       00000000000000000000000000000000

标签: c++raspberry-pi4

解决方案


推荐阅读