Что лучший ресурс должен узнать, что Ассемблер для микроконтроллера PIC [закрылся]

Это в основном делает реверс проверки, если текущее время соответствует условиям. так что-то как:

//Totaly made up language
next = getTimeNow();
next.addMinutes(1) //so that next is never now
done = false;
while (!done) {
  if (cron.minute != '*' && next.minute != cron.minute) {
    if (next.minute > cron.minute) {
      next.addHours(1);
    }
    next.minute = cron.minute;
  }
  if (cron.hour != '*' && next.hour != cron.hour) {
    if (next.hour > cron.hour) {
      next.hour = cron.hour;
      next.addDays(1);
      next.minute = 0;
      continue;
    }
    next.hour = cron.hour;
    next.minute = 0;
    continue;
  }
  if (cron.weekday != '*' && next.weekday != cron.weekday) {
    deltaDays = cron.weekday - next.weekday //assume weekday is 0=sun, 1 ... 6=sat
    if (deltaDays < 0) { deltaDays+=7; }
    next.addDays(deltaDays);
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  if (cron.day != '*' && next.day != cron.day) {
    if (next.day > cron.day || !next.month.hasDay(cron.day)) {
      next.addMonths(1);
      next.day = 1; //assume days 1..31
      next.hour = 0;
      next.minute = 0;
      continue;
    }
    next.day = cron.day
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  if (cron.month != '*' && next.month != cron.month) {
    if (next.month > cron.month) {
      next.addMonths(12-next.month+cron.month)
      next.day = 1; //assume days 1..31
      next.hour = 0;
      next.minute = 0;
      continue;
    }
    next.month = cron.month;
    next.day = 1;
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  done = true;
}

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

//Shorter more loopy version
next = getTimeNow().addMinutes(1);
while (true) {
  if (cron.month != '*' && next.month != cron.month) {
    next.addMonths(1);
    next.day = 1;
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  if (cron.day != '*' && next.day != cron.day) {
    next.addDays(1);
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  if (cron.weekday != '*' && next.weekday != cron.weekday) {
    next.addDays(1);
    next.hour = 0;
    next.minute = 0;
    continue;
  }
  if (cron.hour != '*' && next.hour != cron.hour) {
    next.addHours(1);
    next.minute = 0;
    continue;
  }
  if (cron.minute != '*' && next.minute != cron.minute) {
    next.addMinutes(1);
    continue;
  }
  break;
}
7
задан starblue 14 November 2009 в 09:16
поделиться

3 ответа

Я бы попробовал следующее: Pic Tutorial

2
ответ дан 7 December 2019 в 03:18
поделиться

Существует больше одной архитектуры PIC со значительно разными наборами команд. Microchip не обладает архитектурной целостностью, например, Atmel AVR. Поэтому вам нужно указать, что вы используете - например, PIC12, 16, 24, 32.

Итак, прежде всего я бы посоветовал избегать ассемблера PIC на том основании, что то, что вы изучаете, скажем, PIC12, может быть не очень применимо к PIC24. Во-вторых, я бы вообще избегал использования PIC, если бы мог, как разработчик программного обеспечения - хотя я признаю, что есть и другие соображения, и у вас может не быть выбора.

У вас может быть выбор, так это не использовать ассемблер. Хотя PIC нижнего уровня, возможно, не лучше всего подходят для генерации кода C, это проблема разработчика компилятора; По-прежнему более экономично с точки зрения времени разработки использовать C там, где это возможно. С другой стороны, для продуктов большого объема, если вы можете уместить код в меньшую часть с помощью ассемблера, это может быть фактором. Решение, что вам нужен ассемблер до того, как вы протестируете решение C, часто является «преждевременной оптимизацией». Даже если реализация C не соответствует ограничениям по размеру или времени, вы можете просто назвать его прототипом и перекодировать в соответствии с ограничениями. Выполнение этого может быть быстрее, чем начинать кодирование ассемблера с нуля и одновременно бороться как с дизайном, так и с набором инструкций. Скажите своему боссу, что вы создадите прототип на языке C, и тогда, когда он будет соответствовать требованиям, никто не захочет тратить деньги на перекодирование, это просто непереносимый, неподдерживаемый код ассемблера.

Наконец, чтобы ответить на ваш вопрос, предполагая, что вам нужно Чтобы выполнять работу быстро и эффективно, как можно больше используйте примеры и заметки по приложениям Microchip, а также ознакомьтесь с набором инструкций из справочника по набору инструкций производителя. Набор инструкций для младших деталей небольшой. Для повседневной работы мне нравится использовать «Справочную карточку набора инструкций» в качестве памятной записки - она ​​суммирует все существенные детали каждой инструкции, обычно на нескольких страницах - распечатайте ее на двух сторонах и ламинируйте! ;). Вот пример PIC16

5
ответ дан 7 December 2019 в 03:18
поделиться

Я сторонник написания дизассемблера. Начните с очень простой одно- или двухстрочной программы, которая, возможно, загружает регистр с константой (нужно прочитать руководство или что-то еще, чтобы изучить этот шаг). Собери это. Сохраните двоичный файл в формате, который вы можете или хотите написать программу для чтения (возможно, Intel hex или elf, если они это поддерживают).

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

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

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

Я использовал этот процесс много раз и выучил множество наборов инструкций, ymmv. После первой пары-тройки описанный выше процесс может занять всего полдня.

EDIT:

Цель здесь - образование, а не следующий великий проект sourceforge. Вывод может быть настолько уродливым или неполным, насколько вам нравится, вы единственный, кто его прочтет.

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

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

0
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

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