Jump to content

    

AVI-crak

Участник
  • Content Count

    234
  • Joined

  • Last visited

Everything posted by AVI-crak


  1. __LDREX __STREX в STM32F407

    Проверять нужно кодом на асме, чтобы gcc не наоптимизировал записи до нуля. Тестовую запись нужно сбрасывать в память принудительно, с ожиданием завершения физической записи. Неявная запись (PUSH) - является отложенным событием (как и любая запись кучи регистров), код выполняется параллельно, сбросить физику с подтверждением не получится, но можно немного подождать в пустом цикле или сбросить конвейер. И наверное главное, давайте указывать явно - какой чип в тесте на данный момент.
  2. __LDREX __STREX в STM32F407

    Цитата(jcxz @ Jun 6 2017, 14:20) 1. зачем оно нужно? 2. где про это сказано? 3. exclusive monitor относится к ядру, а DMA- и прочие bus-masters к ядру не относятся и у каждого МК-мэйкера свои. Это результат проверки с отладчиком на реальном камне М3-7. В последнее время я чаще доверяю собственным экспериментам, чем расплывчатому переводу гугла. Кстати, чтобы убрать последствия действий самого отладчика - точки останова необходимо ставить за пределами тестовой функции, иначе будут увлекательные результаты. Цитата(KnightIgor @ Jun 6 2017, 16:22) Да кто же его знает! Однако, такое возможно. Например, прерывание, сделав дело и установив флаг, запрещает прерывания до момента Находясь в прерывании нельзя запретить само прерывание, получите сбой. Однако можно сбросить те сработавшие прерывания - что имеют более низкий приоритет, те что находятся в ожидании. Но не те что уже сработали и были вытеснены. Иначе будет разрушение стека. Кстати, эти действия могут понадобится в случае просто огромного кода в теле прерывания. То-есть нужно сначала создать себе проблемы, и только потом героически их решать. Юзайте SVC, и будет вам счастье.
  3. __LDREX __STREX в STM32F407

    Цитата(jcxz @ Jun 6 2017, 03:35) Монитор эксклюзивного доступа не контролирует адрес. Об этом явно сказано в мануале. Да и как вы это себе представляете? Если у процессора 4гига адресное пространство - это-ж нужна 4^32 триггеров иметь в CPU - для каждого адреса. Там всё просто, один единственный 32b регистр и схема сравнения на коммутаторе памяти, уже после арбитра и коммутатора нагрузки. Эти команды не выполняются целиком и полностью в ядре мк, они большей частью размазаны по всему кристаллу. Точно так-же как и команды DSB, ISB, ISB, WFE, и так далее.
  4. Cortex-A7 1GHz + 64Mbyte DDR2 + Eth phy on chip

    Цитата(mantech @ Jun 6 2017, 01:57) В мк с несколькими сотнями кб оперативки это может и проблема, но здесь прошивка копируется в озу и там исполняется, так что не вижу проблем.. Проблема проявится при использовании сна. Например М0-М7 просыпаются мгновенно, М7 умудряется так-же мгновенно прочитать почти всю флешь. А держать питание на ddr - батарейки сдохнут.
  5. Cortex-A7 1GHz + 64Mbyte DDR2 + Eth phy on chip

    Цитата(jcxz @ Jun 5 2017, 20:26) Кто-ж сейчас вручную паяет? Разве что Слесарь в своём гараже Здравствуйте, я слесарь и у меня есть гараж, могу паять ручным способом 0,4мм и ниже. Кстати, у этого проца используется внешняя spi флешка в качестве программной памяти, и бут с неё грузится. Но следов шифрования не видно, первоначальный BROM - 32к - одноразовый, штампуется на заводе. Внешняя флешка не имеет проекции на линейную память, после копирования в память - не используется. Подключение не в квадро режиме, то-есть медленное. И это огромное количество линий питания, с разным напряжением и током... Оно меня бесит. Однако в качестве игрушки - вполне годится. Сейчас у каждого второго есть лишние мониторы, а то и планшеты - подножный корм.
  6. __LDREX __STREX в STM32F407

    Цитата(_lexa_ @ Jun 5 2017, 23:40) Спасибо за ссылку. Узнал много интересного. В частности, что LDREX/STREX, по крайней мере для STM32 на cortex-m4, не могут использоваться для синхронизации доступа к памяти, т.к. любое прерывание сбрасывает тег монитор и все дальнейшее выполнение программы происходит, как будто LDREX до этого не выполнялась. Бесполезность LDREX/STREX для синхронизации косвенно подтверждается еще и тем, что в CMSIS-RTOS эти команды в мутексах и семафорах не используются. Сброс тег монитора из потока в прерывание - это нормальное поведение LDREX/STREX, именно для этого они и задумывались. Нет широкого распространения по другой причине - память должна подключаться к ядру без цепочек ускорителей. То-есть команды LDREX/STREX гарантированно выполняются на всех arm чипах, но не на всей используемой памяти. Делить на можно/нельзя - слишком сложно, проще не использовать вовсе. Однако применение LDREX/STREX даёт очень ощутимое ускорение на операциях с атомарными флагами. Словом можно - если руки растут из нужного места. Весь смысл в том чтобы не испортить другие флаги.
  7. __LDREX __STREX в STM32F407

    Начали за упокой, кончили за здравие. Как уже было сказано, LDREX выставляет атомарный флаг при использовании команды в потоке, конкретно на используемый адрес. Точнее конкретный адрес чтения выставляется на мониторе, и отслеживается аппаратными механизмами сразу на интерфейсе памяти. Атомарный флаг может сбросить любое прерывание, любое аппаратное чтение/запись по этому адресу (например DMA). Флаг не сбрасывается в момент применения команды LDREX в прерывании и перебивании его более высоким приоритетом. Отчего костыль для использования в прерывании содержит собственный сброс до и после. STREX выполняется, или не выполняется без использования программной проверки атомарного флага, этот механизм выполнен полностью аппаратно. STREX выдаёт флаг, видимый для программы - для проверки успешности операции. Выполнение STREX в потоке - автоматически сбрасывает атомарный флаг, не важно какой результат успеха. Использование в прерывании STREX не гарантирует сброс, но успешно и корректно выставляет программный флаг для проверки операции. Мойте перед и зад - это есть костыль. +Ещё один важный прикол - конвейер. Лучше перебздеть, и подтверждать полный сброс данных в память. +Ещё грабли - LDREX STREX могут применяться на той памяти, что имеет прямое подключение к ядру мк. Например в М7 часть памяти заведена через ускоритель, в результате применение LDREX STREX моментально вешает мк. ------------ SVC - безусловное прерывание. Отрабатывается без вытеснения из любой позиции. Перебить SVC - просто невозможно. SVC - это рыба для сервисов ОС, с небольшим количеством шаманства - превращается в очень удобную функцию. У меня на SVC полностью работает собственная ось.
  8. Не получается запустить SEGGER RTT

    Цитата(Reflector @ May 20 2017, 16:08) меняй имена как хочешь Можно менять размеры буферов от 128б до "сколько влезет", остальное завязано на плагин - который работает на большой машине. По ссылкам нет си исходников плагина для ID.
  9. Не получается запустить SEGGER RTT

    Цитата(nanorobot @ May 20 2017, 04:15) Признаюсь честно - мало чего понял.. : Зато есть куда расти... Понимать следует буквально, нельзя менять названия массивов и структур - RTT перестаёт их находить. Ещё одна вещь, технология RTT выполняет одну попытку поиска своих данных. По этой причине инициализация структур и массивов должна выполняться до первой контрольной точки, чаще всего это шапка майна. Библиотека от RTT (без вмешательства) - инициализирует свои данные до майна.
  10. Не получается запустить SEGGER RTT

    RTT технология примечательна тем, что требует уникальных первичных имён переменных и массивов. Если менять имена - то плагин не сможет найти свои данные. Так-же записывается уникальный паттерн в область первого массива на передачу. У него есть стандартная голова, тело - размеры массивов и их местоположение, и пассивное заполнение остатка. Массив не может быть меньше 128 байт. Недостаток технологии - в способе сборки. RTT, также как и EBmonitor поставляется в виде собранной библиотеки, которая уже на стадии линковки подключается к проекту. При этом в самой библиотеке имеется место где переключается тип ядра, это сделано для универсальности. Это-же свойство может стать основной проблемой при сборке проекта. Например при использовании собственного алгоритма выделения памяти - будет вечный сбой. При отладке без выхода из режима программирования - отладчику доступно все использующиеся символьные имена проекта, в этом случае поиск по паттерну не используется. При горячем "подключении" (без ресета) - наличие паттерна - обязательно. RTT и EBmonitor - полные клоны. Могу предложить код который получился для EBmonitor. https://bitbucket.org/AVI-crak/rtos-cortex-...le-view-default
  11. Запрет остановки / паузы отладки

    Цитата(nanorobot @ May 19 2017, 11:36) Есть ли возможность запретить остановку прогаммы JLink-ом на каком то интервале программного кода? Классический интерфейс SW отладки всегда останавливает программу для обновления переменных в отладчике. Есть вариант использовать трассировку через интерфейс jtag. В этом случае можно не останавливать программу, но количество переменных для одновременного просмотра будет ограничено, точнее количество участков памяти - блок памяти можно скидывать целиком. Есть ещё вариант использования SWO - однонаправленная связь, чисто для лога. И ещё вариант использования RTT технологии от https://www.segger.com/systemview.html?p=1731, и EBmonitor от https://www.embitz.org/forum/thread-647.html. Это клоны. Двухсторонняя связь без остановки программы через SW. Более дешёвый и быстрый вариант - банальный usart. Для него придётся писать собственный обработчик событий. А так-же желательно использование оптической развязки. В этом варианте подобный интерфейс может использоваться даже на установленном оборудовании, чего лишены все остальные варианты.
  12. Это лишено практического смысла. Есть вариант внешнего гуна на несколько диапазонов, с классическим управлением через два таймера с накоплением и одновременным сбросом. Вариант имеет право на жизнь в случае использования stm32f105-107 и кварца OXCO. Получится прибор с рыночной стоимостью около 500к рубликов, и запредельной точностью фазы и частоты. Выше только атомный стандарт. Но зачем такое дома? После постановки задачи и условий - можно начинать закупаться детальками. Можно сделать всё то-же самое из подножного хлама, качество будет соответствующим, но программное обеспечение практически инцидентным с дорогим вариантом.
  13. STM32F746 и внешняя SRAM

    В полях mpu для внешней памяти включить совместное использование. Тогда шина будет принудительно морозить cpu и dma на операциях чтения/записи до завершения цикла. Актуально для М4-7.
  14. LPC1788 и EMC

    Цитата(Metallist64 @ Jan 30 2017, 17:46) Спасибо за такой полный ответ. К сожалению я не совсем в него въехал. Фигасе, даже на почту прилетело, а почта медленная. Мк не может игнорировать адрес, чисто физически. Если он куда-то пишет данные - то ему необходим чёткий адрес. А вот инициализация ножек мк для линий адреса -это уже другое дело. Если таковые не используются конечным устройством - то их можно и даже нужно занять другой полезной функцией, не связанной с EMC. Всё остальное как выше по тексту. 27 дней прошло, обычно на решение подобной проблемы отводится один вечер.
  15. LPC1788 и EMC

    Цитата(Metallist64 @ Jan 29 2017, 15:07) Есть ли возможность использовать EMC (LPC1778) для управления LCD с шиной данных - 8 бит(контроллер KS108). НО без шины адреса (в таких вещах обычно отсутствует)?! Чип KS108 кроме линий данных имеет управляющие сигналы: команда/данные (rs) чтение/запись (r/w) активизация интерфейса (eс) сброс (reset). Одну линию адреса придётся повесить на rs, иначе не будет возможности разделить команды и данные. Есть возможность для фокуса. Линия адреса не обязательно должна быть А0. Можно использовать старший адрес, в линкере назначить индикатору адресное пространство ниже на одну команду. Примерно так(пример для 16бит шины) : LCD (rw): ORIGIN = 0x600FFFFC, LENGTH = 2M ------- Код    .lcd (NOLOAD):   {     . = ALIGN(1);     _slcd = .;       /* create a global symbol at ccmram start */     *(.Alcd)     *(.Alcd*)     . = ALIGN(1);     _elcd = .;       /* create a global symbol at ccmram end */   } >LCD---------- новая структура Код#define ALCD            __attribute__((section(".Alcd"))) ALCD static struct {     volatile uint16_t nc;     volatile uint16_t reg;     volatile uint16_t data; }lcd; /// FMC_A19  LCD_RS---------- Теперь доступна запись в индикатор lcd.reg = 0xC1; lcd.data = 0x41; И небольшой фокус - запись потоком через дма, адрес для старта при этом &lcd.data. DMA будет автоматически увеличивать адрес, но для индикатора реально будет учитываться линия FMC_A19, которая постоянно будет в режиме "данные". Без перебирания адреса - шина может обнулить старые данные, даже если они не успели записаться.
  16. LPC1768 непонятное поведение

    Цитата(dpatrakov @ Jan 28 2017, 01:27) Встал в ступор куда копать не знаю A Memory Protection Unit (MPU) is included. Ожидание завершения операции записи в периферийное устройство с дробной системной частотой. Если отключить блок защиты MPU - начнутся такие весёлости, что вы сами добровольно и с песней побежите его включать.
  17. STM32F7XX аналог bit-banding

    Цитата(zltigo @ Dec 30 2016, 21:58) Вот здесь спустя много лет наступил https://electronix.ru/forum/index.php?showt...t&p=1374580. Залатал. Но причину так и не понял. Это и есть проблема атомарности в чистом виде. Вам необходимо настроить регионы mpu, включить сквозную запись в адресном пространстве регистров управления мк. Собственно это должна быть самая первая операция на мк имеющим собственный кеш. Далее, неважно насколько крута ось - важно что физические устройства должны иметь разный приоритет. Например банальный spi: при равных приоритетах на Rx и Tx - получим стабильный глюк. Причём приоритеты на тот-же spi имеются и в каналах dma и на само конечное прерывание. Разные приоритеты обработки для включённой периферии. Например sd карта может и подождать звуковой кодек. Цитата(jcxz @ Dec 30 2016, 19:03) Может приведёте здесь Ваш переключатель задач для classic ARM? Чтобы не быть голословным. Для cortex m7 переключатель получается жирным, необходимо сохранять много регистров. А точнее на 16 штук больше чем cortex m4. Ничего сложного: сохранить в стек r4-r11, и математику s16-s31, сохранить адрес стека в структуру задачи, остальное автоматически сохраняется в текущем стеке задачи. Восстанавливать так-же. Стеки под задачи разные, стек под прерывания один единственный. https://bitbucket.org/AVI-crak/rtos-cortex-m3-gcc/src
  18. STM32F7XX аналог bit-banding

    Цитата(zltigo @ Dec 29 2016, 18:30) Мне не очень интересно, поскольку вложенных прерываний для сколь-нибудь серьезных контроллеров, в том числе уже и мелких корексов, не использую принципиально. Вы серьёзно? Просто это как купить билет на самолёт, и отправится в путь пешком. Вложенные прерывания получаются автоматически, при назначении им разных приоритетов. Второе, обработка флагов регистров прерываний - это эксклюзивная, никому больше не нужная операция. Если прерывание перебивает другое на обработке флагов - ничего страшного не случится, адреса флагов не пересекаются. И не стоит забывать про call функции, которые в последнее время пихают куда попало, даже в обработчики прерываний. Посему, если есть возможность выстрелить себе в ногу - такой человек найдётся. Потом придётся искать глюк, который срабатывает синхронно с магнитными бурями на Марсе. Обработка глобальных флагов в прерывании должна завершаться CLREX, всё по той-же причине.
  19. STM32F7XX аналог bit-banding

    Цитата(jcxz @ Dec 28 2016, 16:48) А зачем Вы у себя использовали CLREX? Там написано что это снятие блокировки, но мне кажется это корявый перевод гугла. В реальности это очистка регистра адреса, который используется для мониторинга атомарного адреса. Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк. Поймал пару раз, теперь просто ставлю CLREX. В майне любое прерывание работает как CLREX, команда короткая и простая, к тому-же с явным указанием перезагрузки операторов "memory". Этот барьер запрещает GCC размазывать функцию по всему коду, как он это любит делать. ---------------- Есть мысли? как в функцию передать адрес члена битовой структуры??? Гугол молчит на эту тему, наверное это особо_извращённая методика программирования, возможная исключительно под грибами (запрещёнными Законодательством Российской Федерации). Грибы есть, мыслей нет.
  20. STM32F7XX аналог bit-banding

    Цитата(amiller @ Dec 26 2016, 16:11) Читаю документацию и вижу, что там никаких упоминаний про bit-banding при работе с оперативной памятью... Может появились неделимые операции "чтение-модификация-запись"? Атомарные операции не терялись. Вот только выглядят они как громадный костыль. Применимы к флагам которых безумно много, или как вариант - обязаны занимать минимальное место (не всегда правило). В общем у меня получатся так: глобальная структура с флагами ( ingl ) - цель, собрать в кучу мелкие имена флагов, строго 32б, ну и модификация с помощью стандартных команд __LDREXW и __STREXW. Поместил функции f_ask_с и f_ask_d в разные задачи, они там в цикле просто меняют свой флаг. Смысла в функции нет, потому как я не придумал способ передать указатель члена структуры (оно ниже физического адреса). Возможно можно перечислениями сделать, но как потом не запутаться - не знаю. Словом, если кто предложит решение - буду рад. CODEtypedef union { struct { uint32_t stop:5; uint32_t start:1; uint32_t a:1; uint32_t b:1; uint32_t c:1; uint32_t d:2; uint32_t e:1; uint32_t f:1; uint32_t g:1; uint32_t h:1; uint32_t i:1; uint32_t j:1; uint32_t k:1; uint32_t l:1; uint32_t m:1; uint32_t n:1; uint32_t o:1; uint32_t p:1; uint32_t q:1; uint32_t r:1; uint32_t s:1; uint32_t t:1; uint32_t u:1; uint32_t v:1; uint32_t w:1; uint32_t x:1; uint32_t y:1; uint32_t z:1; } Flags; uint32_t Flagi; } Flag_Type; Flag_Type ingl; static void f_ask_c (void); void f_ask_c (void) { Flag_Type tmp; do { tmp.Flagi = __LDREXW(&ingl.Flagi); tmp.Flags.c ^= 1; }while ( __STREXW(tmp.Flagi, &ingl.Flagi)); __CLREX(); } static void f_ask_d (void); void f_ask_d (void) { Flag_Type tmp; do { tmp.Flagi = __LDREXW(&ingl.Flagi); tmp.Flags.d ^= 1; }while ( __STREXW(tmp.Flagi, &ingl.Flagi)); __CLREX(); }
  21. Цитата(Obam @ Dec 13 2016, 15:06) Вот последнее, что надо изготовлять дома, так это 4-хслойки в режиме конвейера из-за охренненой ядовитости сопутствующих реактивов. Я говорил о бюджете 200к, там посчитана вентиляция, ванны гальваники, ванны травления и ванны проявки фоторезиста. Именно ванны, а не домашние тазики!!! К тому-же это не всегда большой вес и объём, а часто даже наоборот - всё очень миниатюрное, максимально плоское и вертикальное.
  22. http://www.pcbway.com/orderonline.aspx 100*100*1,6мм *5штук, 4 слоя, допуск 6/6mil, сквозные 0.3mm =48$ плата, 12$ доставка. Там ещё можно отдельно сбросить на доставке, но тогда они не гарантируют время. Кстати, китайцы продают реактивы для производства плат с переходными отверстиями (они всё продают), так-же как и текстолит 0,4мм, всё с бесплатной доставкой. Наборы как на один зуб, так и на вагон изделий, чем больше - тем дешевле. Общие затраты в пересчёте на ту-же плату 100*100 3~6 слой в домашних условиях ~ 300руб. (работу не учитываем) Есно нужно иметь горячий пресс, принтер с малыми геометрическими искажениями, ванну гальваники, и конечно качественную чпу сверлилку. Общее первоначальное вложение в данное направление для себя лично - более 200к. Самое дорогое - это принтер. Китайские подделки за 5к не подходят по уровню искажений. Идеальный вариант - станок прямой засветки фоторезиста. Набор может быть накопительным или кумулятивным, но ниже планка не опускается. Изготовлять 4 слоя дома получится только после покупки всего необходимого оборудования. Зато потом можно открывать свой собственный свечной заводик, примерно 4 платы в час в режиме конвейера. По получившемуся рисунку платы - размер переходных отверстий слишком мал. При заказе у китайцев получится дорого. Тут не в диаметре отверстия дело, а в размере пятака. У них разные нормы на совмещение трафаретов.
  23. Страх и ненависть в Лас-Вегасе - фильм, по сценарию которого назначались функции на лапы чипа st.
  24. Цитата(zheka @ Dec 11 2016, 22:27) Получилось (пока черновик) вот что. Что скажете? Переходы слишком малы для домашнего изготовления пп, а для заказа можно и 4 слоя сделать. Разница в ценнике не столь важна как потраченное время. Землю на двухслойке можно и нужно располагать с двух сторон, с таким расчётом что-б на просвет всегда земля была - сверху/снизу или одновременно. Гнаться за малыми габаритами нет смысла, вы уже отказались от 4х слоёв. Земля если и уходит в переход - то должна иметь минимум три точки в разных местах, идеально -треугольник. Аналоговую землю вести отдельной линией, токи там малые, но смещение в попугаях ацп может получиться большим. Керамика на питании, кроме VCAP 2-4мкф - остальное можно смело ставить 0,1 и 0404 размер. Возле стаба кубик больше габаритами, и rc цепочку, ну или электролит.
  25. [CENSORED] Разводка очень проста - подложка земля по всему пути вч линий, цвета и синхру нужно делить барьерами земли на стороне линий. Земли как можно больше. Иначе получится как у меня в первом варианте, дребезг произвольных разрядов rgb - помеха от sram.