LAS9891 0 16 февраля Опубликовано 16 февраля (изменено) · Жалоба 20 minutes ago, jcxz said: неоптимально Как оптимально изменить значение бита CH0P в регистре TIMERx_CHCTL2? И почему это будет оптимально? Это Вы лично проверяли в отладке в ассемблере? Я бы обязательно это сделал через &= и |=. Я лично не знаю ни одного программиста, кто придрался бы к этому. Вокруг меня одни говнокодеры. Если Вы объясните, то лично обойду всех, до кого смогу дотянуться и расскажу им, и говнокода в мире станет меньше. Изменено 16 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 16 февраля Опубликовано 16 февраля · Жалоба 7 минут назад, LAS9891 сказал: Как оптимально изменить значение бита CH0P в регистре TIMERx_CHCTL2? И почему это будет оптимально? Конкретно с этим битом в вашем коде всё нормально. Оптимально. Так как там только одно чтение и одна запись. Но если действовать по-моему алгоритму, то уже не совсем оптимально. Так как может быть несколько чтений и несколько записей. А достаточно только одного чтения и одной или нескольких записей. 10 минут назад, LAS9891 сказал: Если Вы объясните, то лично обойду всех, до кого смогу дотянуться и расскажу им, и говнокода в мире станет меньше. Здесь на форуме это объяснялось уже 100500 раз. И разными участниками. Но это ничего не меняет - говнокодеры продолжают тупо лепить простыни из |= и &=. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 16 февраля Опубликовано 16 февраля · Жалоба 3 minutes ago, jcxz said: по-моему алгоритму В п.2 я бы очистил флаг через &=. В п.4 я бы проверил наличие флага опять через &=. и т.д. 7 minutes ago, jcxz said: А достаточно только одного чтения Как одного? В алгоритме вы читаете INTF несколько раз в разное время (в п.4 можно зациклиться и читать много раз). 10 minutes ago, jcxz said: говнокодеры продолжают тупо лепить ну чтож, продолжим традицию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 16 февраля Опубликовано 16 февраля · Жалоба 3 минуты назад, LAS9891 сказал: В п.2 я бы очистил флаг через &=. В п.4 я бы проверил наличие флага опять через &=. Т.е. - вы так ничего и не поняли почему так делать нельзя??? И так и не прочитали мануал на свой МК? Тогда всё бесполезно. Такие задачи вам не по плечу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 16 февраля Опубликовано 16 февраля · Жалоба Just now, jcxz said: Такие задачи вам не по плечу Всё, пишу заявление на увольнение... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 16 февраля Опубликовано 16 февраля · Жалоба 1 час назад, jcxz сказал: И так и не прочитали мануал на свой МК? Похоже, даже нужное место выложенное прямо сюда в виде картинки прочитать не удосужился 😡 Хотя утверждает, что код исправил. Но виноваты все остальные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 17 февраля Опубликовано 17 февраля · Жалоба 18 hours ago, Сергей Борщ said: в виде картинки прочитать не удосужился Вам стоило написать в STM и рассказать им какие они там все говнокодеры: 19 hours ago, jcxz said: Т.е. - вы так ничего и не поняли почему так делать нельзя Попробуйте дать ссылку на документ от STM, или хотя бы на чью-то статью, где было бы напечатано выражение "так делать нельзя". Аргумент "я так решил" - это не аргумент. Я не говорю, что Вы не правы. Я хочу узнать, почему Вы сделали такие выводы? Я согласен делать так как Вы говорите, но мне нужно знать, почему нужно делать именно так. Вы проводили самостоятельные эксперименты? Переписывали код на ассемблере и сравнивали результаты? Кучи примеров написано в стиле говнокода, наверно потому, что Ваша истина им менее доступна, чем говнокодовые примеры. Написали бы статью, и каждого тыкали носом в неё. Или это развлечение такое, говнокодерам сообщать, что они говнокодеры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 17 февраля Опубликовано 17 февраля · Жалоба 20 hours ago, jcxz said: Здесь на форуме это объяснялось уже 100500 раз. Киньте ссылку где будет написано "не делай так, потому что случится вот это", а не "не делай так, разве непонятно почему, ну ты и дебил, сам не можешь понять, значит эта задача тебе не по плечу". Если бы я каждый раз слушал философов, которые говорили такое, то можно было не начинать жить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 17 февраля Опубликовано 17 февраля · Жалоба Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную: 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 раз сработает неправильно из-за того, что флаг почистил не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 17 февраля Опубликовано 17 февраля · Жалоба 1 час назад, LAS9891 сказал: Вам стоило написать в STM и рассказать им какие они там все говнокодеры: Да, они там такие и есть. 1 час назад, LAS9891 сказал: не делай так, разве непонятно почему Это же очевидно: &= - операция типа "чтение-модификация-запись", если между чтением и записью в этом регистре установится еще какой-то флаг (флаги) - они будут сброшены и вы их потеряете. И, вдобавок, совершенно ненужное чтение регистра. Если вам что-то непонятно в ответах - всегда можно задать уточняющий вопрос "почему". Хамить - последнее, дело. Прощайте. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 17 февраля Опубликовано 17 февраля (изменено) · Жалоба 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; Тут получается напрямую в регистре смотреть? Или опять сначала прочитать в значение в переменную и уже в переменной смотреть значение? Изменено 17 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 17 февраля Опубликовано 17 февраля · Жалоба 1 час назад, LAS9891 сказал: TIMER_INTF(TIMER1) &= (~TIMER_INTF_CH0IF); А потом у вас прерывания теряются. Тут вы очистили флаги, которые "вскочили" во время обработки текущего прерывания, не обработав. 45 минут назад, LAS9891 сказал: Тут пишут, что флаг надо смотреть не прямо в регистре, а через переменную: Смотреть прямо в регистре периферии микроконтроллер не может. Он сначала считывает в регистр процессора, а затем смотрит. Локальная переменная будет расположена в регистре процессора. Не нужно много раз читать регистр статуса в регистр процессора, это напрасная трата времени в прерывании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 17 февраля Опубликовано 17 февраля (изменено) · Жалоба 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; Нужно проверить регистр таймера, очистить его и опять проверить. Тогда нужно дважды читать значение регистра таймера в специальную переменную а не в процессорную? Разница то какая? Изменено 17 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 17 февраля Опубликовано 17 февраля · Жалоба 17 минут назад, LAS9891 сказал: Как я ИХ мог очистить Между чтение для обработки и повторным чтением для очистки могло произойти что угодно. 3 часа назад, LAS9891 сказал: Вам стоило написать в STM и рассказать им какие они там все говнокодеры Это Секрет Полишинеля. Впрочем, тот код что для них индусы пишут, ещё ничего. :))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 240 17 февраля Опубликовано 17 февраля · Жалоба 46 минут назад, LAS9891 сказал: Как я ИХ мог очистить, если я чищу только один бит, а запись единиц " Writing 1 has no effect on the bit value". Ладно, проехали про это. Мне про это рассказали. Операция &= для ARM состоит из 3-х операций: чтения, модификации, записи. После 1-го чтения, в регистре может появиться новый флаг (совсем другого прерывания по другому каналу). Который перед чтением был == 0. А значит дальнейшей операцией записи вы запишете в тот флаг старое значение ==0. Т.е. - сбросите этот флаг даже не заметив его. Отсюда и потери событий в вашем коде. Вещи это все - очевидные. Понятные априори даже без объяснений. Для этого достаточно только вдумчивого прочтения документации на регистры периферии и даже беглого взгляда в скомпилированный код. Примеры с мусорки инета приводить не нужно: Количество говнокодеров в мире намного больше, чем количество программистов умеющих думать. А значит - на мусорке найдёте скорее всего говнокод. PS: Хамить здесь не нужно. И писать в хамском стиле. Вам тут никто ничего не должен. Запомните это раз и навсегда. Иначе дальше в своём г* будете разбираться в гордом одиночестве. Это последнее предупреждение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться