نويسنده موضوع: DMA controller  (دفعات بازديد: 2992 بار)

0 کاربر و 1 مهمان درحال ديدن موضوع.

آفلاين parsa2

  • کاربر ساده سطح سوم
  • *
  • تشکر
  • -اهدايي: 28
  • -دريافتي: 19
  • ارسال: 154
DMA controller
« : 23 آبان 1389 - 17:37:33 »
سلام  دوستان . من یه سری اطلاعات راجع به 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

آفلاين رضا آقازاده

  • همکار افتخاری
  • *
  • تشکر
  • -اهدايي: 87
  • -دريافتي: 1777
  • ارسال: 1893
پاسخ : DMA controller
« پاسخ #1 : 23 آبان 1389 - 17:56:56 »
نقل قول
من یه سری اطلاعات راجع به DMA یا direct memory access می خواستم

ببخشید ... میخواستید یا دارید؟ دیگه چیزی برای گفتن نمونده!!!

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1244
  • -دريافتي: 9063
  • ارسال: 2896
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : DMA controller
« پاسخ #2 : 23 آبان 1389 - 22:48:53 »
اگر در مورد DMA بطور کلی سوال دارید که خود شما توضیحات خوبی را ارائه کردید(و البته جای سوال کلی در انجمن XMEGA نیست). اگر هم بطور خاص درباره DMA در XMEGA سوال دارید که اعلام کنید تا در مورد آن توضیحاتی داده شود.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک (و بسیاری موضوعات دیگر)، باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين mehrdadkey2

  • کاربر تازه وارد سطح سوم
  • *
  • تشکر
  • -اهدايي: 23
  • -دريافتي: 4
  • ارسال: 26
پاسخ : DMA controller
« پاسخ #3 : 31 ارديبهشت 1391 - 11:59:49 »
با سلام و عرض ادب
لطفا در صورت امکان نمونه کدهايي را جهت استفاده از قسمت DMA controller ، براي کامپايلرهاي مختلف از جمله بيسکام ، در اين تاپيک قرار دهيد. سپاسگزارم

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1244
  • -دريافتي: 9063
  • ارسال: 2896
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : DMA controller
« پاسخ #4 : 3 خرداد 1391 - 00:18:28 »
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک (و بسیاری موضوعات دیگر)، باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين علیرضا خلیلی

  • کاربر کامل سطح دوم
  • *
  • تشکر
  • -اهدايي: 308
  • -دريافتي: 192
  • ارسال: 359
    • میکروجات
پاسخ : DMA controller
« پاسخ #5 : 1 فروردين 1392 - 21:13:13 »
سلام

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

ممنون



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

آفلاين علیرضا خلیلی

  • کاربر کامل سطح دوم
  • *
  • تشکر
  • -اهدايي: 308
  • -دريافتي: 192
  • ارسال: 359
    • میکروجات
پاسخ : DMA controller
« پاسخ #6 : 2 فروردين 1392 - 01:21:04 »
$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))

آیا همین تغییر کافیه
« آخرين ويرايش: 2 فروردين 1392 - 01:25:12 توسط علیرضا خلیلی »
زندگی یه فرصته

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1244
  • -دريافتي: 9063
  • ارسال: 2896
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : DMA controller
« پاسخ #7 : 3 فروردين 1392 - 16:12:22 »
در مورد ارسال اطلاعات از طریق spi بوسیله dma، باید از usart در مد master spi استفاده کنید. زیرا dma از spi فقط در مد slave پشتیبانی می کند. در مورد سوال اخیر هم پاسخ منفی است. زیرا در کد مربوطه initialization متناظر با ارتباط spi انجام نشده است.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک (و بسیاری موضوعات دیگر)، باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين DDR3

  • کاربر نیمه حرفه ای سطح اول
  • *
  • تشکر
  • -اهدايي: 70
  • -دريافتي: 428
  • ارسال: 614
  • زندگي زيباست
    • لیسانس برق قدرت
    • دستگاه ثبت اطلاعات مکانيزه
