해결되었습니다! 문제는 내 부트 스크립트 내 주 소스 파일에서 비슷한 이름입니다. 자세한 내용은 답변을 참조하십시오.
나는 몇 주 동안이 놀라운 오류가 발생했습니다. 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??
};
드디어 해결했습니다! 내가 문제가 될 것이라고 예상하지 못한 한 가지는 문제였습니다.
기본적으로 부트 스크립트를 호출하는 링커 스크립트가 있습니다. 블로그 게시물에서이 두 파일을 가져 왔습니다. 그러나 링커 스크립트는 'main'이라는 이름의 bootscript의 기능을 호출했습니다. 내 소스 파일의 내 기능이 'main'이라고도 불렸 기 때문에 문제가 발생했습니다. 그래서 내 소스의 주요 함수 만 호출되고 내 부트 스크립트는 호출되지 않았습니다. 즉, 내 bss가 0으로 재설정되지 않아 정의되지 않은 동작이 발생했습니다.
이것을 조사하지 않는 것은 어리석은 일이지만 나는 여전히이 모든 것에 대해 아주 새로운 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다