【问题标题】: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当从同一个类中实例化多个对象时,代码不会运行,但在使用相同代码从重复类中实例化对象时确实有效
【发布时间】:2020-10-30 09:34:46
【问题描述】:

解决了! 该问题在我的主源文件的引导脚本中具有相似的名称。查看答案了解更多详情。

我已经犯了这个令人难以置信的错误好几个星期了。我正在为 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)' 和 'pin.write(0)' 任意次数并且它有效。但是,只要我实例化 2 个引脚,即 pin1 和 pin2 ......无论我是否写入第二个引脚,我的代码都不会运行。然而,现在有趣的是,如果我复制/粘贴这个 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);
           }
        }

};

然后我使用这个 main:

#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。 我自己怀疑设备标头中发生了一些优化问题,因为我的代码到目前为止只运行 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??
};   

【问题讨论】:

  • 请原谅我,但您的 test_pin_out 课程与您的 pin_out 课程不同。特别是您的 pin_out 类继承自 hwlib::pin_outtest_pin_out 没有。
  • 您继承的类型的文档必须说明 1) 被继承自,2) 被多次实例化。
  • @john 是的,它不会继承。 pin_out 只是一个抽象类。它不添加功能。不过我会把它添加到问题中:)
  • 我强烈建议不要围绕 GPIO 编写通用包装器。在你尝试之前几千,在你失败之前几千。它增加了很多膨胀、滞后和错误,但没有任何价值。相反,您可能应该为使用 GPIO 的项目特定硬件编写驱动程序。因为... GPIO 不是火箭科学。设置数据方向寄存器。设置一个拉电阻寄存器。可选择启用中断。访问端口寄存器。就是这样。
  • @Lundin 我部分不同意,但这个讨论与我的问题完全无关。如果您想继续讨论,最好通过聊天进行。为了我自己的个人发展,我只是需要这个问题的帮助,如果你不同意,那很好,但我的理由是我的。

标签: c++ gcc embedded ld riscv


【解决方案1】:

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

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

我很愚蠢,不去研究这个,但我对这一切还是很陌生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2012-01-13
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多