اطلاعیه

Collapse
No announcement yet.

DMA controller

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    DMA controller

    سلام دوستان . من یه سری اطلاعات راجع به DMA یا direct memory access می خواستم . البته خودم یه اطلاعاتی به دست آوردم که اینجا می زارم ولی اگه کسی اطلاعاتی داره اصلاح یا تکمیلش کنه .
    DMA در واقع راه حلی برای دسترسی به حافظه و ذخیره ی اطلاعات بدون کمک و اشغال کردن CPU است . این سیستم بهینه سازی شده برای عملکرد بالا و real time بودن عملکرد هست. کنترلر DMA واسطه ایست که اطلاعاتو بین رجیسترهای جانبی و SRAM انتقال میده بدون نیاز به آدرس دهی بایت به بایت یا حتی صفحه به صفحه و بدون فشرده کردن پردازش های CPU. فرض کنید که می خواین یه Voice recorder بسازین و یا روی صدای ورودی عملیاتی انجام بدین یا افکتی بزارید . پس به سرعت بسیار بالا برای قرار دادن دیتا از ADC به RAM و انجام عملیاتی رو بایت به بایت به دست اومده از ADC دارید . DMA راه حلی است که برای انجام این نوع کارها در نظر گرفته شده . لازم به ذکره که این واحد سخت افزاریو dsPic ها , بیشتر PIC24 ها که 16 بیتی هستند و Xmega ها که 8 یا16 بیتی هستند به عنوان یه مزیت بسیار بزرگ تو خودشون دارن . برخی ادواتی که توسط DMA ساپورت میشن به شرح زیر هستند. :
    Ecan technology
    Data converter interface-DCI-
    analog to digital converter -ADC
    SPI
    UART
    input Capture
    Output Capture

    #2
    پاسخ : DMA controller

    من یه سری اطلاعات راجع به DMA یا direct memory access می خواستم
    ببخشید ... میخواستید یا دارید؟ دیگه چیزی برای گفتن نمونده!!!

    دیدگاه


      #3
      پاسخ : DMA controller

      اگر در مورد DMA بطور کلی سوال دارید که خود شما توضیحات خوبی را ارائه کردید(و البته جای سوال کلی در انجمن XMEGA نیست). اگر هم بطور خاص درباره DMA در XMEGA سوال دارید که اعلام کنید تا در مورد آن توضیحاتی داده شود.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : DMA controller

        با سلام و عرض ادب
        لطفا در صورت امکان نمونه کدهایی را جهت استفاده از قسمت DMA controller ، برای کامپایلرهای مختلف از جمله بیسکام ، در این تاپیک قرار دهید. سپاسگزارم

        دیدگاه


          #5
          پاسخ : DMA controller

          در سایت atmel نمونه کدهایی برای DMA وجود دارد:

          http://www.atmel.com/Images/AVR1304.zip

          برای بسکام در Help آن اشاره شده است:

          http://avrhelp.mcselec.com/index.html?config_dmachx.htm
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : DMA controller

            سلام

            من احتیاج دارم یکسری دیتا را از sram بوسیله dma با spi بیرون بفرستم. تو بسکام
            کسی میتونه راهنمایی کنه

            ممنون



            زندگی یه فرصته

            دیدگاه


              #7
              پاسخ : DMA controller

              کد:
              $regfile = "xm32a4def.dat"
              $crystal = 32000000                     '32MHz
              $hwstack = 64
              $swstack = 40
              $framesize = 40
              
              $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
              
              Config Osc = Enabled , 32mhzosc = Enabled
              Config Sysclock = 32mhz                   '--> 32MHz
              
              'Serial Interface to PC
              Config Com1 = 57600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
              Open "COM1:" For Binary As #1
              
              
              Print #1 , "UART C0 over DMA to SRAM"
              
              
              Config Eeprom = Mapped                   'when using EEPROM , add this config command
              
              Const Array_size = 8
              
              Dim Receive_array(array_size) As Byte
              Dim Dma_ready As Bit
              Dim Dma_channel_0_error As Bit
              Dim X As Byte
              
              ' DMA Interrupt
               On Dma_ch0 Dma_ch0_int
              'Interrupt will be enabled with Tci = XX in Config DMAX
              
               Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch0rr123    ' enable DMA,
              
              'you can configure 4 DMA channels
              Config Dmach0 = Enabled , Burstlen = 1 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , _
               Sar = Burst , Sam = Fixed , Dar = Transaction , Dam = Inc , Trigger = &H4B , Btc = Array_size , Repeat = 0 , Sadr = Varptr(usartc0_data) , Dadr = Varptr(receive_array(1))
              
              
              'Trigger Base Value = &H4B + Receive complete (RXC) &H00 --> &H4B
              'Note that unlimited repeat count can be achieved by enabling repeat mode and setting the repeat count to zero (Chanrpt = Enabled   and  Repeat = 0)
              
              ' Destination Address of Array will be reloaded after each Transaction (Dar = transaction)
              
              
              Enable Interrupts
              Config Priority = Static , Vector = Application , Lo = Enabled
              
              
              '-------------------------[Main Loop]-------------------------------------------
               Do
              
               If Dma_ready = 1 Then
                 Reset Dma_ready
              
                 Print #1 , "---------"
                ' Do something with the data here.....
              
                ' like Print Results back to COM1
                 For X = 1 To Array_size
                   Print #1 , Chr(receive_array(x))
                 Next
               End If
              
              
               Loop
              '-------------------------------------------------------------------------------
              
              
              End                             'end program
              
              '-------------------------[Interrupt Service Routines]--------------------------
              
               ' Dma_ch0_int is for DMA Channel ERROR Interrupt A N D for TRANSACTION COMPLETE Interrupt
               ' Which Interrupt fired must be checked in Interrupt Service Routine
               Dma_ch0_int:
              
                If Dma_intflags.0 = 1 Then               'Channel 0 Transaction Interrupt Flag
                  Set Dma_intflags.0                  'Clear the Channel 0 Transaction Complete flag
                  Set Dma_ready
                End If
              
                If Dma_intflags.4 = 1 Then               'Channel 0 ERROR Flag
                  Set Dma_intflags.4                  'Clear the flag
                  Set Dma_channel_0_error               'Channel 0 Error
                End If
              
               Return
              برای اینکه
              یکسری دیتا را از SPI دریافت کنم و در SRAM دخیره کنم
              باید در این برنامه بجای
              Sadr = Varptr(usartc0_data) , Dadr = Varptr(receive_array(1))

              بنویسم
              Sadr = Varptr(SPIC_data) , Dadr = Varptr(receive_array(1))

              آیا همین تغییر کافیه
              زندگی یه فرصته

              دیدگاه


                #8
                پاسخ : DMA controller

                در مورد ارسال اطلاعات از طریق spi بوسیله dma، باید از usart در مد master spi استفاده کنید. زیرا dma از spi فقط در مد slave پشتیبانی می کند. در مورد سوال اخیر هم پاسخ منفی است. زیرا در کد مربوطه initialization متناظر با ارتباط spi انجام نشده است.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  #9
                  پاسخ : DMA controller

                  منم یه شوال برام پیش اومد در مورد DMA
                  با یه مثال میگم . مشکلم درک مفهومی عمل DMA هستش
                  اگر قرار باشه یه بافر مثلا 100 تایی از طریق پورت سریال به بیرون فرستاده بشه . تو حالت عادی بدون DMA روش اینطوری هست
                  1- خواندن یک بایت 2- ارسال بایت
                  و در تمام طول مدت این عملیات CPU درگیر هست . اما در مورد DMA نمیدونم دقیقا چطوری هست !!
                  مثلا اینطوری هست ؟ CONFIG DMA و فعال کردن اون ؟؟؟؟؟
                  هميشه به ياد خدا باش !

                  دیدگاه


                    #10
                    پاسخ : DMA controller

                    سلام
                    مثلا وقتی شما یه ارایه ای به طور معمولی با spi بفرستی بیرون سی پی یو کلا زیر باره
                    ولی با دی ام ا فقط 2 درصد زیر بار میره

                    یه ج.ر پردازش موازی می شه بهش گفت
                    زندگی یه فرصته

                    دیدگاه


                      #11
                      پاسخ : DMA controller

                      اینجا بحث بحث DMA هست، میخواستم اطلاعاتی که در رابطه با DMA دارم را براتون بگم: (البته اطلاعاتم بیشتر در رابطه با DMA در پردازنده های intel و کلا پردازنده های مربوط به کامپیوتر های دسکتاپ است)

                      خوب اول باید بگم DMA مخفف Direct Memory Access است که به معنی دسترسی مستقیم حافظه میباشد.

                      من با یک مثال کاربردش رو براتون توضیح میدم : به عنوان مثال ما میخواهیم 100 بایت اطلاعات را از طریق پورت سریال ( مثلا اینجا پروتوکل های spi یا usart )، از حافظه موقت( که در اینجا یک sram است ) به یک دستگاه i/o منتقل کنیم.(فرستادن اطلاعات به خارج میکرو)
                      3 روش برای اینکار وجود دارد:

                      روش اول ) روش پولینک نرم افزاری و busy waiting روی فلگ کنترل سریال (فلگی که میگه ارسال تمام شده یا نشده):
                      برای اینکار باید دونه دونه بایتها را به اینترفیس سریال تحویل بدیم و به صورت نرم افزاری چک کنیم که انتقال تمام شده یا نه و وقتی بایت اول فرستاده شد ، بایت دوم را تحویل میدیم و دوباره صبر میکنیم( busy waiting ) و ...
                      خوب میبینم که کلا cpu درگیر اینه که انتقال صورت بگیره و همچنین دونه دونه بایت ها را خودش به اینترفیس سریال میده. پس کار دیگه ای در این بین نمیکنه.
                      این بد ترین نوع انتقال است (مثالش تو avr ، استفاده از تابع spi میباشد.)
                      -------------------------------------------------------------------------------------------------
                      روش دوم ) روش انتقال بوسیله ی دریافت وقفه ( interrupt ) از سوی اینترفیس سریال :
                      تفاوتش با روش قبل اینه که دیگه cpu درگیر چک کردن فلگ انتقال و busy waiting روی این فلگ نمیشه. و بایت را تحویل اینترفیس سریال میده و دیگه به کار دیگه ای می پردازه . بعد از اتمام عمل انتقال اینترفیس سریال با دادن وقفه به cpu ،از اتمام انتقال خبر میده که بعد از اون بوسیله ایجاد انتقال مجدد در ISR وقفه مربوطه ، cpu انتقال بایت بعدی را دستور میده و ....
                      پس این روش خیلی بهتر از روش قبل است چون cpu میتونه در حین عمل انتقال کار دیگه ای کنه.
                      در avr اصولا از این روش استفاده میشه چون بهینه تر از روش قبل است. مثال هاش تو وبلاگ زیر وجود داره:
                      mortazavi91.mihanblog.com
                      --------------------------------------------------------------------------------------------------
                      روش سوم) روش انتقال بوسیله ی DMA و دریافت وقفه از DMA :
                      خوب دیدیم که در روش دوم مشکل روش اول که ایجاد busy waiting بود ، رفع شد. ولی باز هم برای انتقال 100 بایت اطلاعات به خارج ، cpu باز هم درگیره اینه که بایت به بایت اطلاعات را بفرسته و در عمل 100 بار باید دستور انتقال را بده.
                      در روش سوم که استفاده از DMA است برای انتقال اطلاعات به صورت عمده ای ( یه حداکثری داره که DMA مشخص میکنه) ، cpu آدرس محلی از sram که اطلاعاتی که میخواهیم بفرستیم در اونجا قرار داره + تعداد بایتها(اینجا 100 تا) را به DMA میده و همچنین اجازه کنترل باس آدرس رو نیز به DMA میده و بعد از اون دیگه CPU کاری نداره و DMA وظیفه انتقال را به عهده میگیره. بعد از اتمام انتقال (کل بایتها) DMA یک وقفه به CPU میده و میگه من کارم را بدرستی انجام دادم یا نه(بچه خوبیه همیشه راستش رو میگه :icon_razz: )
                      که این قابلیت تو avr وجود نداره .







                      راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                      کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                      نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                      دیدگاه


                        #12
                        پاسخ : DMA controller

                        سلام
                        ببخشید من میخواستم adc رو که توی مد freerunning هست رو توسط DMA بخونم . مثلا هر وقط خواستم تو برنامه DMA فعال بشه و شروع کنه به خوندن و هر 20 الی 30 میکروثانیه یه بار برم مقدار داخل SRAM رو که توسط DMA ریخته شده رو ازش استفاده کنم . میخام از چهار تا کانال DMA استفاده کنم برای خودن مقدار چهار ت کانال ADC به صورت همزمان .
                        چه طور میتونم این کار رو انجام بدم ؟ کسی کتابخونه ای در این زمینه داره؟
                        يا حق

                        دیدگاه


                          #13
                          پاسخ : DMA controller

                          در برنامه می توانید انتهای تبدیل ADC را به عنوان منبع تریگر کانال متناظر در DMA تعریف کنید و آدرس مبدا انتقال را آدرس بایت پائین رجیستر نتیجه ADC و طول Burst را دو بایت انتخاب کنید. جهت آدرس مبدا باید افزایشی و در مد Reload after Burst باشد. آدرس مقصد هم می تواند ابتدای آرایه ای در SRAM و به طول مشخص انتخاب شود. بر اساس طول آرایه هم طول Block تعیین می شود. موارد دیگر هم بستگی به جزئیات بیشتر صورت مسئله دارد که چون سوال بصورت کلی مطرح شده در همین حد توضیح داده شد. از نظر کتابخانه می توانید از DMA_driver.c استفاده کنید که لینک آن در پست شماره 4 قرار داده شده است.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #14
                            پاسخ : DMA controller

                            با سلام
                            تصمیم دارم با استفاده از بسکام و استفاده از قابلیت dma اعداد ورودی از usartd1 را روی dacb0 بزارم
                            راهنمای بسکام رو خوندم و بر اساس اون کد زیر رو نوشتم
                            اما هیچ عملی انجام نشد
                            لطفا راهنمایی بفرمایید
                            سپاسگذارم
                            کد:
                            $regfile= "xm128a4udef.dat".
                            $crystal= 14745600
                            $hwstack = 256
                            $swstack = 256
                            $framesize = 512
                            
                            $lib "xmega.lib"
                            $external _xmegafix_clear
                            $external _xmegafix_rol_r1014
                            
                            config DACb = enabled ,Io0 = Enabled ,Io1 = Enabled , Channel =dual , Reference = AVCC , Interval = 1 , Refresh = 16
                            
                            Config Com4 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
                            Open "COM4:" For Binary As #4
                            
                            Do
                            Loop Until Osc_status.3 = 1
                            Set Osc_ctrl.4
                            
                            Config Sysclock = pll , Prescalea = 1 , Prescalebc = 1_1
                            
                            Config Priority = Static , Vector = Application , Lo = Enabled    'Interrupts
                            
                            On Dma_ch0 Dma_ch0_int
                            
                            config DMA=enabled , DOUBLEBUF = disabled ,Cpm = Ch0rr123
                            
                            config dmach0=enabled , burstlen = 8 , CHANRPT=disabled , tci = lo , eil = off , Singleshot = Enabled , Sar = Transaction , _
                             Sam = FIXED , Dar = Transaction , Dam = Fixed , trigger = &h6e , btc = 14 , repeat = 0 ,sadr=Varptr(usartd1_data) , dadr =Varptr(dacb_ch0data)
                            
                            do
                            
                            loop
                            
                            Dma_ch0_int:
                            If Dma_intflags.0 = 1 Then
                              Set Dma_intflags.0
                            
                            End If
                            
                            return

                            دیدگاه


                              #15
                              پاسخ : DMA controller

                              با بررسی که انجام دادم وقفه dma انجام میشه اما
                              وقفه با یک کردنش به حالت 0 برگشته اما با انجام تکرار عملیات هیچ عملیاتی از روتین وقفه دیده نمیشود.
                              دوم اینکه مقدار ورودی روی dacقرار نمیگیرد :angry:

                              دیدگاه

                              لطفا صبر کنید...
                              X