동일한 클래스에서 여러 객체를 인스턴스화 할 때 코드가 실행되지 않지만 동일한 코드를 사용하여 중복 클래스에서 객체를 인스턴스화 할 때 작동합니다.

Vvamp

해결되었습니다! 문제는 내 부트 스크립트 내 주 소스 파일에서 비슷한 이름입니다. 자세한 내용은 답변을 참조하십시오.

나는 몇 주 동안이 놀라운 오류가 발생했습니다. 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.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);
           }
        }

};

그리고이 메인을 사용합니다.

#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??
};   
Vvamp

드디어 해결했습니다! 내가 문제가 될 것이라고 예상하지 못한 한 가지는 문제였습니다.

기본적으로 부트 스크립트를 호출하는 링커 스크립트가 있습니다. 블로그 게시물에서이 두 파일을 가져 왔습니다. 그러나 링커 스크립트는 'main'이라는 이름의 bootscript의 기능을 호출했습니다. 내 소스 파일의 내 기능이 'main'이라고도 불렸 기 때문에 문제가 발생했습니다. 그래서 내 소스의 주요 함수 만 호출되고 내 부트 스크립트는 호출되지 않았습니다. 즉, 내 bss가 0으로 재설정되지 않아 정의되지 않은 동작이 발생했습니다.

이것을 조사하지 않는 것은 어리석은 일이지만 나는 여전히이 모든 것에 대해 아주 새로운 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관