Plain 168 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба 1 час назад, SergeyVas сказал: Нужно в основном цикле программы обнулять переменную Это не будет работать — с локальной переменной нужно работать только в её среде, т.е. в прерывании и нигде более, т.е. в основном цикле выставлять флаг сброса, в прерывании по нему сбрасывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба 1 hour ago, jcxz said: interruptcounter = __USAT(interruptcounter + 1, 8); Скомпилится всего в 4 команды (вместе с чтение/записью в память) и без ветвления. Или: uint i = interruptcounter + 1; interruptcounter = i - (i >> 8); те же 4 команды. Интересный результат получается переменная типа 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба 12 минут назад, SergeyVas сказал: Интересный результат получается переменная типа char И что? Значит char у вас знаковый размером 8 бит. И что? PS: Такие бессмысленные портянки сюда лучше не постить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба Это на пк сделал что бы посмотреть результат работы. в прерываниях будет счет вначале в положительную сторону потом как дойдет до знака в отрицательную с пропуском целых чисел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба 21 минуту назад, SergeyVas сказал: в прерываниях будет счет вначале в положительную сторону потом как дойдет до знака в отрицательную с пропуском целых чисел. Если знаковый char у вас размером == 8бит, то никогда не получите 255. Не понятно о чём разговор тогда вообще. Поставьте беззнаковый тип: u8 или uint8_t - как оно там у вас называется. Или unsigned char. А вообще такие вещи оптимизируют глядя в ассемблерный выхлоп. А лучше вообще - на асме и пишут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба Попробую на асме вставку сделать. Только систему команд для st7 не знаю. Фактически нужен счетчик до 255 с минимальным временем выполнения. что бы после 255 останавливался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба uint8_t volatile counter; void isr() { uint8_t Tmp = counter + 1; if(Tmp) counter = Tmp; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 31 марта, 2021 Опубликовано 31 марта, 2021 · Жалоба 6 часов назад, SergeyVas сказал: Попробую на асме вставку сделать. Только систему команд для st7 не знаю. Фактически нужен счетчик до 255 с минимальным временем выполнения. что бы после 255 останавливался. Из тех вариантов что я предлагал, возьмите 2-й, скомпилите и посмотрите как выглядит ассемблерный результат. Возможно этого хватит. Но он будет работать если размер uint на вашей платформе >8бит, и будет оптимален если платформа умеет многоразрядный сдвиг за одну команду. Если на асме, то во многих системах команд есть суммирование/вычитание регистра с флагом переноса. На STM8 ваша задача будет решаться так: LD A, S:interruptcounter ADD A, #1 SBC A, #0 LD S:interruptcounter, A Без переходов. Думаю на вашем ядре что-то подобное должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bve 1 2 апреля, 2021 Опубликовано 2 апреля, 2021 · Жалоба А просто сделать: interruptcounter +=1; interruptcounter = interruptcounter & 0x0FF; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 3 апреля, 2021 Опубликовано 3 апреля, 2021 · Жалоба 31.03.2021 в 17:12, SergeyVas сказал: Интересный результат получается переменная типа char Вы знаете, что в Си char, signed char и unsigned char -- это три разных типа? И знаковость/беззнаковость char -- это implementation defined? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться