Например TDA7294

Форум РадиоКот • Просмотр темы - Прерывания - 2K тактов это много?
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт янв 22, 2026 07:57:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 83 ]    , 2, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вт дек 16, 2025 22:32:03 
Первый раз сказал Мяу!

Зарегистрирован: Пн дек 15, 2025 13:29:04
Сообщений: 23
Рейтинг сообщения: 0
каждая кнопка может иметь свой собственный пин :)


А готовые клавиатуры с таким подключением и красивой лицевой панелью бывают? Я чего-то кроме матричных с красивой лицевой панелью не нашел.

Добавлено after 6 minutes 33 seconds:
У меня обычно новая смена состояния допускается не раньше, чем через 50-80мс после предыдущей.
Вот такой простой код.

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

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

Заодно и "антидребезг" программный

Появилась идея как использовать прерывание со входа - сразу засчитать нажатие, но игнорировать повторное нажатие этой же кнопки определённое время. Ну и конденсаторы конечно, тут без них плохо будет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Чт дек 18, 2025 13:14:17 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 171
Рейтинг сообщения: 0
Но теперь, если у меня будет 16 кнопок, то в прерывании задержусь на 1600тактов, плюс, допустим, 400 тактов на всякую другую фигню.

Если у вас 16 кнопок, для их считывания ставьте соответствующую микросхему, например, ТМ1638. Она вроде как может работать с 24 кнопками, да ещё и выводить информацию на семисегментный дисплей (не помню, вроде 10 разрядов). Управляется по SPI.
На чём сейчас пишу, одна простая команда считывания с ТМ1638, есть даже с учётом дребезга, всё банально.
В ЧипДипе ТМ1638 стоит 18 рублей, это мелочь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вс дек 21, 2025 10:21:54 
Первый раз сказал Мяу!

Зарегистрирован: Пн дек 15, 2025 13:29:04
Сообщений: 23
Рейтинг сообщения: 0
Цитата:
(Почти) не использую многозадачность кнопок

Да ведь это несложно сделать в конечном автомате. Кнопка или концевик - штука очень медленная, достаточно опрашивать 1 раз в миллисекунду (понятно, что если концевик можно "проскочить", то придется задействовать прерывание, но во всех остальных случаях это не нужно). Каждой кнопке заводим структуру: предыдущее состояние, нонешнее состояние, время последней смены состояния. Если еще счетчик нажатий ввести, можно и несколько нажатий подряд детектировать (а по прошествии определенного времени сбрасывать в нуль). Заодно и "антидребезг" программный. У меня обычно новая смена состояния допускается не раньше, чем через 50-80мс после предыдущей.
Вот такой простой код.


Тоже интересное решение. Спасибо!

А вообще вариантов появляется намного больше, чем успеваю реализовать. Так я буду делать 1000 + 1 реализацию обработки кнопок, наверное нужно решать проблемы по мере появления.

А то уже количество строк кода для обработки нажатия приближается к 500 (правда вместе с комментариями и дефайнами). А в итоге при самых простых настройках, дают всего 20 строк ассембелернрого кода.
Но правда если включить все опции(долгое нажатие, автосброс неиспользуемых нажатий и т.п.), то ассемблерный код разрастается до почти 100 строк, но при этом в нормальном состоянии из-за условных переходов отработает за несколько тактов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вс дек 21, 2025 11:19:05 
Мудрый кот

Карма: 25
Рейтинг сообщений: 498
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1858
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
... А вообще вариантов появляется намного больше, чем успеваю реализовать ...

Вчерашняя установка: нужно было портировать программный код с ARM (48 MHz) на PIC (внурт. 4 MHz -> /4 = клок 1 MHz) (для управления устройством, сигналы в областью x1..x10 μs). В рабочем коде возникали большие непредсказуемые паузы, пришлось полностью переработать вычислительную часть (битовые операции, сдвиг и т. д.). А на ARM код работает без всяких условий, со временем вообще не думал об оптимизации, напр. в отношении количества инструкций).

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


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Чт янв 01, 2026 14:45:41 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 171
Рейтинг сообщения: 0
P.P.S. Если можно подскажите на сколько в норме можно занимать прерывание в тактах или в миллисекундах в условиях когда в других прерываниях нет ничего важного и в условиях когда что-то есть. Желательно с конкретными примерами - например если используется UART на скорости 19200, то не больше столько-то.

