Какие методы доступны для оптимизации памяти на языке ассемблера 8051?

StackOverflow https://stackoverflow.com/questions/335540

Вопрос

Мне нужно оптимизировать код, чтобы освободить место для какого-то нового кода.У меня нет места для всех изменений.Я не могу использовать переключение банка кодов (80c31 с 64k).

Это было полезно?

Решение

На самом деле вы не так уж много дали для продолжения, но есть два основных уровня оптимизации, которые вы можете рассмотреть:

Микрооптимизации: например.XOR A вместо MOV A, 0 Адам подробно описал некоторые из них ранее.

Макрооптимизация: Посмотрите на структуру вашей программы, используемые структуры данных и алгоритмы, выполняемые задачи и хорошенько подумайте о том, как все это можно было бы изменить или даже удалить.Существуют ли целые фрагменты кода, которые на самом деле не используются?Ваш код полон отладочных выходных инструкций, которые пользователь никогда не видит?Существуют ли функции, специфичные для одного клиента, которые вы могли бы исключить из общего выпуска?

Чтобы разобраться с этим, вам нужно определить, ГДЕ используется ваша память.Карта компоновщика - хорошее место, чтобы начать с этого.Макрооптимизация - это то, где можно добиться БОЛЬШИХ успехов.

В качестве отступления, вы могли бы - серьезно - попробовать переписать части своего кода с помощью хорошего оптимизирующего компилятора C.Вы можете быть поражены тем, насколько жестким может быть код.Настоящий специалист по ассемблеру, возможно, сможет улучшить его, но он легко может быть лучше большинства программистов.Я использовал IAR один из них был около 20 лет назад, и он сбил меня с толку.

Другие советы

С языком ассемблера вам придется оптимизировать вручную. Вот несколько методов:

Примечание: IANA8051P (я не программист 8501, но я много собирал на других 8-битных чипах).

Просмотрите код и найдите дублирующиеся биты, независимо от их размера, и сделайте так, чтобы они функционировали.

Изучите некоторые из более необычных инструкций и посмотрите, можете ли вы использовать их для оптимизации, например. Хорошая хитрость состоит в том, чтобы использовать XOR A для очистки аккумулятора вместо MOV A, 0 - он сохраняет байт.

Еще один полезный трюк: если вы вызываете функцию перед возвратом, просто перейдите к ней, например, вместо:

CALL otherfunc
RET

Просто сделай:

JMP otherfunc

Всегда убедитесь, что вы делаете относительные переходы и переходы везде, где это возможно, они используют меньше памяти, чем абсолютные переходы.

Это все, что я могу думать о макушке на данный момент.

Извините, я опаздываю, но однажды у меня была точно такая же проблема, и это стало повторяющейся проблемой, которая продолжала возвращаться ко мне. В моем случае это был телефон на процессоре семейства 8051, и я полностью исчерпал ПЗУ (код). Он возвращался ко мне, потому что руководство продолжало запрашивать новые функции, поэтому каждая новая функция становилась двухэтапной. 1) Оптимизируйте старые вещи, чтобы освободить место. 2) Внедрите новую функцию, используя только что созданную мной комнату.

Существует два подхода к оптимизации. Тактический и Стратегический. Тактическая оптимизация экономит несколько байтов за раз с идеей микрооптимизации. Я думаю, что вам нужна стратегическая оптимизация, которая предполагает более радикальное переосмысление того, как вы делаете вещи.

Что-то, что я помню, сработало для меня и могло бы сработать для вас;

Посмотрите на суть того, что должен делать ваш код, и попытайтесь выявить некоторые действительно сильные гибкие примитивные операции. Затем перестройте код верхнего уровня, чтобы он вообще ничего не делал, кроме вызова примитивов. В идеале используйте подход, основанный на таблицах, ваша таблица содержит такие вещи, как; Состояние ввода, событие, состояние вывода, примитивы ... Другими словами, когда происходит событие, ищите ячейку в таблице для этого события в текущем состоянии. Эта ячейка сообщает вам, какое новое состояние нужно изменить (необязательно) и какие примитивы (если есть) выполнить. Вам может понадобиться несколько наборов состояний / событий / таблиц / примитивов для разных слоев / подсистем.

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