پاسخ : DMA controller
« پاسخ #8 : 4 فروردين 1392 - 23:28:14 »
منم يه شوال برام پيش اومد در مورد DMA
با يه مثال ميگم . مشکلم درک مفهومي عمل DMA هستش
اگر قرار باشه يه بافر مثلا 100 تايي از طريق پورت سريال به بيرون فرستاده بشه . تو حالت عادي بدون DMA روش اينطوري هست
1- خواندن يک بايت 2- ارسال بايت
و در تمام طول مدت اين عمليات CPU درگير هست . اما در مورد DMA نميدونم دقيقا چطوري هست !!
مثلا اينطوري هست ؟ CONFIG DMA و فعال کردن اون ؟؟؟؟؟
هميشه به ياد خدا باش !

آفلاين علیرضا خلیلی

  • کاربر کامل سطح دوم
  • *
  • تشکر
  • -اهدايي: 308
  • -دريافتي: 192
  • ارسال: 359
    • میکروجات
پاسخ : DMA controller
« پاسخ #9 : 4 فروردين 1392 - 23:43:16 »
سلام
مثلا وقتی شما یه ارایه ای به طور معمولی با spi بفرستی بیرون سی پی یو کلا زیر باره
ولی با دی ام ا فقط 2 درصد زیر بار میره

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

آفلاين RubeuS

  • کاربر فعال
  • *
  • تشکر
  • -اهدايي: 294
  • -دريافتي: 1166
  • ارسال: 724
    • xxX_سيدحسن مرتضوي_Xxx کامپيوتر نرم افزار
پاسخ : DMA controller
« پاسخ #10 : 7 مرداد 1392 - 14:30:18 »
اينجا بحث بحث 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 (ارتباط بيسيم بين دو ميکرو) : کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود
کوچ کردن از کدويژن به  کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود : AtmelStudio
نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود
کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
انشالله به زودي تاپيک ها به روز رساني خواهد شد،

آفلاين عليـــــــــــــــــــرضا

  • کاربر تازه وارد سطح پنجم
  • *
  • تشکر
  • -اهدايي: 83
  • -دريافتي: 17
  • ارسال: 41
    • کارشناسي ارشد مکاترونيک
پاسخ : DMA controller
« پاسخ #11 : 19 شهريور 1392 - 11:44:40 »
سلام
ببخشيد من ميخواستم adc رو که توي مد freerunning هست رو توسط DMA بخونم . مثلا هر وقط خواستم تو برنامه DMA  فعال بشه و شروع کنه به خوندن و هر 20 الي 30 ميکروثانيه يه بار برم مقدار داخل SRAM رو که توسط DMA ريخته شده رو ازش استفاده کنم . ميخام از چهار تا کانال DMA استفاده کنم براي خودن مقدار چهار ت کانال ADC به صورت همزمان .
چه طور ميتونم اين کار رو انجام بدم ؟ کسي کتابخونه اي در اين زمينه داره؟
يا حق

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1244
  • -دريافتي: 9063
  • ارسال: 2896
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : DMA controller
« پاسخ #12 : 20 شهريور 1392 - 08:28:26 »
در برنامه می توانید انتهای تبدیل ADC را به عنوان منبع تریگر کانال متناظر در DMA تعریف کنید و آدرس مبدا انتقال را آدرس بایت پائین رجیستر نتیجه ADC و طول Burst را دو بایت انتخاب کنید. جهت آدرس مبدا باید افزایشی و در مد Reload after Burst باشد. آدرس مقصد هم می تواند ابتدای آرایه ای در SRAM و به طول مشخص انتخاب شود. بر اساس طول آرایه هم طول Block تعیین می شود. موارد دیگر هم بستگی به جزئیات بیشتر صورت مسئله دارد که چون سوال بصورت کلی مطرح شده در همین حد توضیح داده شد. از نظر کتابخانه می توانید از DMA_driver.c استفاده کنید که لینک آن در پست شماره 4 قرار داده شده است.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک (و بسیاری موضوعات دیگر)، باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید