Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Скорость работы операторов Bascom


Скорость работы операторов Bascom

Сообщений 31 страница 43 из 43

31

Dim A as bit
If A = 1 then A = 0    6 тактов

Dim A as byte
If A = 1 then A = 0    7 тактов

И сколько занимает установка значения PMM?
CompareXX = "Word"    9 тактов (см. #2)

Сколько доступ к бит в байт.
F = B.5       13 тактов

0

32

А как тогда биты принимать? Ложить их в байт массив или в string? Ведь если после байт из них собирать это потребует больше врмени чем сразу бит в байт массив писать?

0

33

RadioHAM-433 написал(а):

А как тогда биты принимать?

Этот вопрос не для этой темы... ;)

Смотря чего хотите добиться.
Создайте тему здесь Вопросы - ответы и будем думать... ;)

0

34

Операторы сравнения If...Then и Select...Case (в дополнение к #14)
=================================================
Во всех случаях, независимо от типа переменной, В = 5
Во всех случаях использован "пустой" Gosub...Return

Для B As Byte

If B = 5 Then Gosub ...              5 тактов
If B <> 6 Then Gosub ...            5 тактов
If B > 5 Then Gosub ...              7 тактов
If B < 5 Then Gosub ...              7 тактов

If B = 5 Then Gosub ...
If B <> 6 Then Gosub ...           11 тактов

If B = 5 Then Gosub ...
If B < 5 Then Gosub ...              11 тактов

If B = 5 Then Gosub ...
If B > 5 Then Gosub ...              13 тактов

If B = 5 Then Gosub ...
If B <> 6 Then Gosub ...
If B < 5 Then Gosub ...              17 тактов

If B = 5 Then Gosub ...
If B <> 6 Then Gosub ...
If B > 5 Then Gosub ...              19 тактов

Каждое последующая строка сравнения дает приращение в 6 или 7 тактов, в зависимости от вида сравнения:
If B = 5 Then Gosub ...
If B <> 6 Then Gosub ...
If B < 5 Then Gosub ...
If B < 4 Then Gosub ...              +6 тактов

If B = 5 Then Gosub ...
If B <> 6 Then Gosub ...
If B < 5 Then Gosub ...
If B > 6 Then Gosub ...              +7 тактов

... и для разнообразия: ;)
Для B As Integer
If B = 5 Then Gosub ...               11 тактов

Для B As Long
If B = 5 Then Gosub ...               27 тактов

Для B As Single
If B = 5 Then Gosub ...             115 тактов

Для B As Double
If B = 5 Then Gosub ...             115 тактов

Варианты с несколькими строками сравнения не приведены, но время выполнения увеличивается в примерно таком же соотношении.
=================================================
Для B As Byte

Select Case B
      Case 5 : Gosub ...                 результат - True
End Select                                  5 тактов

Select Case B
      Case 4 : Gosub ...                 результат - False
End Select                                  2 такта

Каждый последующий результат True дает приращение в 5 тактов, а False - в 2 такта, например:
Select Case B
      Case 5 : Gosub ...                 результат - True       5 тактов
      Case 4 : Gosub ...                 результат - False      2 такта
      Case 3 : Gosub ...                 результат - False      2 такта
End Select

Для B As Integer
Select Case B
      Case 5 : Gosub ...
End Select                                 11 тактов

Для B As Long
Select Case B
      Case 5 : Gosub ...
End Select                                 27 тактов

Для B As Single
Select Case B
      Case 5 : Gosub ...
End Select                               115 тактов

Для B As Double
Select Case B
      Case 5 : Gosub ...
End Select                               115 тактов

Тут картина примерно такая же, как и с If...Then ... ;)
=================================================

Вывод: цепочка из нескольких Select...Case обрабатывается несколько быстрее, чем If...Then.

=================================================
PS. На очереди подобное исследование с переменными типа String

Отредактировано Nord (2021-09-13 20:19:30)

+3

35

Операторы сравнения If...Then и Select...Case для переменных типа String
=================================================
Во всех случаях, независимо от типа переменной, Dim S As String * 4
Во всех случаях использован "пустой" Gosub...Return

If S = "1" Then Gosub...               71 такт
If S <> "1" Then Gosub...             73 такта
If S > "1" Then Gosub...               75 тактов
If S < "1" Then Gosub...               73 такта

