Перейти к содержанию
    

суммирование в прерывании

1 час назад, SergeyVas сказал:

Нужно в основном цикле программы обнулять переменную

Это не будет работать — с локальной переменной нужно работать только в её среде, т.е. в прерывании и нигде более, т.е. в основном цикле выставлять флаг сброса, в прерывании по нему сбрасывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

interruptcounter = __USAT(interruptcounter + 1, 8);

Скомпилится всего в 4 команды (вместе с чтение/записью в память) и без ветвления.

Или:


uint i = interruptcounter + 1;
interruptcounter = i - (i >> 8);

те же 4 команды.

 

:biggrin::biggrin::biggrin:

Интересный результат получается переменная типа char

Quote

result :0
result :1
result :2
result :3
result :4
result :5
result :6
result :7
result :8
result :9
result :10
result :11
result :12
result :13
result :14
result :15
result :16
result :17
result :18
result :19
result :20
result :21
result :22
result :23
result :24
result :25
result :26
result :27
result :28
result :29
result :30
result :31
result :32
result :33
result :34
result :35
result :36
result :37
result :38
result :39
result :40
result :41
result :42
result :43
result :44
result :45
result :46
result :47
result :48
result :49
result :50
result :51
result :52
result :53
result :54
result :55
result :56
result :57
result :58
result :59
result :60
result :61
result :62
result :63
result :64
result :65
result :66
result :67
result :68
result :69
result :70
result :71
result :72
result :73
result :74
result :75
result :76
result :77
result :78
result :79
result :80
result :81
result :82
result :83
result :84
result :85
result :86
result :87
result :88
result :89
result :90
result :91
result :92
result :93
result :94
result :95
result :96
result :97
result :98
result :99
result :100
result :101
result :102
result :103
result :104
result :105
result :106
result :107
result :108
result :109
result :110
result :111
result :112
result :113
result :114
result :115
result :116
result :117
result :118
result :119
result :120
result :121
result :122
result :123
result :124
result :125
result :126
result :127
result :-127
result :-125
result :-123
result :-121
result :-119
result :-117
result :-115
result :-113
result :-111
result :-109
result :-107
result :-105
result :-103
result :-101
result :-99
result :-97
result :-95
result :-93
result :-91
result :-89
result :-87
result :-85
result :-83
result :-81
result :-79
result :-77
result :-75
result :-73
result :-71
result :-69
result :-67
result :-65
result :-63
result :-61
result :-59
result :-57
result :-55
result :-53
result :-51
result :-49
result :-47
result :-45
result :-43
result :-41
result :-39
result :-37
result :-35
result :-33
result :-31
result :-29
result :-27
result :-25
result :-23
result :-21
result :-19
result :-17
result :-15
result :-13
result :-11
result :-9
result :-7
result :-5
result :-3
result :-1
result :0
result :1

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, SergeyVas сказал:

Интересный результат получается переменная типа char

И что?

Значит char у вас знаковый размером 8 бит. И что?

 

PS: Такие бессмысленные портянки сюда лучше не постить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, SergeyVas сказал:

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

Если знаковый char у вас размером == 8бит, то никогда не получите 255. Не понятно о чём разговор тогда вообще.  :unknw:

Поставьте беззнаковый тип: u8 или uint8_t - как оно там у вас называется.  Или unsigned char.

А вообще такие вещи оптимизируют глядя в ассемблерный выхлоп. А лучше вообще - на асме и пишут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую на асме вставку сделать. Только систему команд для st7 не знаю.  Фактически нужен счетчик до 255 с минимальным временем выполнения. что бы после 255 останавливался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uint8_t volatile counter;

void isr()
{
  uint8_t Tmp = counter + 1;
  if(Tmp)
    counter = Tmp;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, SergeyVas сказал:

Попробую на асме вставку сделать. Только систему команд для st7 не знаю.  Фактически нужен счетчик до 255 с минимальным временем выполнения. что бы после 255 останавливался.

Из тех вариантов что я предлагал, возьмите 2-й, скомпилите и посмотрите как выглядит ассемблерный результат. Возможно этого хватит. Но он будет работать если размер uint на вашей платформе >8бит, и будет оптимален если платформа умеет многоразрядный сдвиг за одну команду.

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

LD   A, S:interruptcounter
ADD  A, #1
SBC  A, #0
LD   S:interruptcounter, A

Без переходов. Думаю на вашем ядре что-то подобное должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31.03.2021 в 17:12, SergeyVas сказал:

Интересный результат получается переменная типа char

Вы знаете, что в Си char, signed char и unsigned char -- это три разных типа? И знаковость/беззнаковость char -- это implementation defined?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...