ترفند ها

  • نویسنده موضوع mj.sh
  • تاریخ شروع

mj.sh

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


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

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

20-16F628A-2.jpg

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

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

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

20-16F628A-1.jpg

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

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

به همین سادگی

موفق باشین
 

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

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


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

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

مشاهده فایل‌پیوست 439

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

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

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

مشاهده فایل‌پیوست 440

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

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

به همین سادگی

موفق باشین
روش خوبیه... ممنون ما خودمون از جیتگ استفاده میکنیم اما میکروهامونsmdهسش. مرسی از اینکه به اشتراک گذاشتی
 
آخرین ویرایش:
  • Like
واکنش‌ها[ی پسندها]: Alma
بالا پایین