Jump to content
    

Сбои при многопоточном обращении к Flash

On 5/18/2026 at 10:14 PM, girts said:

Если к событиям по таймеру подвязан какой то ногодрыг и всё происходит БЕЗ участия ядра, то да. 
Если это вызывает какой то ногодрыг по прерыванию, то всё это уже становится + неопределенная кучка тактов...
Если опять таки мониторятся какие то флаги, то это вообще + трамвайная остановка.

Ну вот простая задачка - main у вас на 40 тактов чего то, и в добавок нужно отсчитать ровно 24 такта и передёрнуть P_out = ~P_in. Как сделаете?   
 

Что такое “P_out = ~P_in” не знаю, похоже на вывод порта.

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

В МК, с которым работаю, есть 8 каналов. Вход одного канала можно присоединить к компаратору таймера, выход – к выводу порта. Тогда при достижении 24 такта на выводе порта сразу появится сигнал.

Вход также можно подключить к периферийному устройству, например, USART, SPI, ACP, AC, RTC и другим таймерам. Так что таймер можно запустить и выдать сигнал на порт без участия ядра.

Вообще-то я пока коммутатор не использовал, описал, как понял из даташита.

On 5/19/2026 at 12:20 AM, artemkad said:

Да хоть 20 байт. Выделить место для переменной это вообще не вопрос. Не удобно дальше с ними работать, потому как стандартной многобайтовой арифметики нет, а та что есть, требует тасования уже занятых регистров. Иначе говоря, любая многобайтовая арифметика неудобна, а потому ее стараются не использовать. 

 

У меня в языке есть стандартная многобайтная арифметика. Полностью есть операции равно, плюс и минус, сравнение, математические функции пока слабее. Постоянно работаю с многобайтной арифметикой, это просто. Например, а += в, где а – 5-байтная переменная SRAM, в – 3-байтная переменная РОН. Нажал на кнопку компиляции, получил результат, никакой мороки.

А с переменными 20 байт разработчик компилятора наверняка получит нервное истощение от тупой однообразной работы.

On 5/19/2026 at 12:20 AM, artemkad said:

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

 

В принципе да, основной цикл получается простой. Он, правда, несколько обрастает. Скажем, подпрограмма опроса датчиков сообщила, что какой-то датчик неисправен. В основном цикле надо выдать на индикатор соответствующее сообщение и перейти на другой цикл.

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

Что за переход между состояниями? Обычно в основном цикле вызов SUB – это переход на выполнение следующей задачи.

Share this post


Link to post
Share on other sites

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

а += в, где а – 5-байтная переменная SRAM, в – 3-байтная переменная РОН.

В каких РОН и что станет с тем, что в РОН уже было?

27 минут назад, AI7 сказал:

Что за переход между состояниями?

По сути это переход между подциклами внутри основного цикла системы. К примеру на примере автомобильной сигналки, она имеет 4 состояния - охрана, режим снятой охраны, сервисный режим, режим программирования настроек. И переходы между ними зависящие от действий или бездействий  с брелоками, метками, концевиками автомобиля, кнопкой или клавиатурой.  

Share this post


Link to post
Share on other sites

41 минуту назад, AI7 сказал:

Постоянно работаю с многобайтной арифметикой, это просто.

"Постоянно работаете" с ней на AVR? :shok:  Зачем???

Если ваши "постоянные задачи" требуют многоразрядной арифметики, то очевидно вы направильно выбрали контроллер. Есть-же ARM-ы. В которых всё в ~4 раза проще с многоразрядной арифметикой, чем в 8-битниках. Зачем изобретать деревянный велосипед?

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

У меня в языке

О каком "языке" речь, интересно?

Share this post


Link to post
Share on other sites

On 5/20/2026 at 11:14 AM, artemkad said:

В каких РОН и что станет с тем, что в РОН уже было? 

Любые РОН, кроме r16 и r17. В РОН сохраняются старые значения.

r16 и r17 используются в команде для проведения операций. Во всех операциях равно, плюс и минус достаточно пары регистров r16 и r17. В более сложных командах, например, умножение, естественно, используются и другие регистры, надо читать описание команды. Описание легко открыть парой кликов мышкой.

Вообще распределение переменных по регистрам – второстепенная задача. Основная – общая структура программы, которая должна быть простой, легко читаемой, чтобы, в частности уйти от таких проблем, какие возникли у ТС.

On 5/20/2026 at 11:14 AM, artemkad said:

По сути это переход между подциклами внутри основного цикла системы. 

Фактически, это команды RJMP и JMP перехода на метку, в ассемблере широко используются.

On 5/20/2026 at 11:41 AM, jcxz said:

"Постоянно работаете" с ней на AVR? :shok:  Зачем???

Если ваши "постоянные задачи" требуют многоразрядной арифметики, то очевидно вы направильно выбрали контроллер. Есть-же ARM-ы. В которых всё в ~4 раза проще с многоразрядной арифметикой, чем в 8-битниках. Зачем изобретать деревянный велосипед?

