Гудвин, волшебник (22.09.2016 10:26 - 10:33, просмотров: 16205)
Вопрос к ЦЭ-гуру: Вот эта конструкция (вывод данных из некой структуры в CSV строку) отожрала 3.5 кб программной памяти в WinAvr. Как бы соптимизировать - поубавить аппетиты?
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.cod_ev);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.sub_cod_ev);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.numb_ves);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.numb_contr);
len=add_len(buf,len);
// IP адрес RFID
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u.%u.%u.%u,"),ipaddr[0],ipaddr[1],ipaddr[2],ipaddr[3]);
len=add_len(buf,len);
// ID носителя, с которого поизводится чтение (карта, метка, брелок, rw карта)
if (rec_bin.type_nos == 1) // // обычная карта
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u_%lu,"),rec_bin.group,rec_bin.card);
}
else // метка, брелок, rw карта ID/MAC
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.MAC_M);
}
len=add_len(buf,len);
// Версия ПО брелока/rw карты. (если считана 255 страница брелока/rw карты, иначе версия = 0)
if (rec_bin.page_nos == 255)
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%lu,"),rec_bin.un_kod_ttn);
}
else
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("0,"));
}
len=add_len(buf,len);
// напряжение батареи носителя в милливольтах
if (rec_bin.page_nos == 255)
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.brutto);
}
else
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("0,"));
}
len=add_len(buf,len);
// Дата и время = 0
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("0,0,0,0,0,0,")); // времени нет всегда
len=add_len(buf,len);
//Количество записей лога в БРЕЛОКЕ (если считана 255 страница БРЕЛОКA, иначе = 0)
if ((rec_bin.page_nos == 255) && (rec_bin.un_kod_ttn >10)) // это брелок (версия >10)
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.rezerv);
}
else
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("0,"));
}
len=add_len(buf,len);
// Cтраница памяти носителя 0 - для метки, карточки, 1 или 255 - для брелока, rw карты
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.page_nos);
len=add_len(buf,len);
// Назначение контроллера RFID: 0 - СКД с автосканированием, 1- Весы СКД, 2 - Весы с автоотметкой
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.type_contr);
len=add_len(buf,len);
if ((rec_bin.page_nos == 255) && (rec_bin.un_kod_ttn >10)) // это брелок (версия >10)
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.rezerv);
}
else
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("0,"));
}
len=add_len(buf,len);
// Tип носителя // 1 - emmarine 2 - брелок или rw карта, 3- метка , 4 - rw карта(если считана 255 страница rw карты и версия ПО < 11)
if ((rec_bin.page_nos == 255) && (rec_bin.un_kod_ttn <11)) // это RW карта (версия <11)
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("4,"));
}
else
{
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.type_nos);
}
len=add_len(buf,len);
// Вес (Signed Long !)
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%ld,"),rec_bin.ves);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%lu,"),rec_bin.un_kod_ttn);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.brutto);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.time_brutto);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.time_lab);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.time_vygr);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.tara);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.time_tara);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%lu,"),rec_bin.repey1ttn);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.repey1brutto);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.n_auto);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.id_vygr_kagat);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.r_n_kag);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.rezerv);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.resets);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.curr_ibutton_time);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.rezerv2);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.CRC_FW);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),rec_bin.CRC_FW_DINe);
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("%u,"),(rec_bin.off_perim>>7)); // 0..1
len=add_len(buf,len);
sprintf_P((char*)&buf[TCP_CHECKSUM_L_P+3+len],PSTR("*,")); // фотографий нет всегда
len=add_len(buf,len);