Перейти к содержанию
    

haker_fox

Модератор
  • Постов

    7 287
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Сообщения, опубликованные haker_fox


  1. 5 minutes ago, jcxz said:

    А разве удобно не устаналивать его?

    Гм. Здесь вопрос как раз удобства. Вообще, мне вчера пришла мысль ещё до создания этой темы, что VTOR и вообще все процедуры с манипуляцией таблицы векторов нужно делать в приложении. Это более универсальный подход. Но сейчас уже лень что-то переделывать. С другой стороны, что будет являться точкой входа в приложение? Разве не сама таблица векторов? Ведь, даже если она будет размещена в ОЗУ, то она где-то хранится после выключения питания. Поэтому, первые два адреса таблицы (стэк и старт) всё равно есть. Или я что-то не учитываю?

  2. 2 minutes ago, jcxz said:

    Тогда ведь вы не сможете свободно изменить адрес расположения вашего загружаемого для отладки образа.

    Так отладка запускается для приложения. А отладчику указывается адрес начала загрузчика. Т.е. при отладке приложения этот ключ сначала позволяет запустить загрузчик.

  3. Добрый день, коллеги!

     

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

     

    Итак, есть текущий способ измерения каких-то (неважно) параметров трубопровода выполняется по следующей схеме:

    image.thumb.png.ed4099c203666b8215a687995d647f7d.png

    Я стрелочками показал, что через вольтметр течёт ток, как и должно быть. Т.е. имеется замкнутый контур.

     

    Коллега утверждает, что можно делать так:

    image.thumb.png.ca079c5381bf5cb760a317026b1780ab.png

    Т.е. заменить гальваническую связь радиосвязью (неважно, какая частота, протокол и т.п.).

     

    Вопрос: как-то это вообще возможно? Может быть есть какие-то ссылки на статьи, опытные работы, или иные принципы, которые не имеют широкой огласки?

     

    P.S. Заранее благодарю)

  4. @VladislavS, @makc, коллеги, я понял, что Вы имеете в виду. Но в наших приложениях "ремап" таблицы векторов не требуется. По крайней мере за 10 лет мы эту возможность не использовали, кроме случая с загрузчиком. Если понадобится, то приложение это сделает, модифицировав VTOR.

  5. 17 minutes ago, VladislavS said:

    Почему приложение само себе VTOR не устанавливает? Ведь только оно знает где у него таблица векторов.

    Насколько я понимаю, загрузчик тоже обязан знать положение таблицы векторов приложения, иначе как он запустит это приложение?

  6. Выспался:angel:

    На свежую голову докладываю!

     

    Итак, стёр полностью МК. Зашил приложение с адреса 0x08008000. Начальный (стартовый адрес) процессора: 0x08000000 (GD32F450ZKT6). Запускаю отладку, старт идёт с адреса приложения, т.е. с 0x08008000. С адреса 0x08000000 записаны 0xff, там ПО выполняться не может: по адресу 0x08000004 находится адрес 0xffffffff. Т.е. IAR - действительно умный!

     

    Записываю в микроконтроллер загрузчик с адреса 0x08000000. Приложение остаётся записанным. Приложение запускается загрузчиком без отладки, как и должно быть.

     

    Зашиваю приложение под отладкой. По адресу 0x08000004 находится адрес начала программы загрузчика.

    image.thumb.png.49e9f7a6db56ebef075a80fef1698f73.png

    Ставлю туда точку останова:

    image.png.ffcc23dbb56197f102f5b0633e338893.png

    И никогда сюда не попадаю, отлаживая приложение. Вернее, сейчас отлаживать приложение бесполезно, т.к. VTOR = 0. Но всё же оно запускается до возникновения первого прерывания, которое реально обрабатывается, и неправильно, в области таблицы векторов загрузчика из-за некорректного VTOR.

     

    Итого, имею зашитые загрузчик и приложение. Под отладкой стартует сразу приложение. Без отладки, естественно, всё как и положено работает в штатном режиме.

     

    Добавляю отладчику ключ, указывающий расположение таблицы векторов. И говорю ему, что она расположена по адресу 0x08000000, т.е. в области записанного мной загрузчика.

    image.png.303703bd25a954e546fdb31bed091ffc.png

    Запускаю отладку приложения.

    Сразу попадаю на адрес начала загрузчика!

    image.png.bde43d763e2363432f8ed343bafb96e2.png

     

    Нажимаю F5, запускаю исполнение ПО и... всё работает! Т.е. мой загрузчик запускает приложение, VTOR имеет адекватное значение 0x08008000.

     

    Бррр.... Урра!:angel::blum::drinks::acute:

  7. Just now, jcxz said:

    PS: Никаких специальных телодвижений не делал - IAR у меня по умолчанию так делает (IAR 7.80.4 for ARM).

    Вы меня окончательно смутили)))) У меня 9.30.1 и за сегодняшний день о вёл себя по-разному. При этом в экспериментах я стирал всю память FLASH утилитой SEGGER J-Flash Lite... Ладно, сегодян у меня уже вечер. Завтра на свежую голову всё перепроверю.

  8. 8 minutes ago, Сергей Борщ said:

    Поскольку ИАР тоже использует формат .elf - наверняка в нем тоже есть подобный механизм.

    На текущий момент не знаю, что Вам ответить) С одной стороны, после перезагрузки компьютера с IAR всё стало работать ожидаемо. С другой стороны появилась альтернатива в виде отладки двух образов: и загрузчика и приложения. Понаблюдаю за ситуацией.

  9. 18 minutes ago, Сергей Борщ said:

    Странные проблемы.

    Согласен. Я и сам так думал. И ожидал такого поведения, т.к. микроконтроллеру ничего не остаётся, как начать исполнять код, где уже зашит мой загрузчик. Тем не менее, не получив такого поведения (VTOR был равен 0x00), я подумал, что может быть что-то изменилось в отладчике с выходом версии IAR 9.10. Но сейчас, перезагрузив компьютер, и запустив IAR заново, я получил ожидаемое поведение! Но все же подход, предложенный уважаемым @makc мне тоже интересен и полезен!

  10. 21 minutes ago, makc said:

    видели?

    Великолепно! То, что надо! Даже больше, чем я ожидал! Проверил, всё работает!

    P.S. Искал в документации, поставляемой с инструментарием (в .pdf файлах). Оказывается, много полезной информации и в онлайне.

  11. Добрый день, коллеги!

     

    Кучу документации от IAR бегло прочитал, но не могу найти зацепки. Прошу помощи.

     

    Есть загрузчик. Свой. Рабочий. Он зашит в микроконтроллер. Есть приложение. В процессе разработки, более-менее работает. Есть возможность указать отладчику шить приложение в своё адресное пространство, как обычно, но запускаться с другого адреса: адреса загрузчика? Т.е. я хочу, чтобы приложение под отладкой запускалось из под моего загрузчика? Или такое вообще невозможно?

     

    Либо, как указать отладчику модифицировать регистр VTOR под перемещённую таблицу векторов моего приложения (если такой вариант проще и вышеозвученный вопрос нереализуем)? Я понимаю, что в приложении можно насильно записывать в регистр VTOR адрес из скрипта линкера *.icf, но выглядит это, ИМХО, как-то немного некрасиво... Понимаю также, что отлаживать приложение можно без смещения, т.к. как единственное на микроконтроллере. Но хотелось бы так, как я описал выше.

     

    Заранее всем спасибо)

  12. 1 minute ago, stells said:

    то надо и телефонную зарядку в защитных перчатках в телефон засовывать

    У телефонной зарядки нет третьего контакта. Поэтому, не нужно. Но и в ванную с телефонной зарядкой всё же залезать не нужно) У осциллографов третий контакт предусмотрен.

    2 minutes ago, stells said:

    не ощущал их влияние

    Полагаю, что на чутьё здесь надеяться нельзя. Нужны измерения по каким-то методикам...

  13. 22 minutes ago, tgruzd said:

    всё заливается отладчиком и в целом удобно получается

    Я вот тоже подумал, если отладчик имеет доступ к шине AHP/APB, то какая разница контроллеру внешней памяти кто его программирует? Вы подтвердили мою догадку) Спасибо!

  14. 1 minute ago, Maxim_S said:

    Давно существуют приборы с гальванически развязанными каналами, например Fluke 199  и подобные

    Конечно существуют. У нас даже на работе есть такой оциллограф. Но вопрос всё же был в другом: почему именно сделано так, как сделано в большинстве моделей. Но ответы уже получены выше по теме.

  15. 5 hours ago, Mysteo said:

    Или флешку придется отдельно программировать ?

    Скорее всего именно так. Только не обязательно программировать. Можно поднять FatFs и хранить данные на флешки в виде обычных фалов. А само устройство может предоставлять доступ к диску, например, USB MSC. Мы именно так и делаем в наших приборах. На этапе настройки настройщик просто загружает необходимые данные на "диск". Но всё это сделано не ради загрузки данных, просто прибор в любом случае должен предоставлять пользователю возможность работать виртуальным диском. У такого подхода есть и недостаток: FatFS неустойчива к сбоям, как и любая (?) FAT.

    5 hours ago, Mysteo said:

    Или можно будет просто линковщику указать адрес внешней флэши и все нормально зальется ? 

    Обычно контроллер SPI NOR позволяет включить память в общее адресное пространство только для чтения. Для программирования нужно уметь отправлять команды. Вряд ли отладчик на такое способен, но здесь могу ошибаться.

    5 hours ago, Mysteo said:

    SDRAM как я понимаю более требовательна к ПП  

    Её используем. Это дешевле, чем SRAM. ПП четыре слоя. Особых заморочек в трассировке не наблюдал: проводники как можно короче, земляной полигон, конденсаторы по питанию. Частота 100 МГц.

  16. Кстати, классный документ от старой доброй HP! Может быть кому-то будет полезен) После его прочтения и стали возникать дополнительные вопросы...

     

    [HP]. AN-123. Floating Measurements and Guarding.pdf

    • Upvote 1
  17. Добрый день, коллеги!

     

    Понадобилось в очередном проекте убрать почти все драйвера устройств, обработчики прерываний которых прописаны в startup-файле. И не получается этого сделать, т.к. с использованием методов класса нет аналога __weak-функций.

     

    Вот фрагмент файла:

    Spoiler
    extern unsigned char CSTACK$$Limit;
    #pragma location = ".intvec"
    extern "C" const __root VectorEntry_t __vector_table[256] = {
        {.pStack = &CSTACK$$Limit },                            // stack                      VectorNum 0
        {.pHandler = reset        },                            // reset                      VectorNum 1
        defaultCoreHandler,                                     // NMI                        VectorNum 2
        hardFaultHandlerAsm,                                    // HardFault                  VectorNum 3
        defaultCoreHandler,                                     // MemManage                  VectorNum 4
        defaultCoreHandler,                                     // BusFault                   VectorNum 5
        defaultCoreHandler,                                     // UsageFault                 VectorNum 6
        defaultCoreHandler,                                     // Reserved                   VectorNum 7
        defaultCoreHandler,                                     // Reserved                   VectorNum 8
        defaultCoreHandler,                                     // Reserved                   VectorNum 9
        defaultCoreHandler,                                     // Reserved                   VectorNum 10
        vPortSVCHandler,                                        // SVC                        VectorNum 11
        defaultCoreHandler,                                     // Reserved                   VectorNum 12
        defaultCoreHandler,                                     // Reserved                   VectorNum 13
        xPortPendSVHandler,                                     // PendSV                     VectorNum 14
        xPortSysTickHandler,                                    // SysTick                    VectorNum 15
    
        defaultCoreHandler,                                     // your irq handler           VectorNum 16,  IRQ00
        defaultCoreHandler,                                     // your irq handler           VectorNum 17,  IRQ01
        defaultCoreHandler,                                     // your irq handler           VectorNum 18,  IRQ02
        defaultCoreHandler,                                     // your irq handler           VectorNum 19,  IRQ03
        defaultCoreHandler,                                     // your irq handler           VectorNum 20,  IRQ04
        defaultCoreHandler,                                     // your irq handler           VectorNum 21,  IRQ05
        defaultCoreHandler,                                     // your irq handler           VectorNum 22,  IRQ06
        defaultCoreHandler,                                     // your irq handler           VectorNum 23,  IRQ07
        defaultCoreHandler,                                     // your irq handler           VectorNum 24,  IRQ08
        defaultCoreHandler,                                     // your irq handler           VectorNum 25,  IRQ09
        defaultCoreHandler,                                     // your irq handler           VectorNum 26,  IRQ10
        defaultCoreHandler,                                     // your irq handler           VectorNum 27,  IRQ11
        defaultCoreHandler,                                     // your irq handler           VectorNum 28,  IRQ12
        defaultCoreHandler,                                     // your irq handler           VectorNum 29,  IRQ13
        defaultCoreHandler,                                     // your irq handler           VectorNum 30,  IRQ14
        defaultCoreHandler,                                     // your irq handler           VectorNum 31,  IRQ15
        defaultCoreHandler,                                     // your irq handler           VectorNum 32,  IRQ16
        defaultCoreHandler,                                     // your irq handler           VectorNum 33,  IRQ17
        defaultCoreHandler,                                     // your irq handler           VectorNum 34,  IRQ18
        defaultCoreHandler,                                     // your irq handler           VectorNum 35,  IRQ19
        defaultCoreHandler,                                     // your irq handler           VectorNum 36,  IRQ20
        defaultCoreHandler,                                     // your irq handler           VectorNum 37,  IRQ21
        defaultCoreHandler,                                     // your irq handler           VectorNum 38,  IRQ22
        defaultCoreHandler,                                     // your irq handler           VectorNum 39,  IRQ23
        defaultCoreHandler,                                     // your irq handler           VectorNum 40,  IRQ24
        defaultCoreHandler,                                     // your irq handler           VectorNum 41,  IRQ25
        defaultCoreHandler,                                     // your irq handler           VectorNum 42,  IRQ26
        defaultCoreHandler,                                     // your irq handler           VectorNum 43,  IRQ27
        defaultCoreHandler,                                     // your irq handler           VectorNum 44,  IRQ28
        defaultCoreHandler,                                     // your irq handler           VectorNum 45,  IRQ29
        defaultCoreHandler,                                     // your irq handler           VectorNum 46,  IRQ30
        defaultCoreHandler,                                     // your irq handler           VectorNum 47,  IRQ31
        defaultCoreHandler,                                     // your irq handler           VectorNum 48,  IRQ32
        defaultCoreHandler,                                     // your irq handler           VectorNum 49,  IRQ33
        defaultCoreHandler,                                     // your irq handler           VectorNum 50,  IRQ34
        SpiDrv::MakeIsr<SpiDrv::Num::N0>,                       // your irq handler           VectorNum 51,  IRQ35
        SpiDrv::MakeIsr<SpiDrv::Num::N1>,                       // your irq handler           VectorNum 52,  IRQ36
        UsartDrv::MakeIsr<UsartDrv::Num::N0>,                   // uSart0                     VectorNum 53,  IRQ37
        UsartDrv::MakeIsr<UsartDrv::Num::N1>,                   // uSart1                     VectorNum 54,  IRQ38
        UsartDrv::MakeIsr<UsartDrv::Num::N2>,                   // uSart2                     VectorNum 55,  IRQ39

    Внизу, да и далее по файлу, находятся обработчики прерываний, которые ещё и прописаны (для ускорения вызова) в заголовчных файлах каждого драйвера. Вообще, startup-файл на Си++ и был изначально нужен, чтобы красиво вызывать обработчики, но не предполагалось, что их не будет. А в текущем проекте их нет. И как выйти из ситуации - непонятно. Прямо хоть возвращайся к старому-доброму вызову обработчиков в Си-стиле с модификатором слабого связывания (линковки) __weak. В таком случае, если какой-то драйвер (файл на Си или Си++) не откомпилирован, т.е. отсутствует в проекте, линковщик подставит вызов функции по умолчанию. Но может быть есть какой-то красивый способ сделать подобное в Си++ с методами класса?

  18. 49 minutes ago, haker_fox said:

    1. А если подключить осциллограф через разделительный трансформатор с малой проходной ёмкостью (PE осциллографа естественно никуда не подключено), будут ли какие-то побочные эффекты от такого включения?

    Прочитал. Будут. Особенно, если "тыкаться" таким отвязанным осиллографом в сетевой источник питания. На экранах BNC осциллографа будет потенциально опасное напряжение.

    6 minutes ago, dOb said:

    Многие мультиметры  так сделаны.

    Многие. А Вы видели исключения? Т.е. мультиметры, у которых LO соединён с заземлением? Даже интересно стало...

    2 minutes ago, vervs said:

    Скорее всего из соображений электробезопасности.

    Понял.

    2 minutes ago, vervs said:

    2. маловероятно

    Понял. Спасибо!

     

  19. 1 minute ago, novikovfb said:

    Еще раз. За отдельные деньги можете приобрести дифференциальный щуп или осциллограф с дифференциальным входом.

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

    Дополнительно:

    1. А если подключить осциллограф через разделительный трансформатор с малой проходной ёмкостью (PE осциллографа естественно никуда не подключено), будут ли какие-то побочные эффекты от такого включения?

    2. Как ухдшаться метрологические свойства осциллографа при отсуствии его заземления?

     

  20. 41 minutes ago, novikovfb said:

    Даже настольный мультиметр на это не способен без изрядной посторонней помощи.

    И тем не менее, они же есть. Ни одного не видел, у которого клемма LO была связана с заземлением.

    42 minutes ago, novikovfb said:

    Почему - сложнее схемотехника (емкость между общим проводом и корпусом, а также - цепями питания делает свое черное дело).

    Т.е. осциллограф стоит особняком из-за того, что его измерительные схемы работают на высоких частотах, которых нет в мультиметре?

  21. Добрый день, коллеги!

     

    Собственно, вопрос в теме. По крайней мере у большинства осциллографов, которые я видел.

     

    В то же время, у настольных мультиметров, питаемых от сети, измерительная часть с входными разъёмами гальванически изолирована от Earth.

     

    Не могу найти объяснения этому. Логично было бы делать измерительную часть осциллографов отвязанную от заземления...

  22. 3 minutes ago, Aries said:

    Вы предлагаете оставить как есть ?

    1. Ничего не предлагаю. Лишь дал объяснение ругани линкера.

    2. Я не разбираюсь в микроконтроллерах MSP430.

    3. Вам нужно разобраться самому, либо подождать помощи квалицифрованных коллег на форуме.

    4. Вы даёте крайне мало информации. Вы пишите: "подменил строку". Но непонятно, какая была строка? Что Вы заменили...

×
×
  • Создать...