当从同一个 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,这导致了未定义的行为。
我很愚蠢,没有仔细研究这个问题,但我对这一切还是很陌生。
已解决! 在我的引导脚本我的主要源文件中发布了一个类似的名称。查看答案了解更多详情。
这个 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,这导致了未定义的行为。
我很愚蠢,没有仔细研究这个问题,但我对这一切还是很陌生。