سلام
من با کتابخونه tuxgraphic میخوام به enc28j60 و اترنت وصل بشم!!
توی قسمتی از این کتابخونه یه تابع هست به این شکل:
البته پارامتر سوم prog_char بود که کامپایلر ارور میداد و من سرچ کردم و ظاهرا باید اینجور نوشته میشد...
اما موقع استفاده از این تابع اینجور استفاده میکنیم:
و کاراکتر هامون رو به تابع PSTR میدیم!!
حال سوال اینجاست:
1- استرینگ هایی که در کد برنامه و به صورت "asdasd" نوشته میشوند در جه حافظه ای فضا میگیرند؟! مگر فلش نیست ! پس این تبدیل و .. برای چیه؟!
2- چرا برنامه نویس این کار رو کرده و مستقیم اینجوری برنامه ننوشته :
من با کتابخونه tuxgraphic میخوام به enc28j60 و اترنت وصل بشم!!
توی قسمتی از این کتابخونه یه تابع هست به این شکل:
کد:
uint16_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const char *progmem_s PROGMEM) { char c; // fill in tcp data at position pos // // with no options the data starts after the checksum + 2 more bytes (urgent ptr) while ((c = pgm_read_byte(progmem_s++))) { buf[TCP_CHECKSUM_L_P+3+pos]=c; pos++; } return(pos); }
اما موقع استفاده از این تابع اینجور استفاده میکنیم:
کد:
plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
کد:
/** \ingroup avr_pgmspace \def PSTR(s) Used to declare a static pointer to a string in program space. */ # define PSTR(s) ((const PROGMEM char *)(s)) #else /* !DOXYGEN */ /* The real thing. */ # define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) #endif /* DOXYGEN */
1- استرینگ هایی که در کد برنامه و به صورت "asdasd" نوشته میشوند در جه حافظه ای فضا میگیرند؟! مگر فلش نیست ! پس این تبدیل و .. برای چیه؟!
2- چرا برنامه نویس این کار رو کرده و مستقیم اینجوری برنامه ننوشته :
کد:
uint16_t fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s) { // fill in tcp data at position pos // // with no options the data starts after the checksum + 2 more bytes (urgent ptr) while (*s) { buf[TCP_CHECKSUM_L_P+3+pos]=*s; pos++; s++; } return(pos); }
دیدگاه