Кому в микроконтроллере жить хорошо?

в 21:03, , рубрики: avr, IAR, modbus, stm32, weintek, программирование микроконтроллеров, Производство и разработка электроники, Промышленное программирование, Разработка под Arduino

Кому в микроконтроллере жить хорошо? - 1
В каком году — рассчитывай, в какой земле — угадывай, задачился вопросами. Насколько ARM быстрее AVR? Какая разновидность протокола Modbus более «быстрая»? ASCII или RTU?

Под «быстротой», в данном случае, будем понимать количество машинных циклов процессора необходимых для исполнения всех действий протокола.
Исследование быстродействия будем проводить на, широко известной в узких кругах, библиотеке ModBus Slave RTU/ASCII, портированной на микроконтроллеры ATMega48 и STM32L052. Вывод информации будем осуществлять по протоколу Modbus в эмулятор панели Weintek. Тестирование будем производить на демонстрационном примере. Помимо результатов теста на панель выводятся состояния регистров Modbus: дискретных входов, дискретных выходов, регистров для чтения и регистров для чтения/записи. Также средствами панели производится подсчет количества ошибок обмена данными с микроконтроллером. Внешний вид тестового окна приведен на рисунке.

Кому в микроконтроллере жить хорошо? - 2

Оценку быстродействия будем проводить измеряя время выполнения функции обработки сообщений протокола. Измерение времени выполнения будем проводить рабоче-крестьянским способом. Перед запуском функции обнуляем аппаратный таймер, частота счета которого равна тактовой частоте микроконтроллера, после выполнения функции считываем значения таймера и проводим обработку результатов измерений. Вычисляем минимальное, максимальное и среднее значение времени выполнения функции обработки сообщений протокола Modbus.

while(1)
    {
    TIM6->CNT=0;
    ModBusRTU();
    //ModBusASCII();
    tcurent=TIM6->CNT;
    if(tcurent<tmin)tmin=tcurent;
    if(tcurent>tmax)tmax=tcurent;
    avg32=avg32-(avg32>>16)+tcurent;
    tavg=avg32>>alfa;
    ...

Результаты исследований, сведены в таблицу. Исследование проводились при различных опциях библиотеки:

  • ModBusUseTableCRC — Использовать расчет CRC по таблице;
  • ModBusUseErrMes — Использовать сообщения о логических ошибках протокола;

А также при различных стратегиях оптимизации компилятора.
Библиотека ModBus Slave RTU/ASCII поддерживает, в некоторых случаях, важную функцию — пауза между получением запроса от Modbus Master и ответом Modbus Slave. Исследование проводились при значениях паузы 2 милисекунды и 0 (то есть без паузы), эти значения указаны в графе таблицы «Пауза П/П». В графе «Размер» указан размер модуля, который включает в себя обе функции обработки сообщений Modbus (ModBusRTU(), ModBusASCII()).

Кому в микроконтроллере жить хорошо? - 3

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

Глубоко задумавшись над результатами исследований, можно сделать следующие выводы:

  1. AVR не такой уж медленный!!! В среднем он в полтора раза медленнее ARM при той же тактовой частоте. А в случае оптимизации по размеру (например варианты 13 и 15) практически приближается к ARM.
  2. Протокол ASCII, по сравнению c RTU, не только более медленный по скорости передачи, но и занимает гораздо больше ресурсов микроконтроллера.
  3. Использование сообщений о логических ошибках протокола, никак не влияет на быстродействие.
  4. Табличный метод вычисления CRC позволяет более чем в полтора раза снизить использование вычислительных ресурсов микроконтроллера.
  5. Использование паузы между приемом запроса и передачей ответа, позволяет не только избежать конфликтов на шине RS-485, но и уменьшить блокирующие действие функции обработки сообщений протокола Modbus.

Какие выводы еще можно сделать?

Проект на GitHub


Скачать одним файлом

Автор: IBAH_II

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js