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

Исходя из ожидаемого результата, его можно создать, создав другую группу с логическим вектором, созданным по 'svalue'

library(data.table)
setDT(dfx)[svalue != 0, svalue := seq_len(.N), .(cumsum(svalue == 1), YEAR, MONTH)]
dfx
#   YEAR MONTH DAY  PCP SPELL svalue
#1: 1950    12  28  0.0   DRY      1
#2: 1950    12  29 11.7   WET      0
#3: 1950    12  30  0.0   DRY      1
#4: 1950    12  31  0.0   DRY      2
#5: 1951     1   1  0.0   DRY      1
#6: 1951     1   2  0.0   DRY      2
#7: 1951     1   3 20.3   WET      0

Или с помощью run-length-id из 'SPELL' [ 116]

setDT(dfx)[, svalue := seq_len(.N) * (svalue != 0), .(rleid(SPELL), YEAR, MONTH)]

данные

dfx <- structure(list(YEAR = c(1950L, 1950L, 1950L, 1950L, 1951L, 1951L, 
 1951L), MONTH = c(12L, 12L, 12L, 12L, 1L, 1L, 1L), DAY = c(28L, 
 29L, 30L, 31L, 1L, 2L, 3L), PCP = c(0, 11.7, 0, 0, 0, 0, 20.3
 ), SPELL = c("DRY", "WET", "DRY", "DRY", "DRY", "DRY", "WET"), 
  svalue = c(1L, 0L, 1L, 2L, 3L, 4L, 0L)), class = "data.frame",
 row.names = c(NA, -7L))
6
задан Paul 2 December 2008 в 21:35
поделиться

7 ответов

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

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

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

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

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

10
ответ дан 8 December 2019 в 02:41
поделиться

Извините я приезжаю в это поздно, но у меня когда-то была точно та же проблема, и это стало повторной проблемой, которая продолжала возвращаться мне. В моем случае проект был телефоном на 8 051 процессоре семейства, и я полностью истратил ROM (код) память. Это продолжало возвращаться мне, потому что управление продолжало запрашивать новые возможности, таким образом, каждая новая возможность стала двумя процессами шага. 1) Оптимизируйте старый материал для создания места, 2) Реализуют новую опцию, израсходовав комнату, которую я просто сделал.

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

Что-то я помню работавший за меня и мог работать на Вас;

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

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

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

7
ответ дан 8 December 2019 в 02:41
поделиться

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

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

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

4
ответ дан 8 December 2019 в 02:41
поделиться

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

Примечание: IANA8051P (я не 8 501 программист, но я сделал большой блок на других микросхемах на 8 битов).

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

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

Другой аккуратный прием - то, если Вы вызываете функцию перед возвратом, просто переходите к нему, например, вместо:

CALL otherfunc
RET

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

JMP otherfunc

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

Это - все, о чем я могу думать первое, что пришло на ум в настоящий момент.

7
ответ дан 8 December 2019 в 02:41
поделиться

1) Где возможно сохраните свои переменные в Idata не в xdata
2) Посмотрите на свои операторы Jmp – используют SJmp и AJmp

2
ответ дан 8 December 2019 в 02:41
поделиться

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

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

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

    1 -

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

или возможно существует аргумент в пользу версии оборудования 2.0 на таблице теперь... :)

с уважением

2
ответ дан 8 December 2019 в 02:41
поделиться

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

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

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

2
ответ дан 8 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: