Jump to content

    

AVI-crak

Участник
  • Content Count

    272
  • Joined

  • Last visited

Community Reputation

0 Обычный

About AVI-crak

  • Rank
    Местный

Контакты

  • Сайт
    Array

Recent Profile Visitors

2135 profile views
  1. Не путать именную структуру с полем bool(числовое значение+реальный адрес), и bool в качестве возврата функции - одно определение вообще на весь проект. Как только значению bool даётся новое имя - сразу появляется адрес для хранения числового значения, который уже можно передавать куда угодно. Но в чистом виде GCC имеет право заоптимизировать вусмерть, лишив физического адреса. Как оно первоначально и было задумано.
  2. Ой-ли... https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/bool Bool сам себе результат применения логики, он не является числовым значением. И есно к регистрам r0-r3 имеет очень слабое отношение - переходит в число исключительно в режиме эмуляции самого себя. Так-же значение bool нельзя передать куда-то далеко, можно только использовать здесь и сейчас. В нормальных библиотеках с использованием bool, очень широко применяется условный переход на асме сразу после вызова подпрограммы. Это нормально до момента, пока библиотека не меняет тип ядра, например с cortex M7 на cortex M0 и обратно. А меняют ядро для того чтобы библиотека работала везде и всегда. Вот только bool после таких манипуляций намертво переходит в режим эмуляции. Это кстати одна из тех причин, по которой я ненавижу чужие откомпелированные библиотеки.
  3. Ну классика-же: #undef true #define true false /* ебитесь как хотите */ Кстати, значение bool не обязательно должно возвращаться в регистре R0. Вместо этого используется регистр xpsr(для arm), в котором находятся биты сравнения: всё что не равно - лож. По этой причине использование bool на чипах cortex M0 - добавляет очень странные телодвижения, которые трудно понимать на трезвую голову.
  4. Там название чипа должно быть, полное, без сокращений.
  5. Неверно, все адресные линии используются для инсталла, но А12 не используется для адресации в mt48lc16 чипе. Эту линию можно посадить на землю, там всегда должен быть ноль. Просто адресные линии чипа ST и адресные линии внешней памяти - это немного разные вещи. Начнём с того что на внешнем чипе А0 - это выборка в строке и столбце, команды подаются раздельно, и на выхлопе всегда данные в полной разрядности чипа. Это свойство позволяет использовать память с выхлопом в два бита данных - просто увеличивая количество микросхем памяти до необходимой ширины шины данных. В настройках sdram указывается ширина выборки страниц, которая физически зависит от объёма памяти делённое на 4096 бит (ширина страницы) и ещё на количество банков. А12 уже отпадает как адрес, и используется в выборе банка. Выборка в пределах страницы настраивается косвенно, по ширине линий данных на чипе ST (указывается). При этом DQM0~3, - это проекция адресных линий A0-A1. Интерфейс sdram может быстро читать блоком - всю страницу разом. Но количество внешних микросхем бывает разным, а сама внешняя память об этом ничего не знает. Есть настройка для чтения потоком, как для ST, так и для внешней памяти. По умолчанию записано и считается что подключена одна внешняя микросхема памяти, в этом случае ничего изобретать не нужно. Для mt48lc16 адрес формируется так: DQM0, DQM1 (А0), быстрое чтение внутри строки (А1-А8), выборка строки (А9-А21), выбор банка (А22-А23). Вот это А0-А23 - это проекция адресного пространства ST на внешнюю память, к нему ещё и смещение добавляется. А то что там из чипа торчит, и как подписано - с реальностью отношения не имеет. И ещё. У меня есть большая подборка журналов схемотехника, большое количество схем из интернетов, а так-же бумажная макулатура от советского наследия (хорошо горит между прочим). Дык вот, каждая вторая схема имеет ошибки!!! Ошибок нет там, где есть обратная связь между шансом появления ошибки - и доходом автора схемы. Например техническая документация на микросхему. А вот публичная схема с участим этой микросхемы - может содержать ошибку, потому как автору глубоко пофиг.
  6. Ну не знаю, A0 это всегда SDRAM_A0. Сама память отдаёт по младшему адресу все 16 бит разом. DQM0, DQM1 - это как-раз для управления отдельными байтами. Периферийный блок sdram в ST - самостоятельно рулит адресацию, если его верно настроить. А то что на схеме приклеено - просто не должно работать, внешний чип памяти инициализируется адресными линиями.
  7. У вас не получится использовать все имеющиеся прерывания чисто физически. Потому как не получится задействовать всю имеющуюся периферию - ног мк не хватит. Более того - периферия условно делится на быструю и медленную. Можно одним единственным быстрым прерыванием намертво повесить мк, тогда как другие просто не способны срабатывать быстро.
  8. Вооот, а иногда даже не 5% - а ниже требуемого времени на переключение, и тогда оно зависает в непонятном состоянии. Просто для пользователей фриортос, добровольное переключение - это настолько редкая команда, что её почти никто не использует. Для моей ос, добровольное переключение os_pass() - наверное самая важная команда. От неё зависит общее быстродействие всей системы. И применяется она буквально во всех местах, где требуется ожидание внешней реакции. При этом системный таймер на 1мс может оказаться в тысячи раз медленнее шрейдера задач (когда нечего делать). Но и проверять состояние спящих тысячу раз за 1мс - тоже глупо (в системной задаче). Потому таймеров две штуки, и вот они действительно никак не связаны между собой.
  9. Сколько времени назначить новой задаче при добровольном переключении? Остаток неиспользованного времени, или пересчитать новое время - с перезапуском таймера?
  10. И что, системное время при этом не сбивается? А то у меня был такой промежуточный вариант на одном таймере (сейчас два). Для коррекции системного времени приходилось делать массу телодвижений, да ещё и на асме(в котором я потом вообще запутался) . Но ошибка всё равно накапливалась с очень слабым прогнозом (в + или -), отчего счётчик системного времени превращался в показометр попугаев. То-есть приходилось запускать второй счётчик реального времени, чтобы хоть как-то выйти из положения. Сейчас два физических счётчика: время работы задач, и системное время. Работают независимо и синхронно, без ошибок и лишнего кода.
  11. Любую не получится, точнее работать будет - но в N раз медленнее. Тут весь прикол - с какой стороны происходит управление. Любая ос с приоритетами и вытеснением - даёт задаче фиксированное время работы. Это время фиксировано, буквально. Даже если задаче нечего делать, и она готова отдать своё время - всё равно придётся ждать стандартные 1мс + остальные задачи + работу планировщика. На новом витке эта задача уже будет с иным приоритетом, и может даже не запустится. Но первоначальная задержка всё-таки сохраниться. А там ещё и гонка появится - то ещё удовольствие. Гораздо проще когда задача сама решает свою судьбу, вот прямо здесь и сейчас. Тем-более что это решение получается гораздо более быстрым чем через работу планировщика.
  12. Есть два основных подхода решения почти всех задач: по важности (когда уже жопа горит), и к моменту актуальности готового решения. Вот когда нужно прямо сейчас: начинается запрещение прерываний, кастование приоритетами, и даже разгон частоты мк. Девайсы с таким подходом обычно тормозят в самых неожиданных местах, непредсказуемо. Наличие и тип ос не влияет на конечный результат. В любом случае получится дёрганный уродец, без шанса понравится пользователю. Второй вариант когда все активные задачи выполняются с равным приоритетом запуска но разным временем работы. Нормированная по времени задержка получается почти автоматически (если не делать глупостей). А тройной буфер спасает любую безвыходную ситуацию. Я говорю про активные задачи, которым есть чего делать - все остальные либо отправляются в сон, либо замораживаются, либо отдают своё время чтобы не отсвечивать. Всё это есть в вытесняющей ос, но не столь гибко как у меня.
  13. Просто есть несколько типов ос: с приоритетами в задачах, и с переключением по таймеру, и смешанное управление. Они разные, и время реакции у них разное, и способ применения, и даже области использования разные. Если вам пока ещё не надо, это не означает что инструмент плохой. Просто у вас нет задачи для этого инструмента.
  14. Спрашивай, если чего непонятно. У меня где-то валяются старые версии, без математики. Просто М3 сейчас не применяю, а для М0 ось уже избыточна.