اطلاعیه

Collapse
No announcement yet.

C and DSP

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

    C and DSP

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

    http://www.eca.ir/forum2/index.php?topic=29824.0

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

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

    #2
    پاسخ : C and DSP

    به نام خدا

    در ابتدا انواع داده رو با هم بررسی می کنیم.
    تمام انواع Integer مثل char, short, int به همراه unsigned هایشان 16 بیتی هستند.
    مقدار های long و unsigned long برابر 32 بیت می باشند.
    یک مقدار منحصر به فرد برای تراشه های DSP مقدار 64 بیتی است که با نوشتن دوبار عبارت long به دست می آیند. پس long long و unsigned long long برابر 64 بیت می باشند.
    signed برای متغیرهای علامت دار استفاده می شود.
    char یک مقدار علامت دار محسوب می شود و مشابه int می باشد.
    مقدار enum برابر 16 بیت می باشد و مشابه int است.
    برای مقادیر اعشاری ازfloat و double استفاده می شوند که دقت و اندازه آن ها بر اساس استاندارد IEEE single-precision تعیین می شود. هم چنین long double نیز برای نمایش اعداد اعشاری با دقتی بیشتر از double استفاده می شوند و مقدارشان بر اساس استاندارد IEEE double-precision تعیین می شود. برخی از رنج ها و مقادیر ماکرو های استاندارد در هدر فایل مخصوصشان تعریف می شوند مثل float.h یا limits.h که در این رابطه بعدا ها مطالبی جمع آوری خواهم کرد. در شکل زیر انواع داده به همراه اندازه و کمترین و بیشترین مقدارهایشان را مشاهده می کنید.



    همان طور که در جدول بالا می بینید مقادیری در مبنای 16 و 22 نیز قابل تعریف هستند. بیشترین مقداری که می توان تعریف کرد تقریبا برابر 3 و 38 صفر در جلوی آن است.
    کامپایلر C28x از مقادیر long long و unsigned long long پشتیابانی می کند. برای استفاده از آن ها باید از Header فایل limits.h استفاده کرد.

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

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

    دیدگاه


      #3
      پاسخ : C and DSP

      کامپایلر به ما اجازه می دهد از دستورات اسمبلی در کنار دستورات سی نیز بهره بجوییم. برای این کار کافی است از فرم زیر استفاده کنیم.
      asm(“assembler text”
      جملات اسمبلی باید در میان یک جفت کوتیشن قرار بگیرند. کامپایلر تمام جملات رو به طور مستقیم به فایل خروجی منتقل می کند. برای قرار دادن نقل قول در زبان اسمبلی باید از .string استفاده کرد. مثال زیر را ببینید.
      asm(“STR: .string \”abcd\””
      کلمات کلیدی

      const
      برای تعریف متغیر ثابت از کلمه const استفاده می شود. نحوه تعریف یک متغیر ثابت در داخل یک عبارت بسیار مهم است. برای مثال در زیر دو کد رو می بینیم که هر دو یک اشاره گر را تعریف کردند. کد اول یک اشاره گر ثابت به یک متغیر int و دومی یک اشاره گر به یک متغیر ثابت است.
      int * const p = &x;
      const int * q = &x;

      volatile
      کامپایلر C یک بهینه ساز یا Optimizer دارد که به صورت هوشمندانه کدهای زائد را حذف می کند. این کار باعث تسریع در اجرا و کم شدن حجم برنامه می شود. البته ممکن است گاهی در عملکرد برنامه اختلالی ایجاد شود. در بیشتر موارد اشاره گر ها توسط بهینه ساز کامپایلر حذف می شوند بدین صورت که در هنگام کامپایل شدن مقداری را که pointer به آن اشاره می کند به عنوان مقدار اصلی در نظر می گیرد و کل دستور را حذف می کند. در این صورت اگر مقدار اشاره گر در حین اجرای برنامه تغییر کند پردازنده متوجه آن نمی شوند. یا متغیری را در نظر بگیرید که در انتظار یک وقفه نشسته است( یعنی ممکن است مقدارش هر لحظه تغییر کند ). بهینه ساز مقدار پیش فرضی به متغیر مذکور می دهد و باقی عبارات را حذف می کند. در این صورت با سر رسیدن یک وقفه متغیر مربوطه تغییری نمی کند و برنامه با مشکل رو به رو می شود.
      برای حل چنین مشکلی بعضی از متغیر ها را از نوع volatile تعریف می کنیم تا به کامپایلر بفهمانیم که مقدار متغیر مذکور هر لحظه ممکن است تغییر کند پس در هنگام بهینه سازی برنامه، از حذف آن و خطوطی که در آنها استفاده شده صرف نظر کن. در بیشتر مواقع بهتر است تا اشاره گرها را از نوع Volatile تعریف کنیم هم چنین تمام متغییر های عمومی که بین برنامه جاری و سرویس وقفه مشترک هستند نیز باید از همین نوع تعریف شوند تا در اجرای برنامه مشکلی پیش نیاید. چنین متغیری را به صورت زیر تعریف می کنند.
      volatile unsigned int a;

      cregister
      کامپایلر سی با تعریف چنین متغیر اجازه دسترسی به register ها را فراهم کرده است. هنگامی که متغیری از نوع cregister تعریف می کنید، کامپایلر آن را با مجموعه ای از نام رجیستر های استاندارد مقایسه می کند. اگر نتیجه مقایسه درست بود کامپایلر اجازه کنترل آن رجیستر را می دهد در غیر این صورت یک خطا ارسال می کند. مثل :
      IER for Interrupt enable register
      IFR for Interrupt flag register

      cregister فقط بر روی اشیایی از نوع int یا pointer قابل تعریف است. این کلمه کلیدی بر روی float یا هر structure یا union قابل تعریف نیست. اگر می خواهید متغیرتان هم به صورت volatile تعریف شود و هم امکلن کنترل رجیستر ها را داشته باشید باید به صورت زیر عمل کنید.

      extern cregister volatile unsigned int register;

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

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

      دیدگاه


        #4
        پاسخ : C and DSP

        رجیستر IFR از نوع فقط خواندنی است و فقط می تواند با عملوند | (OR) تنظیم شود. برای ریست کردن یا پاک کردن آن هم از عملوند &استفاده می شود.
        IFR |= 0x4;
        IFR &= 0x0800;
        رجیستر IER هم با عملوند های & و | قابل تخصیص است. اگر این رجیستر ها به صورت نامناسب دستکاری شوند با پیغام خطای زیر رو به رو می شویم.
        >>> Illegal use of control register
        مثال زیر استفاده از کنترل کننده های رجیستر را توضیح می دهد.
        extern cregister volatile unsigned int IFR;
        extern cregister volatile unsigned int IER;
        extern int x;
        main()
        {
        IER = x;
        IER |= 0x100;
        printf(”IER = %x\n”, IER);
        IFR &= 0x100;
        IFR |= 0x100;
        }

        interrupt
        برای مدیریت وقفه ها از کلمه کلیدی interrupt استفاده می کنیم. این کلمه می تواند برای تعریف یک تابع به کار برده شود.
        interrupt void int_handler()
        {
        unsigned int flags;
        ...
        }
        یکی از نام های تعریف شده ای که برای تنظیم وقفه استفاده می شود c_int00 می باشد. در آینده در این رابطه بیشتر مطلب جمع آوری می کنم.

        ioport
        این کلمه کلیدی امکان دسترسی به پایه های ورودی و خروجی تراشه را فراهم می کند و به فرم زیر تعریف می شود.
        ioport type porthex_num
        نوع داده یا عبارت type در تعریف بالا باید از نوع int ,char ,short, unsigned int باشد. porthex_num شماره پورت ورودی یا خروجی تراشه به صورت هگزادسیمال است. مثال زیر را در نظر بگیرید:

        ioport int port10;
        int a; int b; int c;
        extern void foo(int);
        void func()
        {
        port10 = a;
        b = port10;
        foo(port10);
        c = port10 + b;
        port10 += a;
        }

        در تکه کد بالا یک متغیر برای دسترسی به پورت به نام port10 تعریف می کنیم. پنج حالت دسترسی یا تاثیر گذاری بر روی پورت رو مشاهده می کنید. می توانید مقدار یک پورت را به طور مستقیم مقدار دهی کنید یا مقدار آن را در داخل یک متغیر بریزید. یا این که یک تابع را با آن فراخوانی کنید یا در عملیات ریاضی آن را شرکت دهید.

        far
        مقدار اغلب متغیر ها 16 بیتی است. پس دسترسی به حافظه یا مقدار دهی آن در حالت معمول 16 بیتی است. با این کلمه کلیدی می توانید به مقادیر بیشتری نیز دسترسی داشته باشد. این کلمه یک متغیر 22 بیتی برای دسترسی بیشتر به حافظه را فراهم می کند. البته مقدار 64 بیتی هم در بین انواع داده داریم ولی به نظر می رسد برای دسترسی به حافظه تنها ناچار به استفاده از متغیر های 16 بیتی هستیم. این موضوعی است که در آینده بیشتر باید مورد بررسی قرار بگیرد.
        حالت های مختلف تعریف متغیر far در زیر لیست شده است.
        int far sym;
        far int sym;
        struct S far s1;
        int far *ptr;
        int * far ptr;
        int far * far ptr;.
        int far *func();
        int far *memcpy_ff(far void *dest, const far void *src, int count);
        int *far func() ;
        تعریف اخیر اشتباه می باشد زیرا far تنها به data اختصاص می یابد.
        int func(){
        int far x;
        تعریف بالا نیز اشتباه می باشد. far تنها برای متغیر های global و یا static تعریف می شود. متغیرهایی که در حالت معمول در حافظه stack قرار می گیرند نزدیک محسوب می شوند!!
        int far *ptr ;
        }
        struct struct_name{
        int a;
        int far b;
        int far *ptr;
        };

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

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

        دیدگاه


          #5
          پاسخ : C and DSP

          توابع
          در ادامه توابع شناخته شده برای کامپایلر سی رو با هم بررسی می کنیم.
          abort
          این تابع برای لغو کردن اجرای برنامه می باشد. برای استفاده از این تابع باید فایل سرآمد stdlib در ابتدای برنامه فراخوانی شود. مثال:
          void abort(void)
          {
          exit(EXIT_FAILURE);
          }

          abs/labs
          هر دو تابع مقدار قدر مطلق یک متغیر را بر می گردانند. abs برای متغیر هایی از نوع int و labs از نوع long int و llabs برای long long int استفاده می شود. فایل سر آمدش stdlib است.

          acos
          مقدار معکوس cos رو بر می گرداند. متغیر مورد استفاده باید از نوع double باشد. فایل سر آمد math در ابتدا برنامه باید درج شود. خروجی این تابع به صورت رادیان می باشد.

          asctime
          هدر فایلش time می باشد. برای تبدیل زمان مورد استفاده قرار می گیرد و به صورت زیر تعریف می شود.
          char *asctime(const struct tm *timeptr);

          assert
          هدر فایلش assert و آرگومانش نوع int است. اگر مقدار آرگومان این تابع وجود نداشته یا صفر باشد اجرای برنامه متوقف می شود. فرض کنید برنامه ای نوشتیم که قرار است دو عدد را بر هم تقسیم کند. اگر عدد دوم صفر باشد حاصل تقسیم بی معنی خواهد شد. بنابراین قبل از نوشتن عبارات تقسیم عدد دوم را با تابع assert چک می کنیم.
          آدمی از عالم خاکی نمی آید بدست

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

          دیدگاه


            #6
            پاسخ : C and DSP

            سلام

            لیست همه توابع مورد استفاده در سی با توضیح و مثال هر کدام رو از لینک زیر می توانید دانلود کنید.




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

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

            دیدگاه


              #7
              پاسخ : C and DSP

              سلام
              خلاصه همه توابع شناخته شده توسط کامپایلر سی رو به همراه توضیح مختصر هریک از لینک زیر می توانید دانلود کنید.
              این فایل در مجموع 12 صفحه هست. برای مواقعی که می خواهید لیست همه توابع رو به همراه توضیحشان در تعداد صفحات کمتر همراه داشته باشید مفید خواهد بود.




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

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

              دیدگاه


                #8
                پاسخ : C and DSP

                سلام
                قصد دارم در ادامه به بررسی CCS بپردازم. البته نمی دونم تنهایی از پسش بر می آم یا نه ولی تمام سعی ام رو می کنم. اگر هم به دستوری رسیدم که تو تاپیک های قبلی توضیح ندادم حتما می رم دنبالش و یاد می گیرمش و میام براتون توضیح می دهم.

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

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

                دیدگاه


                  #9
                  پاسخ : C and DSP

                  سلام :smile:
                  به خاطر ارسالهاتون ممنون
                  آیا این ارسالها همچنان ادامه داره :question:
                  آیا منتظر بمونیم :question:
                  علم و عمل پیوند نزدیک دارند , و کسی که دانست باید به آن عمل کند. چرا که علم عمل را فرا خواند, اگر پاسخش داد میماند و گر نه کوچ میکند. امام علی (ع)

                  دیدگاه


                    #10
                    پاسخ : C and DSP

                    سلام
                    واقعا شرمندم که به علت مشکلات شخصی فراوان نتونستم مدتی به این تاپیک سر بزنم. خودم هم از این موضوع خیلی ناراحتم. نمی دونم بالاخره کی می خواد همه چیز حل بشه. داشتم فکر می کردم حتی خودمم ممکنه فراموش کنم :redface: :redface: :redface:





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

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

                    دیدگاه


                      #11
                      پاسخ : C and DSP

                      سلام
                      بالاخره برگشتم.
                      مدار زیر را در نظر بگیرید.



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

                      در ضمن لینک زیر هم اطلاعات بسیار مفیدی در زمینه کار با CCS دارد.
                      http://www.eca.ir/forum2/index.php?topic=32324.0
                      پیروز و سربلند باشید.
                      آدمی از عالم خاکی نمی آید بدست

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

                      دیدگاه


                        #12
                        پاسخ : C and DSP

                        سلام
                        در مورد ساخت بورد DSK با ایران الکترونیک مشورت کردم. طبق صحبت های آقای اسدالهی تمام قطعه های مورد نیاز برای ساخت بورد DSK حدود سی هزار تومن می شه که می گفت همه رو خودش هم داره به غیر سوکت 176 پایه برای نصب تراشه های SMD. البته مورد آخر رو تا دوشنبه هفته دیگه باید صبر کنید تا یک خبر بسیار خوب بهتون بدم. دعا کنید که بالاخره موفق بشم.

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

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

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

                        دیدگاه


                          #13
                          پاسخ : C and DSP

                          سلام پویا جان.........

                          30000 تومان!!!!!مطمئنی .با pcb یا بدون pcb .فقط خود dsp 30 تومانه .در ضمن اینجایی که گفتی رم 16 بیتی داره یا max232 low voltage؟؟
                          http://www.eca.ir/forum2/index.php/topic,10159.0.html
                          Engineering is the art of making what you want from things you can get.
                          اموزش DSP ...........................
                          http://www.eca.ir/forum2/index.php?topic=29824.0
                          http://www.eca.ir/forum2/index.php?topic=32324.0

                          دیدگاه


                            #14
                            پاسخ : C and DSP

                            شرمنده یادم رفت بگم که مبلغ تراشه DSP و پی سی بی رو در نظر نگیرین. در مورد رم 16 بیتی هم سوال نکردم. ولی به صورت کلی وقتی بحث شد به این موضوع اشاره کرد که قطعه های مورد نیاز برای ساخت بورد DSK به غیر سوکت 176 پایه رو داره. راستی F2812 رو می ده 32 هزار تومن که البته قیمتشو از 45 تومن رسوندیم به این مبلغ که آخرم نگرفتم چون شنیده بودم ارزان تر هم می شه پیدا کرد. :redface: :icon_razz:
                            راستی سی دی CCS که قیمتش هجده هزار تومن هست رو از هیچ جا تهیه نکنید چون با برنامه ای که از اینترنت دانلود می کنید هیچ فرقی نمی کنه.
                            آدمی از عالم خاکی نمی آید بدست

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

                            دیدگاه


                              #15
                              پاسخ : C and DSP

                              سلام
                              چند تا فیلم آموزشی پیدا کردم که به نظرم خیلی مفید بود.

                              کار با استارتر کیت و CCS
                              http://www.youtube.com/watch?v=LccMlKbSDmQ&feature=related
                              البته خیلی مختصره. اگه فکر می کنید ممکنه مفید باشه بگین تا دانلودش کنم و توی چند قسمت با حجم کم پلود کنم.

                              طریقه لحیم کردن آی سی های SMD بر روی بورد های الکترونیکی
                              http://www.youtube.com/watch?v=gDv3OzpCvck&feature=related
                              موضوع بالا مرتبط با بحث این تاپیک نیست ولی خوب زیاد هم بی ارتباط نیست.

                              ببخشید که کامل نیستند ولی از هیچی باز یه خورده ای بهترند. توی این اوضاع تحریم و کم بود اطلاعات باید چکه چکه سیر آب شد! :agree: :redface:
                              پیروز و سربلند باشید.
                              آدمی از عالم خاکی نمی آید بدست

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

                              دیدگاه

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