А то уже количество строк кода для обработки нажатия приближается к 500 (правда вместе с комментариями и дефайнами).

В прерываниях предпочитаю только необходимый минимум, десяток, другой ассемблерных команд. Остальная обработка – в основной программе. Это избавляет от ряда проблем.
Иногда можно вообще не прыгать в прерывания, а работать по аппаратному флагу прерывания.
Часто опрос кнопок можно делать в основном круге вообще без прерывания, это проще.
Прямой связи со скоростью UART нет, всё зависит от построения программы.
Для такой простой задачи 500 строк – это ужас. Наверно, у вас пройдёт простой вариант, на основном круге в свободном окне делать опрос кнопок с учётом дребезга. Спецы критикуют, но очень просто и надёжно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Чт янв 01, 2026 17:55:43 
Электрический кот

Карма: 5
Рейтинг сообщений: 176
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1090
Рейтинг сообщения: 1
Вообще-то, 2к инструкций при 20М даст время 0.1 мс. За две страницы не смогли этого вычислить.
Что такое 0.1 мс в прерывании (с отсутствием приоритетного арбитража)? При отсутствии DMA это означает отказ работы при приеме длины двух символов. Т.е. 19200+ это гарантированный сбой приема. Если устройство живет не на 2400-9600, что никто ставить не будет, то сие "плоскостопие" означает полный черный ящик с веревочками - внешние интерфейсы невозможны.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Чт янв 01, 2026 19:08:36 
Первый раз сказал Мяу!

Зарегистрирован: Пн дек 15, 2025 13:29:04
Сообщений: 23
Рейтинг сообщения: 0
Вот кстати код обработчика кнопок:
https://github.com/SimonLitt/sls-avr-li ... r/button.h
https://github.com/SimonLitt/sls-avr-li ... r/button.c
Код:

void init_buttons(void) {
   PIN_TO_READ(BTN_HI_PORT, BTN_HI_PIN);
   PIN_TO_READ(BTN_LO_PORT, BTN_LO_PIN);
}

void buttons_loop(volatile compare_clock_t *const compare) {
   static btn_info_t hi_btn_info = BTN_INFO_STRUCT_DEFAULT;
   static btn_info_t lo_btn_info = BTN_INFO_STRUCT_DEFAULT;

   btn_proc(&hi_btn_info, !(PIN_READ(BTN_HI_PORT, BTN_HI_PIN)));
   btn_proc(&lo_btn_info, !(PIN_READ(BTN_LO_PORT, BTN_LO_PIN)));

   if (btn_is_holded(lo_btn_info.state) && btn_is_clicked(hi_btn_info.state)) {
      on_two_buttons();
      btn_reset(&hi_btn_info);
      btn_set_processed(lo_btn_info.state); // Wait up.
      lo_btn_info.state = BTN_INFO_STATE_DEFAULT; // Prevent action.
   } else if (btn_is_clicked(lo_btn_info.state)) {
      on_lo_click();
      btn_reset(&lo_btn_info);
   } else if (btn_is_long_clicked(lo_btn_info.state)) {
      on_lo_press();
      btn_reset(&lo_btn_info);
   }

   if (btn_is_clicked(hi_btn_info.state)) {
      on_hi_click();
      btn_reset(&hi_btn_info);
   } else if (btn_is_long_clicked(hi_btn_info.state)) {
      on_hi_press();
      btn_reset(&hi_btn_info);
   }
   clock_compare_incr_fegi(compare, BTN_LOOP_STEPS_OF_CLOCK);
}



И всё это крутится вне прерывания в основном цикле (естественно не каждый раз, а раз в 10ms).
До нормального кода клавиатуры(который не стыдно было бы показать) руки так и не дошли, пока только наброски.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Сб янв 03, 2026 19:47:46 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 171
Рейтинг сообщения: 0
Вообще-то, 2к инструкций при 20М даст время 0.1 мс. За две страницы не смогли этого вычислить.
Что такое 0.1 мс в прерывании (с отсутствием приоритетного арбитража)? При отсутствии DMA это означает отказ работы при приеме длины двух символов. Т.е. 19200+ это гарантированный сбой приема. Если устройство живет не на 2400-9600, что никто ставить не будет, то сие "плоскостопие" означает полный черный ящик с веревочками - внешние интерфейсы невозможны.

