Jump to content

    
Sign in to follow this  
SergeyVas

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites
12 минут назад, SergeyVas сказал:

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

И что?

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
21 минуту назад, SergeyVas сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
6 часов назад, SergeyVas сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
31.03.2021 в 17:12, SergeyVas сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this