Дополнительная программа с ограничением по размеру

Я пытаюсь написать код на C (используя Keil µVision 5, устройство: AT89C51AC3), который позволяет мне вводить 2 целых числа, добавлять их, а затем распечатывать. Проблема в том, что я ограничен размером байтового кода макс. 2048.

Моему фактическому коду для запуска требуется 2099 байт.

Любая идея, как я мог бы сделать то же самое, используя меньше памяти?

#include <stdio.h>
#include <REG52.H> 

int main()
{
   int a, b;


    /*------------------------------------------------
    Setup the serial port for 1200 baud at 16MHz.
    ------------------------------------------------*/
    #ifndef MONITOR51
        SCON  = 0x50;               /* SCON: mode 1, 8-bit UART, enable rcvr      */
        TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
        TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
        TR1   = 1;                  /* TR1:  timer 1 run                          */
        TI    = 1;                  /* TI:   set TI to send first char of UART    */
    #endif

   printf("Enter 2 numbers\n");
   scanf("%d%d",&a,&b);

   printf("%d\n",a+b);

   return 0;
}

person xMarcoGP    schedule 23.01.2017    source источник
comment
Какая у вас целевая платформа? Какие у вас есть устройства ввода? Что такое устройство вывода? Можете ли вы читать напрямую с устройства ввода, не используя стандартную функцию C scanf? Можете ли вы выводить напрямую на устройство вывода таким же образом?   -  person Some programmer dude    schedule 23.01.2017
comment
Может быть, не использовать scanf и printf?   -  person Jabberwocky    schedule 23.01.2017
comment
@xMarcoGP: стандартные функции printf и scanf очень гибкие и универсальные, поэтому требуют больших ресурсов. Попробуйте заменить их написанными от руки голыми функциями целочисленного преобразования и печати.   -  person doynax    schedule 23.01.2017
comment
Так что вам нужно сжать код. Кандидатом является замена scanf собственным кодом для простого разбора двух чисел.   -  person Paul Ogilvie    schedule 23.01.2017
comment
@ Какой-то программист, чувак: судя по всему, какой-то вариант 8051 с UART для stdio. Будем надеяться, что функции getchar/putchar по умолчанию направляются туда по крайней мере.   -  person doynax    schedule 23.01.2017
comment
Я использую Keil µVision 5, мое устройство AT89C51AC3, есть идеи? Я не специалист, какие есть альтернативы? Мне нужно ввести цифры в консоль, и вывести их на экран с помощью UART   -  person xMarcoGP    schedule 23.01.2017
comment
@xMarcoGP: Ну, на ум приходит покупка лицензии на компилятор. Или переключиться на IAR, где ограничение на размер демонстрационной программы составляет 4k. Или вручную оптимизировать код.   -  person doynax    schedule 23.01.2017
comment
@doynax Я понял, мне нужно оптимизировать код. Вопрос в том, как.   -  person xMarcoGP    schedule 23.01.2017
comment
Проблема не в компиляторе, а в использовании stdio.h. Кроме того, зачем кому-то использовать 8051 в 2017 году?   -  person Lundin    schedule 23.01.2017
comment
@Лундин: мазоцизм. Кроме того, к сожалению, многие поставщики кремниевых микросхем все еще выпускают их вместе со старым оборудованием для обслуживания :(   -  person doynax    schedule 23.01.2017
comment
@Lundin Вероятно, потому, что его легко программировать, и поэтому он используется в школах для обучения основам программирования на ассемблере, аппаратно-ориентированного программирования и основам работы компьютеров под капотом.   -  person Some programmer dude    schedule 23.01.2017
comment
@ Какой-то программист, чувак: позволю себе не согласиться. Архитектура 8051 глубоко византийская и особенная почти во всех отношениях. Написание эффективного C и даже ассемблера для нетривиальных приложений с использованием этих зверей — настоящий беспорядок. Поверь мне, я был там :(   -  person doynax    schedule 23.01.2017
comment
@Someprogrammerdude точно, это моя ситуация. Я должен использовать этот 8051, и я искренне понятия не имею, как я мог бы оптимизировать код ... все равно спасибо за помощь и предложения.   -  person xMarcoGP    schedule 23.01.2017
comment
@Someprogrammerdude 8-битные микроконтроллеры в целом и 8051 в частности довольно сложно программировать на C. По крайней мере, если вы посмотрите на сгенерированный дизассемблированный код. Современный ARM Cortex M намного проще в использовании.   -  person Lundin    schedule 23.01.2017


Ответы (2)


Вы должны икать, когда видите, что этот простой код занимает 2k+ памяти. Это много! Причина этого в том, что функции stdio ужасно неэффективны.

Если вам нужно сэкономить память и скорость выполнения, вам нужно закодировать их самостоятельно. Это не так сложно, поскольку вам, вероятно, нужно просто читать целые числа, а не все остальное, что может обработать эта функция (числа с плавающей запятой, строки и т. д.).

Также избавьтесь от типа int, вместо этого используйте типы фиксированного размера из stdint.h. (Если это 8-битный MCU, вам также следует избегать 16-битных чисел, если они не необходимы.)

Кроме того, вам также придется кодировать часть ввода/вывода. На микроконтроллере это, вероятно, означало бы написание собственного драйвера UART.

Вы должны иметь возможность уменьшить размер кода до пары сотен байтов, в зависимости от того, насколько (не)эффективен код вашего микроконтроллера.

person Lundin    schedule 23.01.2017

Если вы просто хотите напечатать сумму int a и int b, вы сможете избавиться от

/------------------------------------------------------------- -- Настройте последовательный порт на 1200 бод на частоте 16 МГц. ----------------------------------/ #ifndef MONITOR51 SCON = 0x50; /* SCON: режим 1, 8-битный UART, включить rcvr / TMOD |= 0x20; // TMOD: таймер 1, режим 2, 8-битная перезагрузка / TH1 = 221; / TH1: значение перезагрузки для скорости 1200 бод при 16 МГц / TR1 = 1; //em> TR1: запуск таймера 1 / TI = 1; / TI: установите TI для отправки первого символа UART */ #endif: `

код. Просто сохраните функции printf()... и scarf()....

person Jordan    schedule 24.01.2017
comment
И как именно printf/scanf будет работать без инициализированного UART? Это микроконтроллер. - person Lundin; 24.01.2017