ترفند ها

شروع موضوع توسط mj.sh ‏11/2/16 در انجمن AVR

  1. mj.sh

    mj.sh مدیر عضو کادر مدیریت

    با سلام.اینجا میخوایم ترفند هامون رو توی کار ها توضیح بدین.من اولین چراغ رو روشن میکنم(البته با کپی از مطالب استاد اسدی)


    چند روز پیش مشغول پروگرام کردن یه 2000 تا میکرو بودم که به صورت اتفاقی یه چیزی که اصلا فکر نمیکردم ممکن باشه رو متوجه شدم

    فکر میکنید اینها چیه؟ و چرا این طوری شدن ؟ (راستی شنیدین میگن مغذ ادمهای طنبل خوب کار میکنه)

    20-16F628A-2.jpg

    در کمال ناباوری متوجه شدم اگر چند تا میکرو رو به صورت موازی روی هم قرار بدم هم بدون مشکل پروگرام میشن من این تست رو تا 50 تا میکروی موازی تست کردم باورتون میشه 50 میکرو رو با یکبار پروگرام کردن همهگی پروگرام شدن
    در ضمن روی AVR و PIC هم تست کردم عالی باور کردنی نیست همگی بدون مشکل پروگرام شدن و لاکبیتها و فیوزبیتها هم بدون مشکل پروگرام شد

    شاید بگید به چه دردی میخوره ؟؟؟؟
    ولی باید بگم اگر شما هم مثل من قرار بود هر ماه بیش از 10000 تا میکرو رو پروگرام میکردید به یه همچین کارایی دست میزدید خدایی ادم خسته میشه هر میکرو بنداز و در بیار و ....... اگر فکرشو بکنید چقدر طول میکشه و کسل کننده است

    ولی با این روش 20 تا 20 پروگرام میشه و هم سریعتر کار پیش میره و هم خوش اینده یه جور مثل گول زدن میکرو هست جالبه
    فکرشو بکنید 1000 تا میکرویی که 3 ساعت طول میکشید پروگرام بشه در عرض نیم ساعت پروگرام کنی و خلاص ... جالبه نه؟؟؟

    20-16F628A-1.jpg

    گفتم شاید کسایه دیگه ای هم مشکل منو داشته باشن لذا اینجا مطرح کردم

    امیدوارم مفید باشه !!

    به همین سادگی

    موفق باشین
    M.R.Abedini، hamid.ch، Alma و یک نفر دیگر از این ارسال تشکر کرده اند.
  2. Alma

    Alma مدیر عضو کادر مدیریت

    نکته خیلی مهم در مورد رشته ها در کامپایلر GCC

    دوستانی که توی کدویژن کار میکنن اصلا این چیزا رو متوجه نمیشن چون این نرم افزار کارهای زیادی دور از چشم شما انجام میده و شمارو از اصل اتفاق و جریان دور میکنه

    وقتی توی برنامه قراره یه تعداد رشته توی فلش داشته باشم این رشته ها حتی وقتی که نیازی بهش ندارین فضای رم رو اشتغال میکنن و باعث از دست دادن فضای زیادی از رم میشه
    مخصوصا جایی که قراره توی LCD منو بنویسیم و .....
    این مشکل بیشتر توی میکرو هایی که حافظه رم محدودی دارن جلب توجه میکنه
    در این میکرو ها این نوع رشته ها رو باید از نوع FLASH یا PROGMEM تعرف بشن
    در کامپایلر GCC هم میشه همون کار کدویژن رو کرد ولی باید خودتون این کار رو بکنید و کامپایلر کاری نمیکنه و باید با استفاده از دستورات و ماکرو های مناسب قبل از استفاده از این رشته اطلاعات در حافظه رم کپی بشه بعد استفاده بشه

    همه توابعی که به برای این کار در کتابخونه های خود GCC قرار گرفتن و اماده استفاده شدن در فایل pgmspace.h قرار دارن و با انکلود کردن این فایل میشه این توابع رو به برنامه خودتون اضافه کنید

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


    توی این فایل بیشتر توابعی که توی فایل string.h وجود دارد باز نویسی شده و توابع برای استفاده از حافظه های PROGMEM بهینه شدن و قابلیت تعریف متغیر از نوع PROGMEM به برنامه اضافه میشه

    برای مثال تابع strcpy_P

    کد:
    char *strcpy_P(char *, const char *)
    همون مشابه تابع strcpy در فایل strcpy هست با این فرق که ورودی ارگومان دوم میتونه از نوع PROGMEM باشه

    برای استفاده از این نوع رشته ها میشه از این روش هم استفاده کرد

    کد:
    strstr_P(rx_buffer, (const char *)PSTR("AlmaElectronic\r\n"))
    ماکروی PSTR رشته "AlmaElectronic\r\n" رو از نوع const char PROGMEN* تعریف میکنه و ادرس اون رو برای استفاده در تابع strstr_P به const char * تبدیل میکنه

    ماکرو های مهم این کتابخونه

    کد:
    Macros
    #define     PROGMEM   __ATTR_PROGMEM__
    #define     PGM_P   const char *
    #define     PGM_VOID_P   const void *
    #define     PSTR(s)   ((const PROGMEM char *)(s))
    #define     pgm_read_byte_near(address_short)   __LPM((uint16_t)(address_short))
    #define     pgm_read_word_near(address_short)   __LPM_word((uint16_t)(address_short))
    #define     pgm_read_dword_near(address_short)   __LPM_dword((uint16_t)(address_short))
    #define     pgm_read_float_near(address_short)   __LPM_float((uint16_t)(address_short))
    #define     pgm_read_ptr_near(address_short)   (void*)__LPM_word((uint16_t)(address_short))
    #define     pgm_read_byte_far(address_long)   __ELPM((uint32_t)(address_long))
    #define     pgm_read_word_far(address_long)   __ELPM_word((uint32_t)(address_long))
    #define     pgm_read_dword_far(address_long)   __ELPM_dword((uint32_t)(address_long))
    #define     pgm_read_float_far(address_long)   __ELPM_float((uint32_t)(address_long))
    #define     pgm_read_ptr_far(address_long)   (void*)__ELPM_word((uint32_t)(address_long))
    #define     pgm_read_byte(address_short)    pgm_read_byte_near(address_short)
    #define     pgm_read_word(address_short)    pgm_read_word_near(address_short)
    #define     pgm_read_dword(address_short)    pgm_read_dword_near(address_short)
    #define     pgm_read_float(address_short)    pgm_read_float_near(address_short)
    #define     pgm_read_ptr(address_short)    pgm_read_ptr_near(address_short)
    #define     pgm_get_far_address(var)
    کد:
    Typedefs
    typedef void PROGMEM     prog_void
    typedef char PROGMEM     prog_char
    typedef unsigned char PROGMEM     prog_uchar
    typedef int8_t PROGMEM     prog_int8_t
    typedef uint8_t PROGMEM     prog_uint8_t
    typedef int16_t PROGMEM     prog_int16_t
    typedef uint16_t PROGMEM     prog_uint16_t
    typedef int32_t PROGMEM     prog_int32_t
    typedef uint32_t PROGMEM     prog_uint32_t
    typedef int64_t PROGMEM     prog_int64_t
    typedef uint64_t PROGMEM     prog_uint64_t
    و توابع کتاب خونه

    کد:
    const void *     memchr_P (const void *, int __val, size_t __len)
    int     memcmp_P (const void *, const void *, size_t) __ATTR_PURE__
    void *     memccpy_P (void *, const void *, int __val, size_t)
    void *     memcpy_P (void *, const void *, size_t)
    void *     memmem_P (const void *, size_t, const void *, size_t) __ATTR_PURE__
    const void *     memrchr_P (const void *, int __val, size_t __len)
    char *     strcat_P (char *, const char *)
    const char *     strchr_P (const char *, int __val)
    const char *     strchrnul_P (const char *, int __val)
    int     strcmp_P (const char *, const char *) __ATTR_PURE__
    char *     strcpy_P (char *, const char *)
    int     strcasecmp_P (const char *, const char *) __ATTR_PURE__
    char *     strcasestr_P (const char *, const char *) __ATTR_PURE__
    size_t     strcspn_P (const char *__s, const char *__reject) __ATTR_PURE__
    size_t     strlcat_P (char *, const char *, size_t)
    size_t     strlcpy_P (char *, const char *, size_t)
    size_t     strnlen_P (const char *, size_t)
    int     strncmp_P (const char *, const char *, size_t) __ATTR_PURE__
    int     strncasecmp_P (const char *, const char *, size_t) __ATTR_PURE__
    char *     strncat_P (char *, const char *, size_t)
    char *     strncpy_P (char *, const char *, size_t)
    char *     strpbrk_P (const char *__s, const char *__accept) __ATTR_PURE__
    const char *     strrchr_P (const char *, int __val)
    char *     strsep_P (char **__sp, const char *__delim)
    size_t     strspn_P (const char *__s, const char *__accept) __ATTR_PURE__
    char *     strstr_P (const char *, const char *) __ATTR_PURE__
    char *     strtok_P (char *__s, const char *__delim)
    char *     strtok_rP (char *__s, const char *__delim, char **__last)
    size_t     strlen_PF (uint_farptr_t src)
    size_t     strnlen_PF (uint_farptr_t src, size_t len)
    void *     memcpy_PF (void *dest, uint_farptr_t src, size_t len)
    char *     strcpy_PF (char *dest, uint_farptr_t src)
    char *     strncpy_PF (char *dest, uint_farptr_t src, size_t len)
    char *     strcat_PF (char *dest, uint_farptr_t src)
    size_t     strlcat_PF (char *dst, uint_farptr_t src, size_t siz)
    char *     strncat_PF (char *dest, uint_farptr_t src, size_t len)
    int     strcmp_PF (const char *s1, uint_farptr_t s2) __ATTR_PURE__
    int     strncmp_PF (const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
    int     strcasecmp_PF (const char *s1, uint_farptr_t s2) __ATTR_PURE__
    int     strncasecmp_PF (const char *s1, uint_farptr_t s2, size_t n) __ATTR_PURE__
    char *     strstr_PF (const char *s1, uint_farptr_t s2)
    size_t     strlcpy_PF (char *dst, uint_farptr_t src, size_t siz)
    int     memcmp_PF (const void *, uint_farptr_t, size_t) __ATTR_PURE__
    static size_t     strlen_P (const char *s)
    M.R.Abedini، saeeddelshad0020، Sepehr20mg10 و یک نفر دیگر از این ارسال تشکر کرده اند.
  3. M.R.Abedini

    M.R.Abedini همکار جدید

    روش خوبیه... ممنون ما خودمون از جیتگ استفاده میکنیم اما میکروهامونsmdهسش. مرسی از اینکه به اشتراک گذاشتی
    آخرین ویرایش: ‏2/11/19
    Alma از این پست تشکر کرده است.

به اشتراک بگذارید