Cubemx'de FATFS sorunu

Başlatan Gökhan BEKEN, 31 Aralık 2015, 22:55:22

z

#15
Tamam işlemcinin adını daha önce yazdıysan da dikkat etmemişim.

İşlemcinin Rami 8K imiş. 0x2000 bunu 4'e bölersek

0x800. Bu durumda Stack adresini 0x20000800 üstüne çıkartamayız.

Alıntı YapR13 -> 0x20000830
R14 -> 0x08000167

sonra
R13 -> 0x2000086C
R14 -> 0x08000167

Bu durumda 0x20000830 ve 0x2000086C neden faulta düştüğünü açıklıyor.

Stack_Size      EQU     0x00000700 yazmayı dene bir de.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMP_Otto

Startup kodum aşagıdaki gibi hocam
;******************** (C) COPYRIGHT 2015 STMicroelectronics ********************
;* File Name          : startup_stm32l053xx.s
;* Author             : MCD Application Team
;* Version            : $VERSION$
;* Date               : $DATE$
;* Description        : STM32l053xx 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 Cortex-M0+ 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     0x00000800

                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     0x00000400

                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

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     DebugMon_Handler          ; Debug Monitor Handler
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV Handler
                DCD     SysTick_Handler           ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                ; Window Watchdog
                DCD     PVD_IRQHandler                 ; PVD through EXTI Line detect
                DCD     RTC_IRQHandler                 ; RTC through EXTI Line
                DCD     FLASH_IRQHandler               ; FLASH
                DCD     RCC_CRS_IRQHandler             ; RCC and CRS
                DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1
                DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3
                DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15
                DCD     TSC_IRQHandler                 ; TSC
                DCD     DMA1_Channel1_IRQHandler       ; DMA1 Channel 1
                DCD     DMA1_Channel2_3_IRQHandler     ; DMA1 Channel 2 and Channel 3
                DCD     DMA1_Channel4_5_6_7_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7
                DCD     ADC1_COMP_IRQHandler           ; ADC1, COMP1 and COMP2 
                DCD     LPTIM1_IRQHandler              ; LPTIM1
                DCD     0                              ; Reserved
                DCD     TIM2_IRQHandler                ; TIM2
                DCD     0                              ; Reserved
                DCD     TIM6_DAC_IRQHandler            ; TIM6 and DAC
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     TIM21_IRQHandler               ; TIM21
                DCD     0                              ; Reserved
                DCD     TIM22_IRQHandler               ; TIM22
                DCD     I2C1_IRQHandler                ; I2C1
                DCD     I2C2_IRQHandler                ; I2C2
                DCD     SPI1_IRQHandler                ; SPI1
                DCD     SPI2_IRQHandler                ; SPI2
                DCD     USART1_IRQHandler              ; USART1
                DCD     USART2_IRQHandler              ; USART2
                DCD     RNG_LPUART1_IRQHandler         ; RNG and LPUART1
                DCD     LCD_IRQHandler                 ; LCD
                DCD     USB_IRQHandler                 ; USB
                
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler routine
Reset_Handler    PROC
                 EXPORT  Reset_Handler                 [WEAK]
        IMPORT  __main
        IMPORT  SystemInit  
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                    [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler              [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                    [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler               [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler                 [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler                [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler                [WEAK]
                EXPORT  PVD_IRQHandler                 [WEAK]
                EXPORT  RTC_IRQHandler                 [WEAK]
                EXPORT  FLASH_IRQHandler               [WEAK]
                EXPORT  RCC_CRS_IRQHandler             [WEAK]
                EXPORT  EXTI0_1_IRQHandler             [WEAK]
                EXPORT  EXTI2_3_IRQHandler             [WEAK]
                EXPORT  EXTI4_15_IRQHandler            [WEAK]
                EXPORT  TSC_IRQHandler                 [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler       [WEAK]
                EXPORT  DMA1_Channel2_3_IRQHandler     [WEAK]
                EXPORT  DMA1_Channel4_5_6_7_IRQHandler [WEAK]
                EXPORT  ADC1_COMP_IRQHandler           [WEAK]
                EXPORT  LPTIM1_IRQHandler              [WEAK]
                EXPORT  TIM2_IRQHandler                [WEAK]
                EXPORT  TIM6_DAC_IRQHandler            [WEAK]
                EXPORT  TIM21_IRQHandler               [WEAK]
                EXPORT  TIM22_IRQHandler               [WEAK]
                EXPORT  I2C1_IRQHandler                [WEAK]
                EXPORT  I2C2_IRQHandler                [WEAK]
                EXPORT  SPI1_IRQHandler                [WEAK]
                EXPORT  SPI2_IRQHandler                [WEAK]
                EXPORT  USART1_IRQHandler              [WEAK]
                EXPORT  USART2_IRQHandler              [WEAK]
                EXPORT  RNG_LPUART1_IRQHandler         [WEAK]
                EXPORT  LCD_IRQHandler                 [WEAK]
                EXPORT  USB_IRQHandler                 [WEAK]


WWDG_IRQHandler
PVD_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_CRS_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TSC_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_6_7_IRQHandler
ADC1_COMP_IRQHandler 
LPTIM1_IRQHandler
TIM2_IRQHandler
TIM6_DAC_IRQHandler
TIM21_IRQHandler
TIM22_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
RNG_LPUART1_IRQHandler
LCD_IRQHandler
USB_IRQHandler

                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
Bu işler zordur,özveri ister...

z

#17
İstediğim register değerlerinden RAM dışına çıktığını ve bu yüzden hardfaulta düştüğün anlaşılıyor.

Hocam heap memory kullanmadan kodu yazabiliyorsan stack'ı sona aldığında sorun çıkmaması lazım.

Ramın çok az. Heep memory falan tanımlama.

Heap size 0x000
stack size 0x800

işini görmüyorsa uzaktan çözüm üretmek çok zor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMP_Otto

Hocam buda FAtfs nesnesini main icerisinde tanımlayınca hardfaultta düştüğü nokta


0x080002FC B510      PUSH     {r4,lr}  komutunuda işlettikten sonra Hardfaulta düşüyor işlemci
Bu işler zordur,özveri ister...

z

#19
Faulta düşmen normal SP 0x1FFFE720.

Sen en iyisi startup kodununun tamamını bir yolla.

Pardon startup kodunu vermişsin. İnceliyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMP_Otto

 Yukarıda yolladım hocam.
Bu işler zordur,özveri ister...

z

#21
Stack_Size      EQU     0x00000800

Heap_Size       EQU     0x00000000

Yap ve öyle dene.

Değişkenleri vs global alanda aç.

Bu durumda Malloc vs kullanmayacaksın. Eğer fonskiyonlar kullanıyorsa yapacak bir şey yok.

Çok ince ayarla belki çalışır ama programda yapacağın en küçük değişiklikde gene işlemcin faulta düşer.

Heap size 0 olunca ve değişkenler global tanımlanınca ne oluyor onu görelim. Olabildiğince main içinde  buffer falan oluşturma. Hepsi global olsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

EMP_Otto

Hocam dediğiniz ayarlarda  Error: L6406E: No space in execution regions with .ANY selector matching main.o(.bss) hatasını alıyorum malesef.Ayrıca FAtfs memcpy,malloc gibi fonksiynları kullanmak zorunda onun içinde heap alanı tanımlamam lazım diye düşünüyorum.
Bu işler zordur,özveri ister...

z

Peki mallocla açılan alanın boyutunu küçültemiyormusun?

Fatfs'in muhakkak bir yerlerde ihtiyaç duyduğu ram miktarı yazıyordur.

O bilgilerden yararlanarak belki heap ve stack değerleri hesaplanabilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Alıntı yapılan: EMP_Otto - 06 Ocak 2016, 13:46:00
...
Kullandıgım spi flashın sector size 4k oldugu için FAtfs de 4k lık bir buffera ihtiyac duyuyor
....

Bence burada bir problem var.
4k yani 4 kilobyte yani 4096 byte SECTOR boyutu FAT dosya sistemi için biraz sıradışı,
tabiki konu fat değil fiziksel memory,
32 gigabyte kartlarda dahi 512 byte SECTOR boyutu var,
(hernekadar 1024 yapabilme imkanı bazen olabilsede,
fiziksel olarak SD karttan 1 SECTOR = 512 BYTE olarak işleme tabi tutularak okunuyor.)

Şimdi birkaç durum olabilir;
Birincisi kullandığın spi flash ın SECTOR size diye ifade ettiği FATfs de CLUSTER size a denk geliyor olabilir,
bence kuvvetle muhtemel durum bu.

Birincisi değilse ki bunu şöyle anlayabiliriz:
Kullandığın flash memory
sadece 4kByte katları adreslerle erişime izin veriyorsa
yani misal
ancak ve ancak
4096
8192
... gibi
adreslerini girip okuma yazma yapılabiliyor,
512
1024
... gibi
adresleri girince okuma yazma yaptırmıyorsa
(ki bence bu pek olası değil)
Bu durumda kullandığın spi flash 4kByte sector boyutunda ve
sadece sektor erişimine izin veriyor demek olur,
ki bana kalırsa kullandığın spi flash Byte address erişime bile izin veriyor olabilir
yani değil 512 nin katları
3, 5, 50 ,100 gibi adreslere bile erişilebiliyordur.

Bence SECTOR size olarak 512 yi bir dene.

Yinede sorun bu bile olsa Stack problemini çözemeyebilir.
Bir yerde recursive bir kod vardır belki,
veya stack için ayrılmış alana yanlışlıkla yazan bir kod parçası olabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

EMP_Otto

#25
Kullandığım SPI Flash  http://docs-asia.electrocomponents.com/webdocs/1385/0900766b81385d56.pdf
Sizinde belirtiğiniz gibi SD kartlarda sector size 512 Bytetır.
Flash 4 KB lık sectorlere sahip.Byte byte yazıp okuyabiliyorsunuz fakat silmek istediğinizde 4KB lık alanın tamamını silmeniz gekiyor.Durum böyle olunca dosya sistemine bu durumu  belirtmek gerekiyor.
Dosya sistemindeki terimler şu şekilde Byte->Sector-Cluster.Yani byteler bir araya gelip  Sectorleri ,Sectorler birleşip Clusterları oluşturuyor.
Flash hafızanın kötü yanı datayı yazmadan önce yazılacak alanı silmem lazım.Flasta 4KB lık alan silindiği için ve Dosya sistemi sector sector yazıp sector sector okuduğu için sector size=4 KB belirtiyorum.


mesaj birleştirme:: 08 Ocak 2016, 11:35:45

@RaMu
Hocam dediğiniz gibi SectorSize=512 yaptım.Flash 2MB oldugu için ,
diskio.c icerisindeki degerleri aşagıdaki gibi güncelledim.
GET_SECTOR_COUNT=4096    (2*1024*1024/512)   
GET_SECTOR_SIZE=512 (Byte)
GET_BLOCK_SIZE =1   Bir sector içerisinde 1 blok olsun.

Degerlerde bir yanlıslık var mı sizce?
Bu işler zordur,özveri ister...

RaMu

FATFs de bunlar tam olarak neye karşılık geliyordu net hatırlamıyorum.
GET_SECTOR_COUNT  * GET_SECTOR_SIZE  = kullandığımız hafıza kartının boyutu,

GET_BLOCK_SIZE ise okuma yazma yaparken kullanılan boyut olması lazım diye düşünüyorum.
1 defada kaç sector veya kaç byte okunacak gibi.
GET_BLOCK_SIZE için aklıma sd kartdaki set block lenght komutu geliyor,
buda sd karta okuma yazma erişimi için boyut belirliyordu.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

EMP_Otto

@RaMu
Hocam şimdi yukarıda belirtiğim şekilde parametreleri ayarlayarak dosya sistemini çalıştırıyorum ve dosya olusturabilirim.Fakat dosya içerisine birşey yazamıyorum.Dosyayı yaz degidiğimde FR_OK dönüyor fakat dosyaya birşey yazılmıyor.
Yazılmamasını sebebi ise şu sekilde  http://student.agh.edu.pl/~chamot/dokumentacja_FatFs/doc/en/write.html   linkte belirtildiği üzere *ByteWritten < ByteToWrite oldugu için yani dosya sistemi  diski dolu olarak gördüğü için dosyaya veri yazamıyorum.
Gelelim benim soruma disk nasıl olurda dolu görünür?
Herhangi bir fikri olan var mı acaba?
Bu işler zordur,özveri ister...

RaMu

BELKİ Spi Flash a tek seferde en az 4k veri yazmak zorunda olabilirsin.
Tek seferde 4096 byte yazmayı deneyebilirmisin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

EMP_Otto

Hocam 4096 byte olarak yazmak istediğimde FAtfs dosya sistemi 4096 bytelık buffer olusturuyor.Bu kadar büyük bufferda işlemciyi hard faultta düşürüyor malesef.Ayrıca spi flash tek seferde 256 byte  uzunlukta dosya yazmama izin veriyor.
Sorun dosya sistemi SECTOR_SIZE tanımında spi flash üzerinde tek seferde silinebilecek minimum alan olarak tanımlanıyor.Bendeki flashta tek seferde silinebilecek minimum alan 4kb fakat bu kadar uzunlukta bir buffer sistemin çökmesine neden oluyor.
İşin ilginc yanı istediğim kadar dosya oluşturabiliyorum suan.Fakat  dosyaya veri yazamıyorum.
Fİkri olan ?
Bu işler zordur,özveri ister...