Извините, я опоздал на месяцы, и у вас, вероятно, не было времени сделать что-то столь радикальное. Насколько я знаю, вы уже использовали подобный подход! Но мой ответ может когда-нибудь помочь кому-то, кто знает.

В отделенном отделе вы также можете рассмотреть возможность сжатия части вашего кода и сохранения только той части, которая активно используется, распакованной в любой конкретный момент времени. Мне трудно поверить, что код, требуемый для системы сжатия / распаковки, будет достаточно малой частью крошечной памяти 8051, чтобы сделать это стоящим, но он сотворил чудеса на немного больших системах.

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

Наконец, если код действительно скомпилирован в C, я бы предложил компилировать с различными вариантами, чтобы увидеть, что произойдет. Кроме того, я написал статью о компактном кодировании C для ESC еще в 2001 году это все еще довольно актуально. Смотрите этот текст для других хитростей для небольших машин.

1) По возможности сохраняйте переменные в Idata, а не в xdata
2) Посмотрите на свои высказывания Jmp & # 8211; использовать SJmp и AJmp

Я предполагаю, вы знаете, что это не подойдет, потому что вы написали / выполнили и получили ошибку "не хватает памяти".:) Похоже, ответы довольно точно отвечают на ваш вопрос;если не считать получения примеров кода.

Я бы, однако, порекомендовал несколько дополнительных соображений;

  1. Убедитесь, что весь код в самом деле используется - тест покрытия кода? Неиспользуемый саб - это большая победа - это сложный шаг - если вы оригинальный автор, это может быть проще - (ну, может быть) :)
  2. Обеспечьте уровень "проверки" и инициализации - иногда мы склонны проявлять чрезмерное усердие при обеспечении инициализации переменных / памяти и, конечно же, это правильно, сколько раз мы был укушен им.Не говорю, что не нужно инициализировать (да), но если мы выполняем перемещение в памяти, пункт назначения этого не делает потребность быть обнуленным первым - это согласуется с

    1 --

  3. Оцените новые функции - можно ли улучшить существующий подраздел, чтобы охватить обе функции, или, возможно, заменить существующую функцию?
  4. Разбейте большой код, если часть большого кода может спасти создание новый небольшой код.

или , возможно , сейчас на столе есть аргумент в пользу аппаратной версии 2.0 ...:)

с уважением

Помимо уже упомянутых (более или менее) очевидных оптимизаций, здесь есть действительно странная (и практически невозможная) оптимизация: повторное использование кода. И с повторным использованием кода я имею в виду не обычное повторное использование, а а) повторное использование вашего кода в качестве данных или б) повторное использование вашего кода в качестве другого кода. Возможно, вы можете создать лютню (или любые другие статические данные), которые они могут быть представлены шестнадцатеричными кодами операций asm (здесь вы должны посмотреть на архитектуру гарвард против фон Неймана).

Другой будет повторно использовать код, придавая коду другое значение, когда вы обращаетесь к нему по-другому. Вот пример, чтобы прояснить, что я имею в виду. Если байты для вашего кода выглядят так: AABCCCDDEEFFGGHH по адресу X, где каждая буква обозначает один код операции, представьте, что вы теперь перейдете к X + 1. Может быть, вы получите совершенно другую функциональность, когда теперь разделенные байтами символы образуют новые коды операций: ABC CCD DE EF GH.

Но будьте осторожны: это не только сложно (возможно, даже невозможно), но и ужасать. Поэтому, если вы не демонстрационный код (или что-то похожее на экзотику), я бы порекомендовал использовать уже упоминавшиеся способы сохранения памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top