ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.






جهت تبلیغ در وب سایت ECA کلیک کنید.

کاربران برچسب زده شده

نمایش نتایج: از 1 به 8 از 8
  1. #1
    2005/06/10
    بابل
    1,808
    34

    کاربرد و عملکرد دقيق ماکرو assert_param

    با سلام.
    در زبان سي و همچنين کتابخانه هاي نوشته شده براي ميکروکنترلر هاي STM32 تکنيکي به کار ميره با عنوان هاي مختلف که بنده کاربردش رو دقيقا درک نکردم چي هست.
    توي زبان سي با عبارت ()assert نوشته ميشه و در يکي از کتابخونه هاي STM32آ* به صورت زير تعريف شده:
    کد:
    /* #define USE_FULL_ASSERT  1 */
    
    /* Exported macro ------------------------------------------------------------*/
    #ifdef USE_FULL_ASSERT
    
    /**
     * @brief The assert_param macro is used for function's parameters check.
     * @param expr: If expr is false, it calls assert_failed function
     *  which reports the name of the source file and the source
     *  line number of the call that failed.
     *  If expr is true, it returns no value.
     * @retval None
     */
     #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
    /* Exported functions ------------------------------------------------------- */
     void assert_failed(uint8_t* file, uint32_t line);
    #else
     #define assert_param(expr) ((void)0)
    #endif /* USE_FULL_ASSERT */

    ماکرو نوشته شده در بالا کارش اين هست: عبارت يا expr رو بررسي ميکنه اگه از نظر منطقي صحيح بود عبارت هيچي يا (void)0 رو بر ميگردونه در غير اين صورت يه تابع تعريف ميکنه و شماره فايل و آدرس خط رو بهش ارسال ميکنه. همونجا هم اين تابع رو تعريف کرده که عملکرد خاصي رو براش تعريف نکرده.

    البته ماکرو رو به دو صورت تعريف کرده يکي در حالت full و ديگري معمولي. در حالت معمولي هيچ کاري انجام نميده فقط اگه شرط صحيح بود مقدار هيچي رو برميگردونه و اگه نبود هم چيزي براش تعريف نشده.

    اين ماکرو که در حقيقت دستور پيش پردازنده هست چه کمکي به برنامه نويس ميکنه که اينقدر فراگير ازش استفاده شده؟
    با سپاس
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ*ي جهاد فيآ*سبيلآ*الله.
    هجرت، هجرت از سنگينيآ*هاست و جاذبهآ*هايي كه تو را به خاك ميآ*چسباند.
    چكمهآ*هايت را بپوش، رهآ*توشهآ*ات را بردار و هجرت كن.
  2. #2
    2005/06/10
    بابل
    1,808
    34

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

    پاسخ هايي که در اينترنت به اونها برخورد کردم:
    کد:
    Assert can be your best friend. For example, if instead of:
    int
    foo(int x, int y)
    { /* Return some function of x and y. Remember, x needs
    to be between 5 and 10, and y must be between 15 and 150
    or this will segfault!! */
    ....
    }
    
    you write:
    int
    foo(int x, int y)
    {
    assert(x > 5 && x <=10);
    assert (y >=15 && y<150);
    ....
    }
    
    You get 2 major benefits.
    1) Removes the ambiguity inherent in the English description
    regarding whether the endpoints are inclusive,
    2) When some code is changed so that a caller is using
    the wrong arguments, you will be instantly aware of it
    when you run, instead of getting a random segfault and
    having to track down what caused it.
    
    Also, placing assertions makes it clear to the maintainer
    what the coder expected. Any time you expect something
    to be true, place an assertion. If it fails, you either have
    a coding error somewhere, or your expectation is wrong.
    Either is good to know.
    
    Assert is better than if for this type of thing, because it goes
    away when you compile your non-debug version. You can
    accomplish that with precompiler wrappers around your
    if statements, but it is aesthetically unappealing in most
    cases.
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ*ي جهاد فيآ*سبيلآ*الله.
    هجرت، هجرت از سنگينيآ*هاست و جاذبهآ*هايي كه تو را به خاك ميآ*چسباند.
    چكمهآ*هايت را بپوش، رهآ*توشهآ*ات را بردار و هجرت كن.
  3. #3
    2012/12/30
    بوشهر
    3,206
    1,107

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

    دیاگنوز! (Diagnostics)
    این هدر فایل (assert.h) واسه کارهای دیباگینگ به کار میره. وقتی شما در حال دیباگینگ هستید و می خوایید مقدار یه عبارت رو چک کنید و ببینید که درسته یا نه از این تابع استفاده میکنید:


    کد:
    void assert(int expression)
    اگه بررسی که میشه 0(صفر)(false) باشه این تابع یه پیغام خطا رو نشون میده که شامل فایل سورس و خطی که توش مورد وجود داره، هستش. بعدش تابع abort هم فراخونده میشه که برنامه رو نگه میداره. مثل این:

    کد:
    assert(1 == 2);
    
    /* Might result in */
    
    Assertion failed: 1 == 2, file silly.c, line 15

    همین.
  4. #4
    2005/06/10
    بابل
    1,808
    34

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

    بحث جالبی در این خصوص در یه فروم آورده شده بود که قسمت هایی رو بنده مطالعه کردم که برخی رو در زیر آورده شده :

    یک دستور پیش پردازنده است. بدین معنی که عبارتی که همواره باید صحیح باشد را بررسی می کند و در صورتی که عبارت از نظر منقطی false باشد هنگام دیباگ به برنامه نویس اطلاع می دهد.
    توضیحات کامل و دقیقی در لینک زیر آورده شده است:
    http://bytes.com/topic/c/answers/479154-how-does-assert-benefit-your-code-really

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

    در مورد مزایای استفاده از این روش به جای استفاده از دستور پیش پردازنده ای if این آورده شده است که برنامه را خوانا تر می کند.
    باید دقت داشت که در موارد استفاده از این تابع باید دقت نمود. این ماکرو باید زمانی فراخوانی شود که یقین داریم که مقدار true باید برگردانده شود. در شرایطی که مثلا مانند کد زیر:
    کد:
    char * p = malloc(10);
    
    assert(p != NULL);

    امکان این خطا بلقوه وجود دارد و نباید از تابع assert استفاده شود. بلکه باید به صورت زیر نوشته شود:
    کد:
    char * p = malloc(10);
    
    if(NULL == p)
    {
    // Now what? It's all too easy to call abort() etc?
    }
    یعنی اگر این شرایط اتفاق افتاد برنامه باید تمهیداتی در نظر بگیرد.

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

    تحلیل های مفصلی در این خصوص در ادامه مطالب این سایت آورده شده است که در فرصت مناسب باید مطالعه و شوند
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ*ي جهاد فيآ*سبيلآ*الله.
    هجرت، هجرت از سنگينيآ*هاست و جاذبهآ*هايي كه تو را به خاك ميآ*چسباند.
    چكمهآ*هايت را بپوش، رهآ*توشهآ*ات را بردار و هجرت كن.
  5. #5
    2005/06/10
    بابل
    1,808
    34

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

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

    ابزاری هست کمکی جهت توسعه کتابخانه ها و ابزارهای زنجیره ای نرم افزاری، مثل همین توابع CMSISآ* و یا کتابخانه های نوشته شده برای XMEGAآ* و ... .
    دوستان دیگه اگر تجربه ای دارن در این خصوص استفاده میکنیم.
    موفق باشید
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ*ي جهاد فيآ*سبيلآ*الله.
    هجرت، هجرت از سنگينيآ*هاست و جاذبهآ*هايي كه تو را به خاك ميآ*چسباند.
    چكمهآ*هايت را بپوش، رهآ*توشهآ*ات را بردار و هجرت كن.
  6. #6
    2005/06/10
    بابل
    1,808
    34

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

    یه مثال کاربردی میتونه این باشه:
    یه کتابخونه کامل برای تایمر نوشته شده، برخی از تایمر ها چند تا قابلیت بیشتر از بقیه دارن. حالا اگه حین برنامه نویسی کد نویس به اشتباه قابلیتی رو از تایمر فراخونی کنه که در این تایمر وجود نداره، این سبب میشه برنامه وارد یه حالت نا خواسته بشه.

    برای جلوگیری از این مسئله در کتابخونه مربوط به تایمر قبل استفاده از قابلیت هایی از این دست اول بررسی می کنن که این قابلیت در تایمر اساسا وجود داره یا نه، اگه وجود داشته باشه کد اجرا میشه اگه نه به برنامه نویس اطلاع میده که قابلیت رو و یا نام تایمر رو اشتباه نوشته شده.

    اینکار به برنامه نویس کمک میکنه که از ایجاد حالات ناخواسته که پیگیری اونها گاهی میتونه خیلی پیچیده بشه جلوگیری کنه.
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ*ي جهاد فيآ*سبيلآ*الله.
    هجرت، هجرت از سنگينيآ*هاست و جاذبهآ*هايي كه تو را به خاك ميآ*چسباند.
    چكمهآ*هايت را بپوش، رهآ*توشهآ*ات را بردار و هجرت كن.
  7. #7
    2012/12/30
    بوشهر
    3,206
    1,107

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    هستش.
    این صفحه نمونه های مفیدی رو براتون ارائه میده:


    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  8. #8
    2007/12/13
    تهران
    732
    15

    پاسخ : کاربرد و عملکرد دقيق ماکرو assert_param

    خوب حالا چرا کانپايلر به اين گيرو ميده:

    .\mainpanel.axf: Error: L6218E: Undefined symbol assert_param (referred from misc.o).

    البته وقتي Firmware رو اد ميکمي .
    از جمله ی رفتگان این راه دراز
    باز آمده ای کو که به ما گوید راز
    هان بر سر این دو راهه از روی نیاز
    چیزی نگذاری که نمی آیی باز
نمایش نتایج: از 1 به 8 از 8

موضوعات مشابه

  1. ماکرو نویسی در HMI دلتا
    توسط rasool1370 در انجمن PLC
    پاسخ: 1
    آخرين نوشته: 2015/08/16, 23:15
  2. Assert_Param
    توسط sina_mehraban در انجمن STM
    پاسخ: 7
    آخرين نوشته: 2014/12/11, 09:25
  3. مشکل در تعریف ماکرو
    توسط hamedb3269 در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2013/10/24, 21:31
  4. آنتن ماکرو استریپی چند لایه
    توسط saeed22965 در انجمن نرم افزار HFSS
    پاسخ: 1
    آخرين نوشته: 2013/10/24, 10:03
  5. تعریف ماکرو
    توسط mjs1990s در انجمن C , C++ , C#
    پاسخ: 11
    آخرين نوشته: 2013/03/09, 23:41

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •