ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
13 июля
458760 Топик полностью
fk0, легенда (31.10.2013 14:45 - 14:54, просмотров: 223) ответил fk0 на Короче итог такой. Экономия ~12кБайт сходу на одном проекте, после замены sscanf и всех printf на свои. Но нужен свой assert и исключить dump_heap (в них жёстко прописано printf_cdnopsuxX). На другом проекте только замена sscanf дала экономию в
Конкретные цифры, может кому будет познавательно (замена библиотечных sscanf, printf, malloc, -msmart-io, -legacy-libc): Изначально проект собирался с опциями -legacy-libc и без опции -msmart-io (что подразумевает -msmart-io=1). Использование -legacy-libc связано с с тем, что с новой библиотекой "ничего не работает" на элементарных вещах, вроде free(NULL). Размер бинарника 260610 байт. Добавили -msmart-io=0, что отключает интеллект компилятора направленный на выявление форматов в printf и scanf использующих плавающую точку: т.е. всегда будет использоваться полноценный printf (с плавающей точкой) и scanf. В проекте используются функции с плавающей точкой, но не для ввода-вывода. Результат: 256812 байт. Т.е. экономия 3798 байт. Результат странный: по-идее -msmart-io=1 должно наоборот бы исключить функции ввода-вывода с плавающей точкой и тем самым сэкономить память. Но не исключает и в итоге в бинарник попадают и функции с плавающей точкой и без, что больше, чем только функции с плавающей точкой всегда. Следующий этап. Добавили собственный sscanf вместо библиотечного. Результат: 248403 байт. Экономия 8409 байт. sscanf взят из проекта nuttx. Не знаю что тут сказать, но общее впечатление, что библиотека фирмы dinkumware вообще странная и, впечатление, что собрана с ключами -O0 или -O1... Следующий самый объёмный этап. Убрали -legacy-libc (программа пока не рабочая) т.к. громоздкая релизация strtod, atoi и т.п. сильно мешала. Переписали все функции из stdio.h на свои. Которые дают полноценный _буферизированный_ ввод-вывод (без буфера функции вышли бы много проще и меньше в объёме). Для printf взяли функцию из проекта format . И также пришлось заменить библиотечную strerror тянущую за собой половину C библиотеки. Результат: 235464, экономия 12939 байт. Заменили qsort на собственный, использующий алгоритм сортировли Шелла (т.к. алгоритм быстрой сортировки может в определённых случаях очень сильно использовать стек ввиду рекурсии). Результат: 235242, эконимия 222 байта. Заменили malloc на свой (взят из проекта avr-libc изначально, помимо прочего -- пришлось исправлять для корректного выравнивания на 16-битной платформе). Причины две: библиотечный даёт какую-то странную сегментацию в случае, когда её не должно быть, и не работает в ряде случаев (free(NULL), а возможно и в других, т.к. это говорит о том, что библиотечные функции попросту никем не тестируются). Помимо прочего свой malloc способен сигнализировать о нарушении границ выделенной памяти: при работе с кучей и так же есть периодическая проверка. Результат: 236745, потеря 1503 байт. Общий итог: экономия 23865 байт программной памяти. По ранним расчётам библиотека C дополненная собственными функциями (отсутствующими или не работающими в библиотеке, например из time.h, wchar.h и т.п.) занимала ~45 килобайт. Сейчаса, значит, библиотека знимает порядка 21.3кБайт. Что сравнимо с pic18 (уточнил, там примерно то же самое).
[ZX]