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