arm-gcc mktime двоичный размер - PullRequest
1 голос
/ 29 мая 2019

Мне нужно выполнить простую арифметику для struct tm из time.h.Мне нужно сложить или вычесть секунды или минуты, и я смогу нормализовать структуру.Обычно я бы использовал mktime(3), который выполняет эту нормализацию в качестве побочного эффекта:

struct tm t = {.tm_hour=0, .tm_min=59, .tm_sec=40};
t.tm_sec += 30;
mktime(&t);
// t.tm_hour is now  1
// t.tm_min  is now  0
// t.tm_sec  is now 10

Я делаю это на STM32 с 32 КБ флэш-памяти, и двоичный файл становится очень большим.mktime(3) и другие вещи, которые он загружает, занимают 16 КБ флэш-памяти - половина доступного пространства.

Есть ли в newlib функция, которая конкретно отвечает за нормализацию struct tm?Я понимаю, что такая привязка к закрытой функции сделает код менее переносимым.

1 Ответ

1 голос
/ 29 мая 2019

В newlib/libc/time/mktime.c есть функция validate_structure(), которая выполняет часть работы, нормализует месяц, день месяца, час, минуты, секунды, но оставляет день недели и день года один.

Он объявлен static, поэтому вы не можете просто вызвать его, но можете скопировать функцию из источников. (Там могут быть проблемы с лицензированием, хотя). Или вы можете просто переопределить это, это довольно просто.

tm_wday и tm_yday вычисляются позже в mktime(), поэтому вам потребуется весь беспорядок, включая материал часового пояса, чтобы эти два нормализовались.

Большая часть кода в 16 КБ связана с вызовом siscanf(), вариантом sscanf() без поддержки с плавающей запятой, который (я считаю) используется для анализа информации о часовом поясе и летнем времени в переменных среды.

Вы можете вырезать много ненужного кода, используя при подключении --specs=nano.specs, который переключится на упрощенный код printf / scanf, сэкономив в вашем случае около 10 КБ кода.

...