代码在实例化来自同一类的多个对象时不运行,但在使用相同代码从重复类实例化对象时起作用



已解决这个问题在我的bootscript我的主源文件中有一个类似的名称。查看答案了解更多详细信息。

我已经犯了这个令人难以置信的错误好几个星期了。我正在为GD32V芯片编译。实际情况是,我有以下类,它抽象了芯片的gpio引脚输出:

class pin_out : public hwlib::pin_out
{
private:
const pin_info_type & myPin;
bool status;
public:
pin_out(pins pin_number) : myPin(pin_info_array[(int)pin_number]){
rcu_periph_clock_enable(myPin.enable_register); 

gpio_init(myPin.port, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, myPin.pin);
gpio_bit_reset(myPin.port, myPin.pin);
status=0;
} 
void write(bool x){

if(x){
status=1;
gpio_bit_set(myPin.port,  myPin.pin);
}else{
gpio_bit_reset(myPin.port, myPin.pin);
status=0;
}
}
void flush(){
// Empty
}
void toggle(){
status=!status;
write(status);
}
};

这很好,我可以制作一个pin,并根据需要多次调用"pin.write(1("one_answers"pin.wwrite(0(",这很有效。然而,一旦我引用了两个引脚,即引脚1和引脚2……无论我是否写入第二个引脚,我的代码都不会运行。然而,现在有趣的是,如果我复制/粘贴这个pin_out类并重命名它以及这些不同类中的实例2对象,它就会再次运行。

这是这个类的样子:

class test_pin_out{
private:
const  pin_info_type & myPin;
public:
test_pin_out(pins pin_number) : myPin(pin_info_array[(int)pin_number]){
rcu_periph_clock_enable(myPin.enable_register); 

gpio_init(myPin.port, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, myPin.pin);
gpio_bit_reset(myPin.port, myPin.pin); 
}
void write(bool x){

if(x){
gpio_bit_set(myPin.port,  myPin.pin);
}else{
gpio_bit_reset(myPin.port, myPin.pin);
}
}
};

然后我使用这个主:

#include "hwlib.hpp"
int main(void)
{
hwlib::target::pin_out pin1 = hwlib::target::pin_out(hwlib::target::pins::led_blue);
hwlib::target::test_pin_out pin2 = hwlib::target::test_pin_out(hwlib::target::pins::led_green);
while(true){
pin1.write(1);
pin2.write(1);
}

return 0;
}

我使用的是官方制造商的头文件。就我自己而言,我怀疑设备标头中发生了一些优化问题,因为到目前为止,我的代码只运行O2和O3优化(不低于或高于(。

有人知道我可能要去哪里,或者我如何解决这个问题吗?

编辑:作为对回复的回应,这是我从中继承的类。Hwlib::pin_out

class pin_out : public noncopyable {
public:
/// @copydoc pin_in_out::write()  
virtual void write( bool x ) = 0;  

/// @copydoc pin_in_out::flush() 
virtual void flush() = 0; 
};

这个类继承自的类:

class noncopyable {
public:   
noncopyable( const noncopyable& ) = delete;
noncopyable& operator=( const noncopyable& ) = delete;
constexpr noncopyable() {}
// ~noncopyable() {} // somehow requires the heap??
};   

我终于解决了!有一件事我没想到会成为问题,那就是问题。

基本上,我让linkerscript调用bootscript。我从一篇博客文章中抓取了这两个文件。然而,链接脚本调用了bootscript的函数,该函数被命名为"main"。由于我自己在源文件中的函数也被称为"main",所以出现了问题。因此,只调用了我的源代码的主函数,而没有调用我的bootscript,这意味着我的bss没有重置为0,这导致了未定义的行为。

我不去调查这件事很愚蠢,但我对这一切还是很陌生。

最新更新