STM32F750 SDRAM Erişimi

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

yldzelektronik

#45
Alıntı yapılan: OptimusPrime - 28 Ekim 2019, 17: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, 17: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 - 28 Ekim 2019, 22: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 |= (1 << 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

#50
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

#52
Alıntı yapılan: yldzelektronik - 27 Ekim 2019, 12: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 = 1; pattern != 0; pattern <<= 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 * baseAddress, unsigned 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) != 0; offset <<= 1)
    {
        baseAddress[offset] = pattern;
    }

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

    for (offset = 1; (offset & addressMask) != 0; offset <<= 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) != 0; testOffset <<= 1)
    {
        baseAddress[testOffset] = antipattern;

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

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

        baseAddress[testOffset] = pattern;
    }

    return (NULL);

}
//

uint32_t *memTestDevice(volatile uint32_t * baseAddress, unsigned 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 = 1, offset = 0; offset < nWords; pattern++, offset++)
    {
        baseAddress[offset] = pattern;
    }

    /* Check each location and invert it for the second pass. */
    for (pattern = 1, offset = 0; offset < nWords; pattern++, 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 = 1, offset = 0; offset < nWords; pattern++, 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 ||