Пару байтов не принять, гарантируемый сбой, внешние интерфейсы невозможны – какой-то у вас всё сильно проблематично.
Для многих задач подойдёт простой метод: в основном круге по установившемуся флагу прерывания USART (например, от компьютера) перейти на программу связи через USART и провести связь.
Здесь всё просто, скорость USART не важна, принять можно и пару байт, и пару сотен, и пару килобайт, DMA не нужен.
Конечно, есть специфика задачи.

Simon.S
Вы писали на ассемблере, а тут вроде как СИ. СИ для меня замороченный язык.
На современном ассемблере строчек, пожалуй, поменьше будет и читаемость лучше.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Сб янв 03, 2026 22:42:59 
Первый раз сказал Мяу!

Зарегистрирован: Пн дек 15, 2025 13:29:04
Сообщений: 23
Рейтинг сообщения: 0
Вы писали на ассемблере, а тут вроде как СИ.

Нет, на С. Просто анализировал что выводит компилятор с опцией `-S`

СИ для меня замороченный язык.

На вкус и цвет, как говорится...
Для меня ассемблер замороченный. Не скажу, что совсем тёмный лес, просто смысла в нём особого не вижу. Пока ни разу в жизни не пригодился, даже когда работал разработчиком.
Для души конечно интересно - померяться у кого код, меньше и быстрее. Меня поэтому MCU и привлекают, я С понял только тогда, когда начал разрабатывать под AVR.
Но каждому своё - кого-то и ардуино устраивает, а я такого вынести не могу :twisted:

Добавлено after 2 minutes 9 seconds:
Для меня самая большая проблема придумать проект, который я не смогу купить быстрее и дешевле, чем самому разработать. Вроде почти всё уже придумали. Поэтому больше экспериментирую, чем реально что-то делаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вс янв 04, 2026 09:07:11 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2922
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24714
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
На современном ассемблере .... читаемость лучше.

Штаааа????!!!!1111 :music: :music: :music:
Ничего глупее придумать не могли?
Весь смысл языков высокого уровня - это управление сложностью кода. Что собственно становится возможным именно благодаря высокой читабельности кода. В отличии от ассемблера.
Вы просто не знаете ЯВУ. Поэтому и пишите всякую чушь.
ЗЫ. Для определенности. Не нужно приводить код автора темы в качестве примера "замороченности". Это точно НЕ референс. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вс янв 04, 2026 18:03:02 
Первый раз сказал Мяу!

Зарегистрирован: Пн дек 15, 2025 13:29:04
Сообщений: 23
Рейтинг сообщения: 0
В фирме, где я первый раз устроился на работу говорили, что железо стоит дешевле, чем работа программиста. Я до сих пор согласен с этим утверждением.
Но, как уже писал, MCU нравится именно сложностью - ограниченные ресурсы, да и много чего вспомнить пришлось, что во время учебы, не особо воспринималось.

Добавлено after 3 minutes 50 seconds:
А соответственно и лучше понять.
Я вообще СИ освоил после школьного Паскаля - писал, писал код на Делфи, а потом понял, что пишу почти на чистом WinAPI(стандартные формы, меня соответственно не устраивали). Когда понял, за день перешёл на СИ, но ещё долго вникал в тонкости.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вс янв 04, 2026 19:20:05 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2922
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24714
Откуда: Московская область, Фрязино
Рейтинг сообщения: 1
Когда понял, за день перешёл на СИ, но ещё долго вникал в тонкости.

Судя по приведенному коду опроса кнопок - не слишком вникли... :)
Сплошной ковровый if-else... :facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вт янв 06, 2026 10:10:11 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 171
Рейтинг сообщения: 0
На современном ассемблере .... читаемость лучше.

Штаааа????!!!!1111 :music: :music: :music:
Ничего глупее придумать не могли?
Весь смысл языков высокого уровня - это управление сложностью кода. Что собственно становится возможным именно благодаря высокой читабельности кода. В отличии от ассемблера.
Вы просто не знаете ЯВУ. Поэтому и пишите всякую чушь.

