ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 ноября
700806
Гудвин, волшебник (22.09.2016 10:26 - 10:33, просмотров: 16196)
Вопрос к ЦЭ-гуру: Вот эта конструкция (вывод данных из некой структуры в 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);