سلام
من با کتابخونه 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);
}


) )
دیدگاه