Я пишу про условно названный современным ассемблер. В нём встроены элементы ЯВУ, это сильно упрощает разработку.
Например, в основном круге опрос пары кнопок (Start и Stop) можно сделать таким:
Key_Read
If Keys = Key_Start Then Goto L_0
If Keys = Key_Stop Then Goto L_ 1
Встроенная команда Key_Read три раза с заданным интервалом читает порт до тех пор, когда данные отсчёты совпадут, это защита от дребезга. Результат – в регистре Keys.
Key_Start и Key_Stop – числа, соответствующие нажатой кнопке.
Далее обработка нажатой кнопки Start, ожидание отпускания кнопки:
L_0:
Key_Read
If Keys <> 0 Then Goto L_ 0
……
Немного упростил для читаемости.
Этого языка вы не знаете, но, наверно, и так всё понятно.
Писать просто, читаемость хорошая, даже комментарии не нужны, 6 простеньких строчек. Можете сравнить с СИ.
Правда, при таком опросе программа задержится на опросе кнопок, но в большинстве случаев это несущественно.
Если нужно определить длительное и короткое нажатие, можно запустить таймер. Если фиксированное время основного круга, наверно, можно обойтись без таймера.
500 строк у ТС для такой простой задачи шокировали.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вт янв 06, 2026 13:25:26 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2927
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18929
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
AQ29 писал(а):
Этого языка вы не знаете
видимо потому, что это его ты изобрел.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Вт янв 06, 2026 13:42:26 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2922
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24714
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Например, в основном круге опрос пары кнопок (Start и Stop) можно сделать таким:
Key_Read
If Keys = Key_Start Then Goto L_0
If Keys = Key_Stop Then Goto L_ 1.

Называть это "читабельным" - бред сивой кобылы. :facepalm:
Спорить о вкусе устриц нужно с теми, кто их ел... (с)
Сначала хотя бы ознакомьтесь с Си, а потом пытайтесь оценить "читабельность".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Ср янв 07, 2026 10:07:26 
Нашел транзистор. Понюхал.

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 171
Рейтинг сообщения: 0
КРАМ
Этот «бред сивой кобылы» неплохо работает, а время написания – минуты.
Насчёт читабельности. Интересно, какие у вас затруднение возникли при чтении этих команд, что непонятного.
На мой взгляд, это совсем простые строки.
Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Ср янв 07, 2026 10:57:50 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2922
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24714
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Этот «бред сивой кобылы» неплохо работает, а время написания – минуты.

Это зависит от сложности алгоритма. Помигать LED-ом или прочитать клаву - это суперпримитивные задачи.
Макросы АСМа - это беспонтовый костыль. Чисто листинг сократить.
Насчёт читабельности. Интересно, какие у вас затруднение возникли при чтении этих команд, что непонятного.
На мой взгляд, это совсем простые строки.

В том и дело, что простые. Текст понятен до уровня его исполнения. Алгоритм в нем вообще не читается.
А под читабельностью понимается не код, а алгоритм.
Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.

На современном ассемблере строчек, пожалуй, поменьше будет и читаемость лучше.

:facepalm: Феерично. Си не знает, но точно знает, что читаемость на ассемблере будет лучше...
:music: :music: :music:


Последний раз редактировалось КРАМ Ср янв 07, 2026 11:06:28, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Ср янв 07, 2026 11:02:38 
Мучитель микросхем

Карма: 1
Рейтинг сообщений: 52
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 492
Рейтинг сообщения: 0
Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.

Сколько лет вы уже на свой современный ассемблер потратили? И не потому ли никому его не показываете, что вдруг именно он окажется хуже? )


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Ср янв 07, 2026 12:10:54 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2922
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24714
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Встроенная команда Key_Read три раза с заданным интервалом читает порт до тех пор, когда данные отсчёты совпадут, это защита от дребезга. Результат – в регистре Keys.
Key_Start и Key_Stop – числа, соответствующие нажатой кнопке.