Особо сложными расчётами не приходилось заниматься. А рядовые вычисления нетрудно сделать и на AVR, поскольку есть встроенные команды и математические функции.

А расчёты часто встречаются. Например, даже простой вольтметр – есть умножение. Среднеквадратичный вольтметр, наверно, нужен квадратный корень. Измеритель концентрации, затухание по экспоненте, нужен логарифм. Следящая система – расчёт управляющего сигнала и т.д.

У АРМ нет ассемблера, на котором работаю.

Последние небольшие Tiny AVR, по совокупности параметров, возможно, одни из лучших в своём классе, хотя про другие МК ничего не знаю.

On 5/20/2026 at 11:41 AM, jcxz said:

О каком "языке" речь, интересно?

Это ассемблер со встроенными элементами ЯВУ. Он пока в разработке и его нет в общем доступе

Share this post


Link to post
Share on other sites

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

Фактически, это команды RJMP и JMP перехода на метку,

Нет. Эти команды просто исполняют переход. А осуществляется он по какой-то причине. И обычно эта причина это изменение флагов какого-то регистра состояния системы. Тех самых флагов о которых я говорил в начале. 

Share this post


Link to post
Share on other sites

On 5/16/2026 at 3:41 AM, jcxz said:

Не так давно делал проект на XMC4700 с тактовой 144МГц где программно генерилась синусоида (на ЦАП) с частотой квантования ~13МГц. А это уже всего: 144/13 = 11 тактов на отсчёт. И код генератора выполнялся в ISR, занимая всего около 50% времени CPU (половина времени оставалась ещё на фоновые задачи и другие ISR). Без асма такое с современными си-компиляторами не сварить.

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

Посмотрел в ЧипДипе, XMC4700 стоит около 4000 рублей, рядовой МК существенно дешевле.

Для генератора применить какую-нибудь микросхему или схему ГПД от трансивера.

Я этим не занимался, это предположение.

Share this post


Link to post
Share on other sites

12 часов назад, AI7 сказал:

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

Нужна была перестройка частоты синусоиды в диапазоне ~150...300кГц с дискретностью ~1Гц.

Каким аналоговым генератором синуса такое можно сделать? И сколько он будет стоить?

И каков будет спектр синуса на его выходе? Это для нас было самым важным параметром (а ни как не себестоимость).

12 часов назад, AI7 сказал:

Посмотрел в ЧипДипе, XMC4700 стоит около 4000 рублей, рядовой МК существенно дешевле.

Сочувствую. У нас XMC4700 в mouser-е = ~9.7 евро.

Один только вменяемый "аналоговый генератор" скорее всего будет дороже. Это уж не говоря о том, что непонятно как для него несущую генерить с перестройкой в доли %%?

12 часов назад, AI7 сказал:

Для генератора применить какую-нибудь микросхему или схему ГПД от трансивера.

Я этим не занимался, это предположение.

Ну вот именно. МК + синтезатор + генератор синуса - и себестоимость скорее всего станет больше, чем у одного МК. Уж не говоря о том, что известные мне генераторы синусоид, генерят синус очень грубо, ступенчато. Соответственно - с большим спектральным шумом, а не одной палкой на выходе. А значит - потребовался бы ещё и громоздкий аналоговый фильтр по выходу.

В сумме бы получилось решение скорее всего даже в несколько раз дороже. Даже если брать вашу конскую цену МК.

 

PS: И если бы у нас стоял вопрос о себестоимости, взяли бы XMC4500/XMC4502/XMC4504 которые ещё на неск. евро дешевле, при чуть меньшей производительности. А периферию имеют такую же.

Share this post


Link to post
Share on other sites

13 часов назад, AI7 сказал:

Может быть, проще было поставить аналоговый генератор синуса.

Зачем "аналоговый", когда в продаже есть великий ассортимент DDS генераторов. А хвастаться тем, что 50% времени проц занят входом/выходом из ISR - ну такое себе ;)

Share this post


Link to post
Share on other sites

50 минут назад, RabbitRabbit сказал:

Зачем "аналоговый", когда в продаже есть великий ассортимент DDS генераторов.

Не надо накидывать на вентилятор. Я тоже так могу. Предложите полное решение. Более оптимальное по вашему, чем то что мы сделали. А мы оценим.

50 минут назад, RabbitRabbit сказал:

А хвастаться тем, что 50% времени проц занят входом/выходом из ISR - ну такое себе 😉

Что "такое себе"? Вы думаете что "занят на 100%" лучше чем "занят на 50%"?  :fool:

И где именно я "хвастался"?

 

PS: Почему местные советчики думают что мы не оценивали разные пути решения и не сравнивали их?

PPS: И да кстати - я ни чьих советов "как делать" не спрашивал.

