sat
https://aliexpress.ru/item/1005001771530872.html
⁣🇺🇦
Простая, но в то же время гениальная книжка: Компьютерная инженерия для самых маленьких r/#arduino Автор
Вик Аник
для всех остальных)))
Вик Аник
Вик Аник
Mr.Mait
Mr.Mait
Я держал книжку с ардуино набора Матрёшка. Вроде есть в pdf в инете
Если можно выкладывать платную книгу здесь, то могу выложить
Evgeniy
Если можно выкладывать платную книгу здесь, то могу выложить
давай. Я не нашёл в правилах запрета на это)
Evgeniy
название мне нравится)
321
Кто нибудь знает как это читать и где можно литературу найти, о том как диаграммы читать и по ним писать протокол для общения с железкой, а в идеале пару примеров бы найти
Dmytro
Кто нибудь знает как это читать и где можно литературу найти, о том как диаграммы читать и по ним писать протокол для общения с железкой, а в идеале пару примеров бы найти
Так они вроде специально сделаны максимально простыми, чтобы понятно было. Вам только нужно знать что в цифровой электронике обычно бывает 2 уровня - низкий и высокий. Там где оба уровня одновременно - это либо не определено, либо не важно, серым это передача данных. Вообще стандартов на это вроде нету, так что каждый производитель эти диаграммы делает как сам считает нужным
Max
лично мне, как начинающему кодеру, это видео было очень и очень кстати
Daniil
Создал поток, который работает внутри вечного цикла. Но спустя секунду примерно срабатывает собачий таймер и перезагружает есп. Если втыкаю delay, то все начинает работать нормально. В чём проблема?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Можно найти это в исходниках freertos
Daniil
Можно найти это в исходниках freertos
А если не должно быть там делеев. Собачий вырубать?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
ТОже самое произойдет если запустить делэй с 0
🤙🏻 ℙ𝔸𝕍𝔼𝕃
А если не должно быть там делеев. Собачий вырубать?
Никак не отключить к сожалению. Даже пустой цикл внутри цикла не отсечет этого поведения
🤙🏻 ℙ𝔸𝕍𝔼𝕃
таймер стартует при запуске таска и следит чтобы были отбивки этого тамера, отбивает его как раз делэй
🤙🏻 ℙ𝔸𝕍𝔼𝕃
1мс вроде не так критично? хотя смотря что делать конечно
Daniil
1мс вроде не так критично? хотя смотря что делать конечно
Заполнять регистры rgb матрицы. Так что 1мс это катастрофа
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я подсвечиваю 7 сегментный дисплей, в целом 1 мс не заметна, не перцает.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Но я за 1 мс успеваю все цифры пройти
🤙🏻 ℙ𝔸𝕍𝔼𝕃
при чем через set_gpio
🤙🏻 ℙ𝔸𝕍𝔼𝕃
сча
🤙🏻 ℙ𝔸𝕍𝔼𝕃
это решаемо
Daniil
сча
Ну да пофиг. Она просто чуть тусклее горит, А так вроде норм
🤙🏻 ℙ𝔸𝕍𝔼𝕃
static void xRenderTask(void* args) { int8_t current = 2; uint8_t min_number = 0; for (int min = 0; min < 2; min++) { if (display_chars[min] == 63) { min_number++; } else { break; } } for (;;) { for (current = 2; current >= min_number; current--) { flushNumbers(); highlightNumber(current); renderNumber(display_chars[current]); for (int i = 0; i < 130000; i++) {} } current = 2; min_number = 0; for (int min = 0; min < 2; min++) { if (display_chars[min] == 63) { min_number++; } else { break; } } vTaskDelay(1); } }
🤙🏻 ℙ𝔸𝕍𝔼𝕃
У меня вот такой цикл, т.е. я делаю еще даже задержки пустым циклом чтобы размазать эту МС равномерно на все 3 цифры
🤙🏻 ℙ𝔸𝕍𝔼𝕃
В твоем случае можно успеть обойти все 8к, потом 1мс подождать и еще раз обойти.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
тут у меня еще логика с отключением ведущих нулей, но в общем смысл должен быть понятен
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Всегда пожалуйста =)
Dmytro
А если не должно быть там делеев. Собачий вырубать?
Вообще yield или любое обращение к функции freertos достаточно.
Василий
А внутрь делай залезть и посмотреть что он там дергает нельзя?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Вообще странно что у вас ни одного мьютекса или очереди. У вас же таска не сама в себе, она берет какие-то данные с внешнего мира (renderNumber, к примеру, это же не константа?)
Да, это функция в рамках файла объявлена. Код не изначально не планировался как потокобезопасный, так что и мютексы не завезли)) А так при инициализации дисплея стартует таск рендера, и есть функция которая "торчит" из файла, кторая может устанавливать текущее значение в локальную переменную в рамках файла. Ну и собственно со следующей мс будет уже новое значение отображаться.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Но вообще мб руки дойдет переделаю на очередь на изменение отображаемого значения. В конкрено моем случае это избыточно)
Василий
Вообще странно что у вас ни одного мьютекса или очереди. У вас же таска не сама в себе, она берет какие-то данные с внешнего мира (renderNumber, к примеру, это же не константа?)
А что будет если в одном треде читать во утром писать один и тот же массив, если это просто набор точек на картинке? Не вижу зачем тут мютексы и прочее
Dmytro
А что будет если в одном треде читать во утром писать один и тот же массив, если это просто набор точек на картинке? Не вижу зачем тут мютексы и прочее
Затем что может быть ситуация, когда запись остановилась где-то в середине, и уже в другом треде вы начали эти незаконченные данные читать
Dmytro
Есть ещё ключевое слово atomic - как альтернатива единичным переменным, которое гарантирует что переменная в таком "полузаписанном" или "полупрочитанном" состоянии не будет
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Если я пишу его для собственных целей и не планирую его куда-то выкатываенть то я ничего никому НЕ ДОЛЖЕН =)))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я же знаю когда и как я вызываю те или иные функции которые я написал, и в курсе когда это можно делать, зачем мне усложнять свой код?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Опять же, если мне понаобится многопоточность для этого модуля, я всегда смогу реализовать её ПО ПОТРЕБНОСТИ =))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Правда я с трудом могу себе приедставить кейс где требуется конкурентное отображение данных на одном дисплее с разных потоков 🤔
Anton
У меня вот такой цикл, т.е. я делаю еще даже задержки пустым циклом чтобы размазать эту МС равномерно на все 3 цифры
> for (int i = 0; i < 130000; i++) {} ты с -O0 компилируешь что ли? любой оптимизирующий компилятор выкинет это совсем
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Не уверен что выкидывает, т.к. если этот цикл убрать, то отображается только последний символ, из чего могу сделать вывод что оно остается и отрабатывает. если задержки ставить меньше то яркость смещается так же к поледнему символу.
Anton
Правда я с трудом могу себе приедставить кейс где требуется конкурентное отображение данных на одном дисплее с разных потоков 🤔
кстати, у меня так часики с погодой устроены. разные потоки рисуют свои картинки в виртуальных экранах, затем это пересылается в общий поток, который рисует на дисплее
🤙🏻 ℙ𝔸𝕍𝔼𝕃
В ассемблере я не шарю, так что скомпиленный код не смотрел, да и в компиляторах тоже, скажем так)
🤙🏻 ℙ𝔸𝕍𝔼𝕃
кстати, у меня так часики с погодой устроены. разные потоки рисуют свои картинки в виртуальных экранах, затем это пересылается в общий поток, который рисует на дисплее
Ну тут несного другое всеже, у меня обычный 3х разрядный 7мисегментник, который показывает текущую температуру =))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Anton
я на работе, у меня нет иде сейчас
🤙🏻 ℙ𝔸𝕍𝔼𝕃
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
🤙🏻 ℙ𝔸𝕍𝔼𝕃
дефолтный конфиг для нового проекта, я там ничего не менял
Anton
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html#config-compiler-optimization
Anton
дефолтный конфиг для нового проекта, я там ничего не менял
ну вот как только поменяешь оптимизацию, то твой ручной цикл превратится в тыкву
🤙🏻 ℙ𝔸𝕍𝔼𝕃
значит я не буду этого делать)))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я просто не нашел вариантов сделать задержку меньше 1мс, кроме как пустым циклом
Anton
usleep пробовал?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
нет
🤙🏻 ℙ𝔸𝕍𝔼𝕃
посмотрим в эту сторону
Anton
я сам не пробовал :)
Anton
кажись фриртос эту функцию не на всех платформах умеет
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Это функция сей
🤙🏻 ℙ𝔸𝕍𝔼𝕃
http://all-ht.ru/inf/prog/c/func/usleep.html
🤙🏻 ℙ𝔸𝕍𝔼𝕃
ну как буду опять с кодом ковыряться, заменю на usleep, если вообще буду езе юзать этот дисплей ))) пока он прсото как франкинштейн стоит на макетке на подоконнике и питается от ноута =))
Anton
если что, вот кусок из ардуино-фв, который делает микросекундный делей: #define NOP() asm volatile ("nop") unsigned long IRAM_ATTR micros() { return (unsigned long) (esp_timer_get_time()); } void IRAM_ATTR delayMicroseconds(uint32_t us) { uint32_t m = micros(); if(us){ uint32_t e = (m + us); if(m > e){ //overflow while(micros() > e){ NOP(); } } while(micros() < e){ NOP(); } } }
🤙🏻 ℙ𝔸𝕍𝔼𝕃
я думаю usleep справится)