В догон.
Во первых, уже обсуждали как выглядит защита от дребезга. "Читать три раза подряд с заданным интервалом" - совершенно пустое мероприятие. Мало того, оно еще и блокирующее или требует специально выделенного таймера.
Во вторых, кнопки могут висеть на разных портах и все "числа соответствующие данной нажатой кнопке" идут попесдэ лесом и болотами...
В третьих, AVR является RISC машиной, то есть вся математика возможна только с РОНами. А это значит, что регистр Keys - это РОН. Со всеми вытекающими последствиями для остального кода и его читабельности. :music:
ЗЫ.
Штобтызнал.
Вот так выглядит функция подсчета CRC16 на Си. Абсолютно для любого контроллера любой разрядности.
Код:
uint16_t crc16_x25(uint8_t* data, uint16_t len)
{   
   #define CRC16_START_VALUE      0xFFFF
   #define POLINOM      0x8408
   
   uint16_t i;
   uint8_t k;
   uint16_t crc=CRC16_START_VALUE;
   
  for (i=0;i<len;i++)
   {
    crc^=data[i];
    for (k=0;k<8;k++)
         if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1;
  }
  return ~crc;
}

Эта функция не зависит от вызываемого ее кода. То есть может работать с любыми разными исходными массивами программы.
Транслируется для 32-битного ARM так (оптимизация о3):
Код:
    49: {       
    50:         #define CRC16_START_VALUE              0xFFFF
    51:         #define POLINOM  0x8408
    52:     
    53:         uint16_t i;
    54:         uint8_t k;
0x08002C48 B570      PUSH          {r4-r6,lr}
    55:         uint16_t crc=CRC16_START_VALUE;
    56:         
0x08002C4A F64F72FF  MOVW          r2,#0xFFFF
    57:   for (i=0;i<len;i++)
    58:         {
0x08002C4E 2300      MOVS          r3,#0x00
0x08002C50 F2484508  MOVW          r5,#0x8408
0x08002C54 E00E      B             0x08002C74
    59:     crc^=data[i];
0x08002C56 5CC4      LDRB          r4,[r0,r3]
0x08002C58 4062      EORS          r2,r2,r4
    60:     for (k=0;k<8;k++)
0x08002C5A 2400      MOVS          r4,#0x00
    61:                         if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1;
    62:   }
0x08002C5C 07D6      LSLS          r6,r2,#31
0x08002C5E D002      BEQ           0x08002C66
0x08002C60 EA850252  EOR           r2,r5,r2,LSR #1
0x08002C64 E000      B             0x08002C68
0x08002C66 0852      LSRS          r2,r2,#1
0x08002C68 1C64      ADDS          r4,r4,#1
0x08002C6A B2E4      UXTB          r4,r4
0x08002C6C 2C08      CMP           r4,#0x08
0x08002C6E D3F5      BCC           0x08002C5C
0x08002C70 1C5B      ADDS          r3,r3,#1
    57:   for (i=0;i<len;i++)
    58:         {
    59:     crc^=data[i];
    60:     for (k=0;k<8;k++)
    61:                         if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1;
    62:   }
0x08002C72 B29B      UXTH          r3,r3
0x08002C74 428B      CMP           r3,r1
0x08002C76 D3EE      BCC           0x08002C56
    63:   return ~crc;
0x08002C78 43D0      MVNS          r0,r2
0x08002C7A B280      UXTH          r0,r0
    64: }
0x08002C7C BD70      POP           {r4-r6,pc}
0x08002C7E 0000      MOVS          r0,r0
   308: {


Последний раз редактировалось КРАМ Ср янв 07, 2026 12:33:28, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Прерывания - 2K тактов это много?
СообщениеДобавлено: Ср янв 07, 2026 12:33:09 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1500
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15388
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
ГЫММ....
А как, к примеру, на СИ будет выглядеть типичный для ассемблера приём условного возврата из прерывания подстановкой адреса возврата в стеке?
Т. Е.
Прерывание:
Загрузить в стек адрес перехода к обслуживаемых программе, которая завершается по RET
И выполнить стандартное для прерывания RETI
Далее программа прыгает на "длинный обработчик" при разрешённых прерываниях. По завершении того "длинного обработчика" происходит возврат на предшествовавший прерывания участок основной программы.
:roll:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 83 ]    , 2, , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: akl и гости: 28


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y