If S = "12" Then Gosub...             95 тактов
If S <> "12" Then Gosub...           97 тактов
If S > "12" Then Gosub...             99 тактов
If S < "12" Then Gosub...             97 тактов

На каждый последующий символ в переменной ("123", "1234" и т.д.) добавляется 24 такта.
Дальше даже копаться не стал - тенденция очевидна. ;)

=================================================

Select Case S                              результат - True
      Case "1" : Gosub...                71 такт
End Select

Select Case S                              результат - False
      Case "2" : Gosub...                47 тактов
End Select

Select Case S                              результат - True
      Case "12" : Gosub...              95 тактов
End Select

Select Case S                              результат - False
      Case "21" : Gosub...              65 тактов
End Select

На каждый последующий символ в переменной ("123", "1234" и т.д.) при результате True добавляется 24 такта.

Что занятно, но при увеличении количества символов более 2-х при результате False выполнение ускоряется - используется уже 47 тактов, а не 65.
Изначально подумал, это связано с тем, что использовались разные очередности символов - "12" и "21" и при различии уже в первом символе результат сравнения будет False, но пробы показали, что "12" или "123" ситуацию не меняют.

Отредактировано Nord (2021-09-13 20:06:54)

+2

36

Основные логические операции AND, NOT, OR, XOR

C = A AND B
Для переменных типа Byte              10 тактов
Для переменных типа Integer          21 такт
Для переменных типа Long              42 такта
Для переменных типа Single            операция не выполняется, Error : 392
Для переменных типа Double           операция не выполняется, Error : 392

C = NOT A
Для переменных типа Byte              10 тактов
Для переменных типа Integer          28 тактов
Для переменных типа Long              44 такта
Для переменных типа Single            операция не выполняется, Error : 31
Для переменных типа Double           операция не выполняется, Error : 31

C = A OR B
Для переменных типа Byte              10 тактов
Для переменных типа Integer          21 такт
Для переменных типа Long              42 такта
Для переменных типа Single            операция не выполняется, Error : 392
Для переменных типа Double           операция не выполняется, Error : 392

C = A XOR B
Для переменных типа Byte              10 тактов
Для переменных типа Integer          21 такт
Для переменных типа Long              42 такта
Для переменных типа Single            операция не выполняется, Error : 392
Для переменных типа Double           операция не выполняется, Error : 392

Отредактировано Nord (2021-09-13 21:08:38)

+3

37

Возникла необходимость подсчета CRC для 1-Wire устройств...
Решил проверить в свете данной темы...

B = Crc8(A(1) , 7)          575 тактов
:canthearyou:

CRC16 даже пробовать страшно... ;)

0

38

Не бойтесь! Всё зависит от Задачи. Где-то и Wait 30 -- нормально :)

0

39

Александр Д. написал(а):

Не бойтесь! Всё зависит от Задачи.

Неоспоримо. ;)
Понятно, что при расчете CRC "затратная арифметика", просто ожидалось хотя бы раза в три быстрее. ;)

0

40

Nord написал(а):

Каждый последующий результат True дает приращение в 5 тактов, а False - в 2 такта, например:

Без прироста тактов

+1

41

Nord написал(а):

Возникла необходимость подсчета CRC для 1-Wire устройств...
Решил проверить в свете данной темы...
B = Crc8(A(1) , 7)          575 тактов

Есть МК с аппаратным подсчетом CRC. Должно быть быстрее.

+1

42

Вот стандартный алгоритм CRC8. Он на Паскале, но думаю перевести на Бейсик нетрудно. Попробуйте, может быстрее будет.

Код:
//------------------ Подсчет CRC8 ------------------
function Crc8: Byte;
var
  m,j,k,x,Crc: Byte;
begin
Crc:=0;
For m:=1 To 7 do begin
 x:=D[m];
  For k:=0 To 7 do begin
   j:=1 And (x Xor crc);
   crc:=Trunc(crc / 2) And $FF;
   x:=Trunc(x / 2) And $FF;
   If j <> 0 Then crc:=crc Xor $8C;
  end;
end;
Crc8:=Crc;
end;

+1

43

Спасибо всем откликнувшимся ! ;)
Возьму на заметку сказанное, ускориться никогда не лишне.

0


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Скорость работы операторов Bascom