Çok garip bir problemim var. Bana bunun bilinen bir problem olduğu kulağa geliyor, ama bunun için herhangi bir gerçek çözüm ya da herhangi bir katı açıklama bulamıyorum.
Sunucu: Win7 PC RAM bolCortex M4 C++ Initializer üzerinde Sabit Hata
İşte benim kurulduğundan.
Hedef: Entegre ST-LINK ile Nucleo32 gemide 64 MHz STM32F303RE Cortex M4, 2.1
Toolchain: uVision V5.16
Preprocessor Semboller: USE_STDPERIPH_DRIVER, STM32F303xE, __ CPLUSPLUS__FPU_PRESENT, __ FPU_USED
Çeşitli Denetimler: --C99 --cpp
Tümü iyi yapılandırılmış. Tüm optimizasyonlar kapatıldı.
Sorun, çalışma zamanı boyunca. İşlemci, birkaç C++ nesne başlatıldıktan sonra hardfault işleyicide sona eriyor. Nerede tam olarak? Kod snippet'imi bölerek bunu işaretledim. Şimdi, C++ detayları ve iç işleyiş için yeni bir tür, ama bu bloke olarak aynı sorunu var gibi geliyor: Segmentation fault caused/avoided by changing source file order in Makefile
Ayrıca, net bir çözüm açıklanmadı. Belki de arızadaki C++ örneği değildir. Hiçbir çözüm bulunmamasına rağmen. İşte problemi gösteren programımın özü: Bu ilk bölüm, dikkatle ayrıldığım bölüm bloğu kadar iyi çalışacak şekilde kodun "görünmesi" dir.
#include "main.h" #include "stm32f30x.h" #include "stdint.h" #include "stdio.h" #include "string.h" #include "math.h" #include "usart.h" #include "can.h" #include "utils.h" #include "led.h" #include "i2c.h" #include "sabertooth.h" #include "FuzzyRule.h" #include "FuzzyComposition.h" #include "Fuzzy.h" #include "FuzzyRuleConsequent.h" #include "FuzzyOutput.h" #include "FuzzyInput.h" #include "FuzzyIO.h" #include "FuzzySet.h" #include "FuzzyRuleAntecedent.h" Fuzzy* fuzzy = new Fuzzy(); int main(void) { /************************************* * Input 1 ************************************/ // Two "crossing ramp" sets for rowWidth i.e. "tolerance" of the row FuzzyInput* rowWidth = new FuzzyInput(1); FuzzySet* lowTolerance = new FuzzySet(0.0f, 0.0f, 0.0f, 120.0f); rowWidth->addFuzzySet(lowTolerance); FuzzySet* highTolerance = new FuzzySet(0.0f, 120.0f, 120.0f, 120.0f); rowWidth->addFuzzySet(highTolerance); fuzzy->addFuzzyInput(rowWidth); USART1_puts("row width added as fuzzy input.."); /************************************* * Input 2 ************************************/ // Five Sets for "difference between R and L distances" FuzzyInput* distDiff = new FuzzyInput(2); FuzzySet* tooFarRight = new FuzzySet(-60.0f, -60.0f, -54.0f, -30.0f); distDiff->addFuzzySet(tooFarRight); FuzzySet* right = new FuzzySet(-54.0f, -30.0f, -30.0f, 0.0f); distDiff->addFuzzySet(right); FuzzySet* centered = new FuzzySet(-30.0f, 0.0f, 0.0f, 30.0f); distDiff->addFuzzySet(centered); FuzzySet* left = new FuzzySet(0.0f, 30.0f, 30.0f, 54.0f); distDiff->addFuzzySet(left); FuzzySet* tooFarLeft = new FuzzySet(30.0f, 54.0f, 60.0f, 60.0f); distDiff->addFuzzySet(tooFarLeft); fuzzy->addFuzzyInput(distDiff); USART1_puts("centering dist added as fuzzy input..."); /************************************* * Output 1 ************************************/ FuzzyOutput* motorSpeedDiff = new FuzzyOutput(1); // Seven sets for steering modes to take (close ones narrow far ones wider) FuzzySet* hardRight = new FuzzySet(-30.0f, -30.0f, -30.0f, -15.0f); motorSpeedDiff->addFuzzySet(hardRight); USART1_puts("\thardRight"); FuzzySet* lightRight = new FuzzySet(-15.0f, -5.0f, -5.0f, 0.0f); motorSpeedDiff->addFuzzySet(lightRight); USART1_puts("\tlightRight");
Bu Sert fay bu çizginin altına yeni FuzzySet sonraki çağrı() oluşur Terminalden "lightRight" gördüğün son seri mesajdır.
FuzzySet* nomRight = new FuzzySet(-30.0f, -15.0f, -15.0f, -5.0f); motorSpeedDiff->addFuzzySet(nomRight); USART1_puts("\tnomRight"); FuzzySet* lightLeft = new FuzzySet(0.0f, 5.0f, 5.0f, 15.0f); motorSpeedDiff->addFuzzySet(lightLeft); USART1_puts("\tlightLeft"); FuzzySet* goStraight = new FuzzySet(-5.0f, 0.0f, 0.0f, 5.0f); motorSpeedDiff->addFuzzySet(goStraight); USART1_puts("\tgoStraight"); FuzzySet* nomLeft = new FuzzySet(5.0f, 15.0f, 15.0f, 30.0f); motorSpeedDiff->addFuzzySet(nomLeft); USART1_puts("\tnomLeft"); FuzzySet* hardLeft = new FuzzySet(15.0f, 30.0f, 30.0f, 30.0f); motorSpeedDiff->addFuzzySet(hardLeft); USART1_puts("\thardLeft"); fuzzy->addFuzzyOutput(motorSpeedDiff); USART1_puts("motor steering added as fuzzy output"); lotsMoreSetupCode(); while(1) { USART1_puts("Done!"); stop(1); // Blink LED forever } }
Yani açıkça, sadece bir yerlerde le-yaban işaretçi sinekler her 4 yüzen bir koleksiyon olan bu bulanık kümelerin bir demet, yapma ama ben?
İşte FuzzySet.cpp içinde bulunan kurucu: (Ben yazmadım bir bulanık mantık kitaplığı parçası) Bu SAME programı, bir Arduino iyi çalışır, ancak bu işlemci değil. Derleyici farkı?
FuzzySet::FuzzySet(){
}
FuzzySet::FuzzySet(float a, float b, float c, float d){
this->a = a;
this->b = b;
this->c = c;
this->d = d;
this->pertinence = 0.0;
}
Statik değişkenler yapacak bir şey gibi geliyor
başka bağlamlarda diğer staticly beyan fonksiyonları tarafından erişilen.Ancak statik olarak bildirilen hiçbir şeyim yok.
Yığın değişim bağlantısındaki bir kişi, bir bağlayıcı hatası olabileceğini söylüyor. Katılıyor musun? Bu nasıl tamir edilir?
Gerçekte neler olduğuna dair herhangi bir fikir var mı?
Kayıt bilgilerini basan güzel sabit hata işleyicisini hazırladım, ancak ana() öğesinden önce bile hata oluştu. Bu yüzden işler karıştığında montaj koduna gitmek işe yaramıyor.
Bu tamir nasıl yapılır?C++ uzmanlığınız için teşekkürler!
Yeterli yığın alanı var mı? NomRight null mı? – Ross
Aslında, nomRight ve lightRight için çağrı sırasını değiştirebilirim, ancak aynı anda bu hata, hardDRight örneğini oluştururken, bu sefer gerçekleşir (iki yaratılanın ikincisi). Bu, bunun bir "boşluk" sorunu olduğunu ve "kötü bir nesne" türünde bir konu olmadığını düşünmemi sağlıyor. NomRight == NULL olup olmadığını kontrol etmenin bir yolu var mı? Nesnede bir kontrol yapabilir ve sonra terminale yazabilir miyim? Ben bir şans vereceğim. –
_ "görünüşte hata ana()" _ - önce bile gerçekleşir ama aynı zamanda büyük (büyük bir yığın) ana() 'nin iyi bir şekilde yürütüldükten sonra hatayı gördüğünü de söylediniz. Hangisi? Yan not: '- C99'? Gerçekten mi? – Notlikethat