27 Ocak 2020, 11:13:08

Haberler:

Picproje Facebook Sayfası:  https://bit.ly/2pUitll


STM32F750 SDRAM Erişimi

Başlatan yldzelektronik, 20 Temmuz 2019, 20:36:41

yldzelektronik

28 Ekim 2019, 22:46:00 #45 Son düzenlenme: 28 Ekim 2019, 23:44:49 yldzelektronik
Alıntı yapılan: OptimusPrime - 28 Ekim 2019, 20:29:54Bu arada map dosyasina bakiver senin frame buffer in disinda bu alani kullanan var mi diye. ::ok

Bunu yaptım. Aslında o alanı kullanan hiç kimse yok. Bu da ayrı bir soru işareti. Sanırım 0xC000 0000 adresine erişim sadece DMA2D üzerinden yapılıyor.

Edit:
Alıntı yapılan: mufitsozen - 28 Ekim 2019, 20:06:53Asagidaki linkdeki formu doldur, evaluation version indirme linkini yollasinlar.

evaluate PC-Lint Plus

Bunu da yaptım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

Sen bu ram testini yaparken ne flush cache diyorsun nede invalidate cache diyorsun. Emin misin bu datanin ram a yazildigindan? Ram bolgesi icin cache kapali mi?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

OptimusPrime

Veya sadece deneme amacli cache contoller a, 0xC000 0000 (sanirim frame buffer bu adreste ikamet ediyor  :) ) adresi dahil olmak uzere frame buffer boyunca cache islemi yapma de.

Veya programin en basinda cache controller i kapat gitsin. Bakalim ne degisecek.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

Alıntı yapılan: OptimusPrime - 29 Ekim 2019, 01:07:07Sen bu ram testini yaparken ne flush cache diyorsun nede invalidate cache diyorsun. Emin misin bu datanin ram a yazildigindan? Ram bolgesi icin cache kapali mi?

Hocam bu testi yaparken/bu olayı yaşarken durum şöyle;

  /* USER CODE BEGIN 2 */
	
MPU_Region_InitTypeDef MPU_InitStruct;

	
/* Configure unused area of QSPI region as strongly ordered.
	
 * This is *important* to avoid unintentional fetches from illegal
	
 * addresses due to cache/speculation which would halt the MCU.
	
 */
	
HAL_MPU_Disable();

	
/* Enable D-cache on SDRAM (Write-through) */
	
MPU_InitStruct.SubRegionDisable 0x00;
	
MPU_InitStruct.BaseAddress 
	
	
	
0xC0000000;
	
MPU_InitStruct.TypeExtField 
	
	
MPU_TEX_LEVEL0;
	
MPU_InitStruct.Enable 
	
	
	
	
	
MPU_REGION_ENABLE;
	
MPU_InitStruct.Number 
	
	
	
	
	
MPU_REGION_NUMBER0;
	
MPU_InitStruct.Size 
	
	
	
	
	
	
MPU_REGION_SIZE_16MB;
	
MPU_InitStruct.IsCacheable 
	
	
	
MPU_ACCESS_CACHEABLE;
	
MPU_InitStruct.AccessPermission MPU_REGION_FULL_ACCESS;
	
MPU_InitStruct.IsShareable 
	
	
	
MPU_ACCESS_NOT_SHAREABLE;
	
MPU_InitStruct.IsBufferable 
	
	
MPU_ACCESS_NOT_BUFFERABLE;
	
MPU_InitStruct.DisableExec 
	
	
	
MPU_INSTRUCTION_ACCESS_DISABLE;

	
HAL_MPU_ConfigRegion(&MPU_InitStruct);

	
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

	
SCB_InvalidateICache();

	
/* Enable branch prediction */
	
SCB->CCR |= (<< 18);
	
__DSB();

	
SCB_InvalidateICache();
	
SCB_EnableICache();

	
SCB_InvalidateDCache();
	
SCB_EnableDCache();

	
/* USER CODE END 2 */

/* Initialise the graphical hardware */
  
GRAPHICS_HW_Init();

  
/* Initialise the graphical stack engine */
  
GRAPHICS_Init();
      
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

Sdram icin cache acik gorunuyor. Disable edip tekrar dene derim. Disable ettiginde eger hala garip pixeller gorunuyorsa bu sekilde birde ram testi yap derim. Eger gorunmuyorsa DMA ile cache senkronizasyonunu bir yerlerde atliyorsun demektir. Bu teorim yanlis da olabilir. Fakat denemekte fayda var.  ::ok


Birde sistem nasil calisiyor (ozelliklede DMA olan kismi) bunu da anlativer  :) Kullanici seviyesinden frame buffera resim nasil tasiyorsun onu merak ediyorum.  ::)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

01 Kasım 2019, 21:47:14 #50 Son düzenlenme: 01 Kasım 2019, 21:49:02 yldzelektronik
Denediğim senaryolar şöyle;

Chache kapalı, mpu kapalı, temizlik yapmıyorum sorun var, yapıyorum sorun yok.
Chache açık, mpu kapalı, temizlik yapmıyorum sorun var, yapıyorum sorun yok.
Chache kapalı, mpu açık, temizlik yapmıyorum sorun var, yapıyorum sorun yok.
Chache açık, mpu açık, temizlik yapmıyorum sorun var, yapıyorum sorun yok.

RAM testi yaptığımda chache ve mpu kapalı.

DMA erişimi kısmı biraz kapalı. TouchGFX kendi hallediyor onu. Ama elle erişmek istersen, önce bir framebuffer alanı belirleyip, o alanı dma2d ye göstermen ve taşıma işlemini elle başlatmak zorundasın.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

