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

GD32F103RBT6. Пропуск прерываний в режиме захвата

20 minutes ago, jcxz said:

неоптимально

Как оптимально изменить значение бита CH0P в регистре TIMERx_CHCTL2? И почему это будет оптимально? Это Вы лично проверяли в отладке в ассемблере? Я бы обязательно это сделал через &= и |=. Я лично не знаю ни одного программиста, кто придрался бы к этому. Вокруг меня одни говнокодеры. Если Вы объясните, то лично обойду всех, до кого смогу дотянуться и расскажу им, и говнокода в мире станет меньше.

Изменено пользователем LAS9891

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


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

7 минут назад, LAS9891 сказал:

Как оптимально изменить значение бита CH0P в регистре TIMERx_CHCTL2? И почему это будет оптимально?

Конкретно с этим битом в вашем коде всё нормально. Оптимально. Так как там только одно чтение и одна запись.

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

10 минут назад, LAS9891 сказал:

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

Здесь на форуме это объяснялось уже 100500 раз. И разными участниками. Но это ничего не меняет - говнокодеры продолжают тупо лепить простыни из |= и &=.

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


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

3 minutes ago, jcxz said:

по-моему алгоритму

В п.2 я бы очистил флаг через &=.

В п.4 я бы проверил наличие флага опять через &=.

и т.д.

7 minutes ago, jcxz said:

А достаточно только одного чтения

Как одного? В алгоритме вы читаете INTF несколько раз в разное время (в п.4 можно зациклиться и читать много раз).

10 minutes ago, jcxz said:

говнокодеры продолжают тупо лепить

ну чтож, продолжим традицию

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


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

3 минуты назад, LAS9891 сказал:

В п.2 я бы очистил флаг через &=.

В п.4 я бы проверил наличие флага опять через &=.

Т.е. - вы так ничего и не поняли почему так делать нельзя??? И так и не прочитали мануал на свой МК?

Тогда всё бесполезно. Такие задачи вам не по плечу.  :unknw:

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


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

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

И так и не прочитали мануал на свой МК?

Похоже, даже нужное место выложенное прямо сюда в виде картинки прочитать не удосужился 😡 Хотя утверждает, что код исправил. Но виноваты все остальные.

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


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

18 hours ago, Сергей Борщ said:

в виде картинки прочитать не удосужился

Вам стоило написать в STM и рассказать им какие они там все говнокодеры:

(17_02.202411-59-49).thumb.jpg.f1b27611d91e06db6cd8df859c897d90.jpg

19 hours ago, jcxz said:

Т.е. - вы так ничего и не поняли почему так делать нельзя

Попробуйте дать ссылку на документ от STM, или хотя бы на чью-то статью, где было бы напечатано выражение "так делать нельзя". Аргумент "я так решил" - это не аргумент. Я не говорю, что Вы не правы. Я хочу узнать, почему Вы сделали такие выводы? Я согласен делать так как Вы говорите, но мне нужно знать, почему нужно делать именно так. Вы проводили самостоятельные эксперименты? Переписывали код на ассемблере и сравнивали результаты? Кучи примеров написано в стиле говнокода, наверно потому, что Ваша истина им менее доступна, чем говнокодовые примеры. Написали бы статью, и каждого тыкали носом в неё. Или это развлечение такое, говнокодерам сообщать, что они говнокодеры?

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


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

20 hours ago, jcxz said:

Здесь на форуме это объяснялось уже 100500 раз.

Киньте ссылку где будет написано "не делай так, потому что случится вот это", а не "не делай так, разве непонятно почему, ну ты и дебил, сам не можешь понять, значит эта задача тебе не по плечу". Если бы я каждый раз слушал философов, которые говорили такое, то можно было не начинать жить.

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


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

Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:

On 2/12/2024 at 5:54 PM, jcxz said:

Корректный код должен быть примерно таким:

u32 i = TIMER_INTF(TIMER1);
if (i & TIMER_INTF_CH0IF) {
  TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF; // Clear capture/compare interrupt flag.
  ...

Ну ок.

А тут пишут в п.9:

21 hours ago, jcxz said:

проверяете наличие флага в INTF: если флаг есть - переход на п.7;

Тут получается напрямую в регистре смотреть? Или опять сначала прочитать в значение в переменную и уже в переменной смотреть значение?

И вообще, вот все небожители пишут, что чистить флаг надо только так:

TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF;

По причине того что: "Software can read as well as clear this bit by writing 0. Writing 1 has no effect on the bit value". Где в этой фразе написано, что нельзя сделать так:

TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);

Написано же "Writing 1 has no effect on the bit value". Нет эффекта, а не "нельзя".

Что произойдёт, если написать как в варианте 2:

1. Прочитается значение регистра;

2. Значение TIMER_INTF_CH0IF будет побитно инвертировано, лог. 0 будет только на месте нужного бита, остальные лог. 1.

3. С прочитанным значением и с побитно инвертированным значением TIMER_INTF_CH0IF будет сделано побитовое &, т.е. лог. 0 будет там где надо.

4. В TIMER_INTF(TIMER1) запишется высчитанное значение.

Ок, лог. 1 писать смысла нет, согласен, смысла нет, но не запрещено! И нужный бит сбросится нулём. Чё у всех так радикально печёт от этого? Код сработает по другому? Почему в примерах от STM так пишут и у них не печёт?

Согласен, вот так:

TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF

писать логичнее, а так:

TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF)

пишут, потому что лень проверять свойства каждого регистра, запись просто универсальнее. Но от этого они что отработают по разному? Где это написано? Судя по тому что, мне упорно объясняют, что я долбоёб, я должен как-то сам понять, что 1000 раз мой код сработает как я думаю, но в 1001 раз сработает неправильно из-за того, что флаг почистил не так.

 

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


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

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

