2016-04-12 18 views
3

Ç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!

+0

Yeterli yığın alanı var mı? NomRight null mı? – Ross

+0

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. –

+0

_ "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

cevap

0

deneyin yığın değiştirmek ve startup_stm32fxxx.s dosyasının burada

kullanmak kodunuzu göre mikrodenetleyici boyutunu yığın yığın değeri o çizgiyle ayarlanır

;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** 
;* File Name   : startup_stm32f407xx.s 
;* Author    : MCD Application Team 
;* Version   : V2.4.3 
;* Date    : 22-January-2016 
;* Description  : STM32F407xx devices vector table for MDK-ARM toolchain. 
;*      This module performs: 
;*      - Set the initial SP 
;*      - Set the initial PC == Reset_Handler 
;*      - Set the vector table entries with the exceptions ISR address 
;*      - Branches to __main in the C library (which eventually 
;*      calls main()). 
;*      After Reset the CortexM4 processor is in Thread mode, 
;*      priority is Privileged, and the Stack is set to Main. 
;* <<< Use Configuration Wizard in Context Menu >>> 
;******************************************************************************* 
; 
;* Redistribution and use in source and binary forms, with or without modification, 
;* are permitted provided that the following conditions are met: 
;* 1. Redistributions of source code must retain the above copyright notice, 
;*  this list of conditions and the following disclaimer. 
;* 2. Redistributions in binary form must reproduce the above copyright notice, 
;*  this list of conditions and the following disclaimer in the documentation 
;*  and/or other materials provided with the distribution. 
;* 3. Neither the name of STMicroelectronics nor the names of its contributors 
;*  may be used to endorse or promote products derived from this software 
;*  without specific prior written permission. 
;* 
;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 
;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
; 
;******************************************************************************* 

; Amount of memory (in bytes) allocated for Stack 
; Tailor this value to your application needs 
; <h> Stack Configuration 
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> 
; </h> 

Stack_Size  EQU  0x200 ; <your stack size> 

       AREA STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem  SPACE Stack_Size 
__initial_sp 


; <h> Heap Configuration 
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 
; </h> 

Heap_Size  EQU  0x400 ; <your heap size> 

       AREA HEAP, NOINIT, READWRITE, ALIGN=3 
__heap_base 
Heap_Mem  SPACE Heap_Size 
__heap_limit 

       PRESERVE8 
       THUMB 


; Vector Table Mapped to Address 0 at Reset 
       AREA RESET, DATA, READONLY 
       EXPORT __Vectors 
       EXPORT __Vectors_End 
       EXPORT __Vectors_Size 

örnektir

Stack_Size  EQU  0x200 ; <your stack size> 

ve yığın

Heap_Size  EQU  0x400 ; <your heap size> 

Keil uVision'da, kod yığınınızı ve yığın boyutlarınızı değiştirmek için "Metin Düzenleyici" ve "Yapılandırma Sihirbazı" arasında geçiş yapabileceğiniz sol alt köşede 2 sekme vardır.

İlgili konular