Share this post


Link to post
Share on other sites

On 5/27/2026 at 9:35 AM, jcxz said:

Нужна была перестройка частоты синусоиды в диапазоне ~150...300кГц с дискретностью ~1Гц.

Каким аналоговым генератором синуса такое можно сделать? И сколько он будет стоить?

И каков будет спектр синуса на его выходе? Это для нас было самым важным параметром (а ни как не себестоимость).

Требования к генератору не знал, поэтому вначале своего поста писал «Может быть…».

У вас точность частоты вроде как 3,3 ppm, а у обычных кварцев начинается вроде бы с 10 ppm. Кварц поддержит такую точность?

Я бы посмотрел в сторону генератора ГПД от трансивера. Перестройка с помощью варикапа, управление от МК. Стабилизация частоты – от кварца МК.

Сигнал с генератора подаётся на таймер МК, тот точно измеряет частоту и вырабатывает с помощью ШИМа другого таймера постоянное напряжение, которое подаётся на варикап.

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

Варикап не перекроет весь диапазон, придётся разбивать на поддиапазоны.

Плюсы – МК свободен, генератор вырабатывает чистый синус, а у вас «ступенчатый» синус.

Детали дешёвые, хотя, скорее всего, здесь основная цена – стоимость разработки.

Наверно, нетрудно сделать перестраиваемый узкополосный фильтр на основе такого же контура, как у генератора.

Share this post


Link to post
Share on other sites

18 минут назад, AI7 сказал:

У вас точность частоты вроде как 3,3 ppm, а у обычных кварцев начинается вроде бы с 10 ppm. Кварц поддержит такую точность?

Не помню какая была точность частоты. А при чём тут она?

И был не кварц, а генератор.

18 минут назад, AI7 сказал:

Я бы посмотрел в сторону генератора ГПД от трансивера.

Что это такое? И умеет ли оно вырабатывать чистую синусоиду в диапазоне 150...300кГц?

24 минуты назад, AI7 сказал:

Варикап не перекроет весь диапазон, придётся разбивать на поддиапазоны.

Плюсы – МК свободен, генератор вырабатывает чистый синус, а у вас «ступенчатый» синус.

И зачем все эти сложности? И что толку от "свободости МК"? Оставшихся ~50% времени - за глаза остальным задачам на МК. С большим запасом. Проблем с загрузкой МК там не возникало. Как и с ценой. Зачем это усложнять??? Не понятно... да и не факт, что дешевле будет (что опять же не играло роли в том проекте).

"Ступенчатость синуса" была = 13МГц/300кГц = 43 отсчёта на период. За глаза. Смотрели на анализаторе спектра - была одна единственная палка. При минимальном фильтре на выходе.

27 минут назад, AI7 сказал:

Детали дешёвые, хотя, скорее всего, здесь основная цена – стоимость разработки.

Вот именно. И "более дешёвый МК" ещё более увеличит это время. Так как там и АЦП наверняка будет хуже и SPI - тоже гораздо хуже, чем у XMC4xxx. И основная сложность в том проекта была - в LoRa-драйвере, висевшем на SPI. А никак не в генераторе синусоиды (на который было потрачено минимум времени). И хороший многофункциональный SPI XMC4xxx позволил существенно ускорить разработку.

Share this post


Link to post
Share on other sites

5 hours ago, jcxz said:

позволил существенно ускорить разработку.

И наверное повторяемость изделия...
И простота тестирования всей грядущей партии если изделие не единичное...

Ибо всё то, что предлагалось на аналоговом, с обратной связью через 2 таймера, и обратно в аналоговое, имхо только должно внести кучу нелинейности во всём процессе. 

Share this post


Link to post
Share on other sites

On 5/28/2026 at 1:25 PM, jcxz said:

Что это такое? И умеет ли оно вырабатывать чистую синусоиду в диапазоне 150...300кГц?

И зачем все эти сложности? И что толку от "свободости МК"?

ГПД – это генератор плавного диапазона трансивера для связи на коротких волнах. К нему предъявляются аналогичные требования. Чистота синусоиды, чтобы не было побочных излучений в эфире. Перестройка частоты в некотором диапазоне и высокая стабильность частоты, чтобы не потерялась связь с узкополосным приёмником. Смотрел схему, простая, на трёх транзисторах. Где-то на форуме читал, что требования к стабильности частоты ГПД вплоть до единиц герц. Для любительского диапазона 160 метров частота около 2 МГц.

Сам я никогда не занимался ГПД.

 

Свободный МК – просто писать программу и можно навешивать другие задачи. Часто после эксплуатации появляются пожелания добавить какие-нибудь опции, функции, сервис. Некоторые задачи не допускают, чтобы МК отвлекался.

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

В новых МК AVR появились дополнительные возможности SPI. В старых МК было 2 регистра управления, в новых – 5. Что добавили, пока не разбирался.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...