STM32F4 basit bir hesap işlemi yaptırınca program crash oluyor

Başlatan magnetron, 21 Mart 2013, 18:19:16

magnetron

merhaba forum,

aşağıdaki kodu STM32F4 de çalıştırmak istiyorum
( compiler = yagarto )

float hypo2;
int32_t XH=0,YH=0,ZH=0;
...............
hypo2= (XH*(XH*1.0) + YH*(YH*1.0)+ ZH*(ZH*1.0));


yukardaki kodda XH YH ZH integer ama hesaplamanın sonucu float olacak
bu yüzden karelerini hesaplarken 1.0 sabitiyle çarpıp float haline getirmek istiyorum

mesela  XH = 10000   YH = 0   ZH =0  iken bu satırda hardfaulta düşüyor

bu kod STM32F103 de hatasız çalışıyordu

ama F4 'te çalışmıyor

yardımlarınızı bekliyorum

teşekkür

z

Math işlemci kullanılarak hesaplanacaksa fakat startup kodlarda bu donanımın clk kaynağı açık değilse hard fauld oluşur.

Duruma sen karar ver. Ya işlemleri soft yaptır yada hard yaptıracaksan ilgili donanımı aktif et.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

magnetron

Z hocam cevap için teşekkür

acaba soft nasıl yaptırıcam ?

ben eclipse + yagarto kullanıyorum

sanırım makefile da bir opsiyonu belirtmek lazım

# Flags
CFLAGS = -Wall -fno-common -c -g -mcpu=cortex-m3 -mthumb
CFLAGS += -g $(OPTIMIZATION) $(INCLUDES) -DTRACE_LEVEL=$(TRACE_LEVEL)
ASFLAGS = -g -mapcs-32
LDFLAGS = -mcpu=cortex-m3 -mthumb -g -v -nostartfiles
OBJCOPYFLAGS = -O binary
OBJDUMPFLAGS = -x --syms -S
.................................
$(OUTPUT).out: $(C_OBJECTS) $(ASM_OBJECTS) $(LINKER_SCRIPT)
	@ echo "..linking"
	$(LD) $(LDFLAGS) -T$(LINKER_SCRIPT) -o $(OUTPUT).out $(C_OBJECTS) $(ASM_OBJECTS) -lm libgcc.a
	$(OBJCOPY) $(OBJCOPYFLAGS) $(OUTPUT).out $(OUTPUT).bin
	@ echo "...completed."

z

https://www.picproje.org/index.php/topic,35794.msg301588.html#msg301588

main fonksiyonundan FpuEnb() fonksiyonunu çağır. Fonksiyon aşağıda. Ancak kullandığın derleyicide asm yazım daha faklı olabilir.
Aşağıdaki fonksiyonun içindeki kodları (BX LR  satırı hariç) startup benzeri asm dosyan varsa main fonksiyonunun çağrıldığı satırın hemen üstüne ekleyebilirsin.


void __ASM FpuEnb()
{
        LDR     R0, =0xE000ED88           
        LDR     R1,[R0]
        ORR     R1,R1,#(0xF << 20)
        STR     R1,[R0]
        BX       LR
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fractal

bu fpu ve rom ile başlayan fonksiyonlar ne anlama geliyor?
Restantum cogniscutur Quantum deligutur

z

Stellaris ailesinde fabrikasyon olarak rom içine gömülü fonksiyonlar var. Init fonksiyonları vs hazır olarak orda. Herhalde ondan bahsediyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fractal

rom lu fonksiyon  ile  romsuz olanın arasındaki fark nedir?böyle ayırmadaki hedef nedir?
Restantum cogniscutur Quantum deligutur

magnetron

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif


Z hocam Systeminit fonksiyonunda yukardaki gibi bir kod parçası var

FPU_PRESENT tanımlı ama FPU_USED tanımlı değil o yüzden SCB->CPACR diye başlayan satır çalıştırılmıyor

acaba FPU_USED un önüne comment yapsam FPU çalışır mı ?
çünkü sizin verdiğiniz asm kodlarındaki register adresi ile  SCB->CPACR adresi aynı

bir de diğer komponentler clock ları açtığımız gibi
FPU clock da açacak mıyız ?
o nasıl olacak ?

z

 /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

satırlarını

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

olarak değiştirip bir dene.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

magnetron

hocam onu da denedim gene hardfaulta gidiyor

ST nin forumuna sorduğumda benim compiler Yagarto'nun THUMB komut seti yerine 32 bit ARM kodu assembly komutları oluşturduğunu söylediler bu da mikroyu hardfaulta sokuyormuş

olay eclipse makefile den kaynaklanıyor gibime geliyor
bir de siz baksanız

# Flags
CFLAGS = -Wall -fno-common -c -g -mcpu=cortex-m3 -mthumb
CFLAGS += -g $(OPTIMIZATION) $(INCLUDES) -DTRACE_LEVEL=$(TRACE_LEVEL)
ASFLAGS = -g -mapcs-32
LDFLAGS = -mcpu=cortex-m3 -mthumb -g -v -nostartfiles
OBJCOPYFLAGS = -O binary
OBJDUMPFLAGS = -x --syms -S

all: $(BIN) $(OBJ) $(OUTPUT).out

$(BIN) $(OBJ):
	mkdir $@

$(OUTPUT).out: $(C_OBJECTS) $(ASM_OBJECTS) $(LINKER_SCRIPT)
	@ echo "..linking"
	$(LD) $(LDFLAGS) -T$(LINKER_SCRIPT) -o $(OUTPUT).out $(C_OBJECTS) $(ASM_OBJECTS) -lm libgcc.a
	$(OBJCOPY) $(OBJCOPYFLAGS) $(OUTPUT).out $(OUTPUT).bin
	@ echo "...completed."



z

Sizin derleyiciden anlamam ama eğer thumb kod yerine ARM kod üretiliyorsa faulta gitmesi çok normal.

Keil işinizi görmüyormu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fractal

FPU>floting Point Unit miş.ama tam olarak nerde kullanıyor bilmiyorum.ondalıklı sayı işlemedemi yoksa shift register gibi bir işi adım adım yapmadamı bilmem.

ROM lu fonksiyonlar ise daha doğrusu stellarisin romu;
1.flash dan kazanmak için ROM Periferik Sürücü Kitaplığı API'leri, Flash bellek azaltma, uygulamaları
2.crc kontrol için
3.aes şifreleme için
4.bootloader için
zort
Restantum cogniscutur Quantum deligutur