اطلاعیه

Collapse
No announcement yet.

راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

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

    راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

    سلام

    من قصد دارم تا با بهره گیری از بورد SAM7X-EX256 پروتکل UDP رو پیاده سازی کنم. حالا این که چرا بین TCP و UDP پروتکل UDP رو برای راه اندازی انتخاب کردم دلایل مختلفی داره. یکی از آن ها سادگی در راه اندازی این پورتکل هست. یکی دیگه از دلایلی که قصد دارم تا پروتکل UDP را راه اندازی کنم عدم وجود مثال ساده و مناسب برای آن است. برای TCP پروژه easyweb هست که فکر می کنم هم مفید باشه و هم مکفی.
    از دوستانی هم که علاقه دارند تا این پروتکل را راه بیاندازیم دعوت می کنم که مطالب خودشون رو ارائه بدهند. من در قدم اول یه listener با استفاده از #C نوشتم که برای تست برنامه هایی که روی میکرو می نویسیم کمکمون کنه.

    آدمی از عالم خاکی نمی آید بدست

    عالمی دیگر بباید ساخت و از نو آدمی
    پردازش تصویر با FPGA از صفر تا انتها
    http://www.eca.ir/forum2/index.php?topic=74299.0

    #2
    پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

    در شکل زیر اجزای یک پکت UDP را مشاهده می کنید.

    http://www.4shared.com/photo/rcpcDdKR/UDP_Datagram2.html

    در شکل فوق
    Source Port: Identifies the sending port when meaningful and should be assumed to be the port to reply to if needed. if not used then it should be zero
    Destination Port: Field identifies the destination port and is required.
    Length: the length of the entire datagram: header and data. the min length is 8 bytes since that's the length of the header
    Checksum: the checksum field is used for error checking of the header and data
    آدمی از عالم خاکی نمی آید بدست

    عالمی دیگر بباید ساخت و از نو آدمی
    پردازش تصویر با FPGA از صفر تا انتها
    http://www.eca.ir/forum2/index.php?topic=74299.0

    دیدگاه


      #3
      پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

      برای این که بتونیم سریع تر این پروتکل را راه اندازی کنیم و بعد از اطمینان از اجرای موفقیت آمیز کدهامون به بررسی خط به خط کدها بپردازیم، بهتره از کدهای آماده الهام بگیریم. حالا نمی دونم پیشنهادی رو که می دم چقدر عملی باشه ولی امتجانش ضرری نداره. برای راه اندازی اولیه لایه های فیزیکی و تراشه مورد استفاده پیشنهاد می کنم از کدهای پروژه easyweb استفاده کنیم سپس کدهای مربوط به پکت UDP رو بهش اضافه کنیم و یه داده ساده به PC ارسال کنیم. بعدش می تونیم براش بعدا CRC تعریف کنیم و از اون به بعد دیگه روند کار مشخصه. سختیش همین راه اندازی اولیه اش هست. :icon_razz:
      آدمی از عالم خاکی نمی آید بدست

      عالمی دیگر بباید ساخت و از نو آدمی
      پردازش تصویر با FPGA از صفر تا انتها
      http://www.eca.ir/forum2/index.php?topic=74299.0

      دیدگاه


        #4
        پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

        این مثال در داخل سایت توسط دوستان بررسی شده. تاپیک های ایجاد شده از نظر تئوری شاید برای من که کمتر نسبت به مبانی شبکه تسلط دارم قدری سنگین باشه. برای همین سعی می کنم به زبان ساده هر آن چه که از بررسی مثال easyweb می یابم توضیح بدهم و در نهایت سعی کنیم تا پروتکل UDP را بر روی ARM پیاده سازی کنیم.
        نخستین تابعی که در main فراخوانی می شود تابع TCPLowLevelInit است. یه سری تنظیمات اولیه در داخل این تابع انجام می شود. مثل راه اندازی تایمر، راه اندازی وقفه، تنظیم مبدل آنالوگ به دیجیتال. در پروتکل TCP چهار نوع تایمر می توان تعریف کرد که یکی از آن ها Retransmission نام دارد.
        آدمی از عالم خاکی نمی آید بدست

        عالمی دیگر بباید ساخت و از نو آدمی
        پردازش تصویر با FPGA از صفر تا انتها
        http://www.eca.ir/forum2/index.php?topic=74299.0

        دیدگاه


          #5
          پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

          دلیل راه اندازی برخی از امکانات میکروکنترلر در تابع TCPLowLevelInit مشخص است. به عنوان مثال راه اندازی بخش مبدل آنالوگ به دیجیتال. ولی وجود تایمر و برخی بردارهای وقفه شاید قدری احتیاج به بررسی داشته باشد. ابتدا تایمر را بررسی می کنیم. هر موقع نیاز شد به بررسی بردارهای وقفه هم می پردازیم.
          یکی از تایمرهای TCP عبارت است از Retransmission. در کل چهار نوع تایمر در پروتکل TCP وجود دارد. پس از برقراری یک ارتباط وقتی فرستنده بسته ای برای پردازش به مقصد ارسال می کند ضمن نگهداری موقت آن در یک بافر برای آن یک زمان سنج را تنظیم و فعال می کند. پس هرجا در بررسی کدها به بافر رسیدیم این نکته در ذهنمان باشد که ممکن است منظور همین بافر باشد.
          خلاصه بسته ای در ابتدا ارسال می شود اگر در مهلت مقرر پیام تایید آن دریافت نشد آن بسته دوباره ارسال می شود. این زمان سنج در ابتدا یک مقدار پیش فرض دارد. در این جا مقدار آن 262 میلی ثانیه در نظر گرفته شده است. پس ابتدا یک بسته ارسال می شود تایمر از مقدار پیش فرض شروع به شمارش معکوس می کند هرگاه مقدار آن به صفر رسید و پیام تاییدی دریافت نشد دوباره بسته مذکور ارسال می شود و مراحل دوباره تکرار می شود. عملکرد این زمان سنج بسیار ساده است. اما نکته مهم در مورد آن مقدار پیش فرض زمان سنج است. این زمان برای شبکه های محلی سریع، بسیار کوتاه و برای شبکه های طولانی در حد چند ثانیه است. بنابراین اگر زمان سنج مقدار پیش فرض کوتاهی داشته باشد برای انتقالات فواصل دور قبل از آن که بسته به مقصد برسد و تایید ارسل شده آن به مبدا برسد به دلیل انقضای زمان سننج بسته دوباره ارسال می شود که این موضوع باعث می شود تا در شبکه های محلی و سرع هنگام بروز یک خطا تاخیر زیادی به وجود آید. بهترین راه حل تنظیم زمان سنج به صورت پویا با استفاده از روش های تطبیقی و پویا می باشد چرا که بازده TCP به شدت به آن وابسته است.
          آدمی از عالم خاکی نمی آید بدست

          عالمی دیگر بباید ساخت و از نو آدمی
          پردازش تصویر با FPGA از صفر تا انتها
          http://www.eca.ir/forum2/index.php?topic=74299.0

          دیدگاه


            #6
            پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

            درباره این مورد و موارد مشابه در سلسله پست های آقای حسینی خیلی بحث شده. ضمنا فکر میکنم پروتکل UDP در سورس های easyweb هم موجود هست. منتهی در سورس اصلی استفاده نشده.

            دیدگاه


              #7
              پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

              نوشته اصلی توسط رضا آقازاده
              درباره این مورد و موارد مشابه در سلسله پست های آقای حسینی خیلی بحث شده. ضمنا فکر میکنم پروتکل UDP در سورس های easyweb هم موجود هست. منتهی در سورس اصلی استفاده نشده.
              ممنون از اطلاع رسانی. سورسی که در آن از پروتکل UDP استفاده شده است را از کجا می شه پیدا کرد؟ آیا داده ای رو از طریق UDP به Application خاصی در ویندوز ارسال می کند یا فقط کدهاش موجوده و عملی نشده؟

              پیروز و سربلند باشید
              آدمی از عالم خاکی نمی آید بدست

              عالمی دیگر بباید ساخت و از نو آدمی
              پردازش تصویر با FPGA از صفر تا انتها
              http://www.eca.ir/forum2/index.php?topic=74299.0

              دیدگاه


                #8
                پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

                protocol UDP یک الگوریتم برای انتقال دیتا هستش و این پروتوکل توی sam7x256 که وجود سخت افزاری نداره ! و باید نرم افزاری باهاش کار کرد.
                ولی عملا UDP برای جاهایی استفاده میشه که عدم وجود یک یا چند بیت در یک رشته فرضا 32 بیتی , عملا برای decode کردن مشکلی پیش نیاره
                فرض بگیرین یک تصویر میخایم بفریتیم 640p*480p اگر از این همه پیکسلی که داریم(307200 عدد ) در حد چند تا بیت و شاید هم بیشتر هم وجود نداشته باشه مشکلی در مشاهده تصویر بوجود نمیاره
                چون که تعداد متغییر ها خیلی زیاده
                عملا UDP بیشتر برای انتقال تصاویر (در دوربین های مدار بسته یا IP camera) استفاده میشه
                راستی پیاده کردن UDP زیاد هم آسون نیست ! برای این که اینو بفهمین این جا رو ببینین :
                http://en.wikipedia.org/wiki/User_Datagram_Protocol

                دیدگاه


                  #9
                  پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

                  متاسفانه من اشتباه کردم. پروتکل UDP در مثال EasyWeb پیاده سازی نشده. میتونین این مطلب رو در تابع ProcessEthIAFrame ببینید. اما بر خلاف گفته دوستمون پیاده سازی این پروتکل کار سختی نیست. البته برای شرایط خاص. و اونهم اینه که checksum حساب نکنین و در فیلد مربوطه عدد صفر بذارین. ولی موقعی که فریم IP اخذ میشه و در تابع فوق الذکر ProcessEthIAFrame بایستی ابتدای فریم 8 بایتی رو جدا کنین و با استفاده از فیلد Length دیتا رو بردارین. در هنگام ارسال هم کافیه لایه MAC و لایه IP و هدر UDP رو بسازین و در انتها داده رو قرار بدین. سپس با استفاده از تابع RequestSend حجم کل فریم رو مشخص کنین و توسط توابع مربوطه اقدام به ارسال اطلاعات به لایه MAC کنین. مثلا: CopyToFrame_EMAC.
                  فقط باید توجه کنین که غیر از قسمت داده های خام برنامه که در انتهای فریم UDP قرار میگیره؛ تمامی داده های 2 و چهار بایتی باید بفرم Little Endian قرار داده بشه. من ARM های اتمل رو نمیشناسم. اما از اونجایی که آرم های فیلیپس از حالت BigEndian استفاده میکنن میشه حدس زد که باید تمامی فیلد های 2 و چهار بایتی شما در فریم های MAC و IP و UDP بایستی با استفاده از swap بایت هاش عکس و سپس ارسال بشه.

                  دیدگاه


                    #10
                    پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

                    خیلی ممنون توضیحاتون خیلی راه گشا و مفید بود.

                    دو تا از مهمترین تابع هایی که در این نمونه کد وجود داره ProcessEthIAFrame و ReadFrameBE_EMAC است. با استفاده از تابع ReadFrameBE_EMAC داده هایی را که از پورت شبکه وارد می شود می توان دریافت کرد. هر بار که فراخوانی شود داده جدید را گرفته و مقدار آن را بر می گرداند. فعلا محتوی تابع را فرصت نکردم بررسی کنم. در حال می خواهم سعی کنم از همین تابع برای پیاده سازی پروتکل UDP استفاده کنم. تا بعد که دوباره بر گردم و کدهای داخل تابع مذکور را مطالعه کنم.
                    بخشی از تابع ProcessEthIAFrame را در ادامه ملاحظه می کنید.
                    if (!memcmp(&MyIP, &TargetIP, 4)) // is it for us?
                    switch (ProtocolType) {
                    case PROT_ICMP : { ProcessICMPFrame(); break; }
                    case PROT_TCP : { ProcessTCPFrame(); break; }
                    case PROT_UDP : break; // not implemented!
                    }
                    در نمونه کد بالا مشاهده می کنید که بخشی برای تشخیص نوع پروتکل مشخص شده است. متغیر ProtocolType یکی از آن متغیرهایی است که توسط تابع ReadFrameBE_EMAC مقدار دهی می شود. همان طور که مشاهده می کنید بخش مربوط به پروتکل UDP خالی مانده. یعنی تا قبل از فراخوانی این تابع همه چیز به نظر می رسه که برای راه اندازی دو تا پروتکل یکسان هست. پیشنهاد من اینه که فعلا داده ای از سمت کامپیوتر بفرستم به آرم ببینم چیزی می تونم دریافت کنم بعدش روی قالب بندی آن کار می کنم.
                    آدمی از عالم خاکی نمی آید بدست

                    عالمی دیگر بباید ساخت و از نو آدمی
                    پردازش تصویر با FPGA از صفر تا انتها
                    http://www.eca.ir/forum2/index.php?topic=74299.0

                    دیدگاه


                      #11
                      پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

                      بالاخره موفق شدم یه مثال ساده از UDP روی آرم پیاده سازی کنم. برنامه اش خیلی ساده تر از این بود که فکر می کردم. فقط کافیه تا با استفاده از تابع ReadFrameBE_EMAC داده هایی را که به پورت شبکه وارد می شود را بخوانید. البته یه نکته ای وجود داره که باید به آن دقت کنید. قبل از این که فریم UDP که شامل آی پی مبدا و مقصدا، طول، CheckSum و داده ارسال شود، مقادیری که مشخص کننده نوع پروتکل و IPV.4 یا IPV.6 و غیره است ارسال می شود. مشخصات دقیق این فریم رو می تونید به سادگی با شنود پورت شبکه بدست بیارید. در کل قبل از ارسال یک بایت داده به پورت شبکه، 42 بایت ارسال می شود که بخشی از آن مختص UDP است.
                      در ضمن تابع ReadFrameBE_EMAC شانزده بیتی است.
                      تا این جا دریافت از طریق پورت شبکه راه اندازی شده. بعدش می خواهم روی ارسال داده از میکرو به کامپیوتر کار کنم.

                      پیروز و سربلند باشید
                      آدمی از عالم خاکی نمی آید بدست

                      عالمی دیگر بباید ساخت و از نو آدمی
                      پردازش تصویر با FPGA از صفر تا انتها
                      http://www.eca.ir/forum2/index.php?topic=74299.0

                      دیدگاه


                        #12
                        پاسخ : راه اندازی پروتکل UDP در میکروکنترلر AT91SAM7X256

                        توابعی مختلفی برای ارسال در داخل این مثال استفاده شده که هر کدوم باید در جای خودش استفاده شود. به عنوان مثال
                        WriteFrame_EMAC
                        CopyToFrame_EMAC
                        write_PHY

                        که هر کدوم رو به تفکیک و با جزییات دارم بررسی می کنم.
                        به نظر می رسه ارسال داده از آرم به کامپیوتر کار مشکل تری باشه نسبت به ارسال داده از کامپیوتر به آرم. چون در آرم اجزای پکت رو حین دریافت بررسی نکردم و فقط به گرفتن داده به صورت خام اکتفا کردم. ولی در ارسال از آرم به کامپیوتر دیگه فکر نمی کنم بشه به همین سادگی عمل کرد. باید تک تک بایت های پکت ارسالی را حساب کنم و بعدش ارسال کنم. برای اینکه بتوانم داده های دریافتی و ارسالی را بررسی کنم از نرم افزار wireshark استفاده می کنم.

                        پیروز و سربلند باشید
                        آدمی از عالم خاکی نمی آید بدست

                        عالمی دیگر بباید ساخت و از نو آدمی
                        پردازش تصویر با FPGA از صفر تا انتها
                        http://www.eca.ir/forum2/index.php?topic=74299.0

                        دیدگاه

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