Вам стоило написать в STM и рассказать им какие они там все говнокодеры:

Да, они там такие и есть.

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

не делай так, разве непонятно почему

Это же очевидно: &= - операция типа "чтение-модификация-запись", если между чтением и записью в этом регистре установится еще какой-то флаг (флаги) - они будут сброшены и вы их потеряете. И, вдобавок, совершенно ненужное чтение регистра.

Если вам что-то непонятно в ответах - всегда можно задать уточняющий вопрос "почему". Хамить - последнее, дело. Прощайте.

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


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

30 minutes ago, Сергей Борщ said:

Да, они там такие и есть.

🤣

30 minutes ago, Сергей Борщ said:

Это же очевидно: &= - операция типа "чтение-модификация-запись", если между чтением и записью в этом регистре установится еще какой-то флаг (флаги) - они будут сброшены и вы их потеряете. И, вдобавок, совершенно ненужное чтение регистра.

Получается:

TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF); // Происходит: чтение, модификация, запись.
TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF; // Происходит: запись.

Разница в количестве совершаемых операций и, соответственно, в скорости, а далее следствие из этого:

30 minutes ago, Сергей Борщ said:

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

Вот теперь прям по полочкам. Теперь понятно, зачем для каждого регистра смотреть abbreviations for registers, которые для GD появились только в User Manual Revision 2.6.

Зачем было так долго объяснять мне, что я читать не умею? Вы ответили в одном предложении! Но его пришлось пассатижами вытаскивать из Вас.

30 minutes ago, Сергей Борщ said:

Хамить - последнее, дело.

Мне тоже не комплиментов отсыпали, но что уж поделать, это русскоязычный форум. Не обижайтесь, свет ваших нимбов ослепляет и документации не видно.

 

 

Теперь, благодаря Сергей Борщ, стало понятнее.

32 minutes ago, LAS9891 said:

Но от этого они что отработают по разному?

Да по разному.

32 minutes ago, LAS9891 said:

Где это написано?

Напрямую нигде. Должен сам догадаться и понять, что даже в STM работают говнокодеры.

 

 

21 hours ago, jcxz said:

Т.е. - вы так ничего и не поняли почему так делать нельзя???

Теперь чуть-чуть понял. А что вот тут как:

32 minutes ago, LAS9891 said:

Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:

On 2/12/2024 at 5:54 PM, jcxz said:

Корректный код должен быть примерно таким:

u32 i = TIMER_INTF(TIMER1);
if (i & TIMER_INTF_CH0IF) {
  TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF; // Clear capture/compare interrupt flag.
  ...

Ну ок.

А тут пишут в п.9:

22 hours ago, jcxz said:

проверяете наличие флага в INTF: если флаг есть - переход на п.7;

Тут получается напрямую в регистре смотреть? Или опять сначала прочитать в значение в переменную и уже в переменной смотреть значение?

 

Изменено пользователем LAS9891

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


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

1 час назад, LAS9891 сказал:
TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF);

А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав.

45 минут назад, LAS9891 сказал:

Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную:

Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании.

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


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

 

24 minutes ago, VladislavS said:

Тут вы очистили флаги

Как я ИХ мог очистить, если я чищу только один бит, а запись единиц " Writing 1 has no effect on the bit value". Ладно, проехали про это. Мне про это рассказали.

 

24 minutes ago, VladislavS said:

Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит.

Тогда какая разница где проверять значение в регистре процессора или в переменной, которую я создам специально для этого? Только для того чтобы не делать чтение в регистровую переменную несколько раз?

Тогда как тут делать:

1 hour ago, LAS9891 said:

А тут пишут в п.9:

23 hours ago, jcxz said:

проверяете наличие флага в INTF: если флаг есть - переход на п.7;

 

Нужно проверить регистр таймера, очистить его и опять проверить. Тогда нужно дважды читать значение регистра таймера в специальную переменную а не в процессорную? Разница то какая?

Изменено пользователем LAS9891

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


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

 

17 минут назад, LAS9891 сказал:

Как я ИХ мог очистить

Между чтение для обработки и повторным чтением для очистки могло произойти что угодно.

3 часа назад, LAS9891 сказал:

Вам стоило написать в STM и рассказать им какие они там все говнокодеры

Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :)))

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


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

46 минут назад, LAS9891 сказал:

Как я ИХ мог очистить, если я чищу только один бит, а запись единиц " Writing 1 has no effect on the bit value". Ладно, проехали про это. Мне про это рассказали.

Операция &= для ARM состоит из 3-х операций: чтения, модификации, записи.

После 1-го чтения, в регистре может появиться новый флаг (совсем другого прерывания по другому каналу). Который перед чтением был == 0. А значит дальнейшей операцией записи вы запишете в тот флаг старое значение ==0. Т.е. - сбросите этот флаг даже не заметив его.

Отсюда и потери событий в вашем коде.

Вещи это все - очевидные. Понятные априори даже без объяснений. Для этого достаточно только вдумчивого прочтения документации на регистры периферии и даже беглого взгляда в скомпилированный код.

Примеры с мусорки инета приводить не нужно: Количество говнокодеров в мире намного больше, чем количество программистов умеющих думать. А значит - на мусорке найдёте скорее всего говнокод.

 

PS: Хамить здесь не нужно. И писать в хамском стиле. Вам тут никто ничего не должен. Запомните это раз и навсегда.

Иначе дальше в своём г* будете разбираться в гордом одиночестве. Это последнее предупреждение.

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


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

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

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

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

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

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

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

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

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

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