Hicbir sey degismiyor kisaca :du:

Cache kapatilinca en azindan sistemde yavaslama olmali bunu gozlemleyebiliyor musun?

Su temizlikle ilgili kodu da eklersen bakalim.

Olmadi bi hocaya okutturacaz gibi duruyor :D
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yldzelektronik

02 Kasım 2019, 15:16:11 #52 Son düzenlenme: 02 Kasım 2019, 15:17:34 yldzelektronik
Alıntı yapılan: yldzelektronik - 27 Ekim 2019, 15:31:51Evet. Genelde benim işlerde bu tip şeyler bolca oluyor  ;D  ;D Aşağıdaki konudan bahsediyorsan;
Evet. Bu iş için bir test programı var ve buradan gerçekten sağ salim çıktı.

uint32_t memTestDataBus
(volatile uint32_t address)
{
    
uint32_t pattern;
	

    
/* Perform a walking 1's test at the given address. */
    
for (pattern 1pattern != 0pattern <<= 1)
    {
        
/* Write the test pattern. */
        
*address pattern;

        
/* Read it back (immediately is okay for this test). */
        
if (*address != pattern
        {
            return (
pattern);
        }
    }

    return (
0);

}
//


uint32_t *memTestAddressBus(volatile uint32_t baseAddressunsigned long nBytes)
{
    
unsigned long offset;
    
unsigned long testOffset;
    
unsigned long addressMask = (nBytes sizeof(datum) - 1);

    
datum pattern     = (uint32_t 0xAAAAAAAA;
    
datum antipattern = (uint32_t 0x55555555;


    
/* Write the default pattern at each of the power-of-two offsets. */
    
for (offset 1; (offset addressMask) != 0offset <<= 1)
    {
        
baseAddress[offset] = pattern;
    }

    
/* Check for address bits stuck high. */
    
testOffset 0;
    
baseAddress[testOffset] = antipattern;

    for (
offset 1; (offset addressMask) != 0offset <<= 1)
    {
        if (
baseAddress[offset] != pattern)
        {
            return ((
datum *) &baseAddress[offset]);
        }
    }

    
baseAddress[testOffset] = pattern;

    
/* Check for address bits stuck low or shorted. */
    
for (testOffset 1; (testOffset addressMask) != 0testOffset <<= 1)
    {
        
baseAddress[testOffset] = antipattern;

	
	
	
	
if (
baseAddress[0] != pattern)
	
	
	
	
{
	
	
	
	
	
return ((
datum *) &baseAddress[testOffset]);
	
	
	
	
}

        for (
offset 1; (offset addressMask) != 0offset <<= 1)
        {
            if ((
baseAddress[offset] != pattern) && (offset != testOffset))
            {
                return ((
datum *) &baseAddress[testOffset]);
            }
        }

        
baseAddress[testOffset] = pattern;
    }

    return (
NULL);

}
//

uint32_t *memTestDevice(volatile uint32_t baseAddressunsigned long nBytes)
	

{
    
unsigned long offset;
    
unsigned long nWords nBytes sizeof(datum);

    
uint32_t pattern;
    
uint32_t antipattern;


    
/* Fill memory with a known pattern. */
    
for (pattern 1offset 0offset nWordspattern++, offset++)
    {
        
baseAddress[offset] = pattern;
    }

    
/* Check each location and invert it for the second pass. */
    
for (pattern 1offset 0offset nWordspattern++, offset++)
    {
        if (
baseAddress[offset] != pattern)
        {
            return ((
uint32_t *) &baseAddress[offset]);
        }

        
antipattern = ~pattern;
        
baseAddress[offset] = antipattern;
    }

    
/* Check each location for the inverted pattern and zero it. */
    
for (pattern 1offset 0offset nWordspattern++, offset++)
    {
        
antipattern = ~pattern;
        if (
baseAddress[offset] != antipattern)
        {
            return ((
uint32_t *) &baseAddress[offset]);
        }
    }

    return (
NULL);

}
//

Diğer taraftan;
Ben öyle bir tanımlama yapmadım. Bu alan harici ramde. Yani derleyicinin oraya bir şey koyacağını pek zannetmiyorum. Nasıl diyeceğim derleyiciye karışma bu alana?

Konu SDRAM timing ile ilgili olabilir mi?

Test kodu burada.

Cinli minli işler hep beni bulur da, onların pek bu tür şeyleri sevdiğini sanmıyorum. Bu işin içinde bir bit yeniği var gibi. Ama hocaya da hayır demem hani :) :)

Ekleme: Yavaşlama derken? Zaten durağan bir ekran var. Performans takibi yapmadım açıkçası. Bence benim kodlarda bir yerde bir hata var. Ama şöyle tuhaf bir durum var. Bütün işi zaten TouchGFX yapıyor.

Galiba benim bootloader ile ilgili bir durum var.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

OptimusPrime

 :du:

Su temizlik yapiyorum soyle oluyor, yapmiyorum boyle oluyor dedigin kodlari sanirim acip kapatiyorsun. O kismi kopyalar misin? Gidisatta nasil bir degisiklik oluyor bide ona bakalim.

Sdram ve cache ile ilgili suphelerim vardi ama anlattiklarina gore bunlarda da sorun yok gibi.

Bu arada TouchGFX ne isler ceviriyor bilemiyorum. Hic kullanmadim. TouchGFX ile ekranda nesneleri olustururken nesneleri birbirine bagliyor musun? Veya gorunen nesneleri TouchGFX de nasil tanimliyorsun?
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||