当从同一个 class 实例化多个 objects 时,代码不会 运行,但是当使用相同的代码从重复的 class 实例化 objects 时,代码确实有效

Code doesn't run when instancing multiple objects from the same class, but does work when instancing objects from a duplicate class with the same code

已解决! 在我的引导脚本我的主要源文件中发布了一个类似的名称。查看答案了解更多详情。

这个 mind-boggling 错误我已经好几个星期了。我正在为 GD32V 芯片编译。 发生的事情是,我有以下 class,它抽象了芯片的 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)' 和 'pin.write(0)',并且它有效。但是,一旦我实例化了 2 个引脚,即 pin1 和 pin2...我是否写入第二个引脚并不重要,我的代码就不会 运行。然而,现在有趣的是,如果我 copy/paste 这个 pin_out class 并将它和实例 2 objects 从这些不同的 class 中重命名,它 运行 再次。

这是 class 的样子:

 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;
 }

我用的是官方manufacturer's header files。 我自己怀疑设备 headers 中发生了一些优化问题,因为我的代码到目前为止只有 运行 具有 O2 和 O3 优化(不是更低或更高)。

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

编辑: 作为对答复的回应,这是我继承的 class。 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 这个 class 继承自:

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

我终于解决了! 我没想到的一件事就是问题。

基本上我有调用引导脚本的链接描述文件。我从一篇博文中抓取了这两个文件。然而,链接描述文件调用了引导脚本的函数,该函数被命名为 'main'。由于我自己的源文件中的函数也被称为'main',所以出了点问题。 所以只有我的源代码的主要功能被调用而不是我的引导脚本,这意味着我的 bss 没有被重置为 0,这导致了未定义的行为。

我很愚蠢,没有仔细研究这个问题,但我对这一切还是很陌生。