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

    

Darth Vader

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о Darth Vader

  • Звание
    Частый гость

Посетители профиля

186 просмотров профиля
  1. Hidden Pin

    Тема "Вопросы начинающих", страница 38 - там ответ на этот вопрос.
  2. Просмотр переменных в STMStudio

    Не хватает точки запятой в конце. Или пустого блока из фигурных скобок. И не понятно, почему компилятор на это не ругается.
  3. Итог: настоящие джентльмены так не делают, но если очень надо - то можно. На том вопрос о целесообразности размещения объектов в адресном пространстве по абсолютным адресам вручную предлагаю закрыть. А то получается дискуссия типа: - скажите, где можно купить вкусное пиво? - не покупай его и не пей, оно вредно для здоровья.
  4. 2018 Вопросы начинающих

    В 17 и более ранних версиях - двойной клик по УГО - откроется окно свойств компонента -> Edit Pins -> Edit.. - открывается окно свойств пина. Там для скрытых выводов уже установлена галка Hide, остается только заполнить поле Connect To - вводим туда имя цепи к которой он должен быть подключен. Можно также откорректировать Display Name в соответствии с именем цепи, чтобы оно отображалось в таблице Component Pin Editor в столбце Name. На скриншоте обычный вывод. Но если установить галку Hide и назначить имя цепи в Connect To, то он исчезнет с УГО компонента, не будет отображаться на схеме и станет скрытым. Но при этом будет подключен к цепи с заданным вами именем.
  5. Обычно нет. Но есть и в этом случае исключения. Одно из них лежит на поверхности. Им пользуются все. И вы тоже. Только забываете об этом, т.к. это сделано кем-то до вас, вы же просто пользуетесь этим не задумываясь, и всё работает. Имеется ввиду адреса регистров управления ядром и периферией контроллера. Они расположены в адресном пространстве по строго заданным адресам. И в *.h-файле описания контроллера они определяются через указатели, приведением целого числа, равного базовому адресу периферийного устройства, к типу указателя на структуру этого устройства. В итоге, если раскрыть все дефайны, получится конструкция типа: // Обнуляем счётный регистр таймера: // TIMER_TypeDef - псевдоним типа структуры таймера // 0x40078000 - базовый адрес таймера // CNT - счётный регистр таймера ((TIMER_TypeDef *) 0x40078000)->CNT=0;
  6. Тем, что адрес размещения этого массива в памяти назначит линкер, а не я. Не всегда и не везде. Это общее правило, из которого есть исключения-частности, где ручное назначение адресов размещения оправдано. Например, я хочу, чтобы код программы и параметры конфигурации прибора не лежали в пределах одной страницы флеш-памяти, а были разнесены по разным. Или я хочу, чтобы код программы и параметры находились в двух разных микросхемах памяти, подключенных к конроллеру по внешней шине. Или программа в контроллере, а настройки/символы знакогенератора во внешней памяти. Вобщем, есть много разных ситуаций, когда ручное размещение константных объектов в адресном пространстве оправданно и целесообразно.
  7. В итоге к этому и пришел. Без директив никак. Стандартными средствами языка такое не получить, чтобы создать и одновременно инициализировать константный объект в области флеш-памяти по указателю на него.
  8. 2018 Вопросы начинающих

    А как можно посмотреть классы, сгенерированные при компиляции PCB-проекта? Их генерацию или отсутствие можно задавать галочками в опциях проекта на вкладке Class Generation. Но вот какие именно классы в итоге сгенерировались, как они называются и что в них входит посмотреть не удаётся. Да, если перейти к PCB, то там можно посмотреть классы в меню Design -> Classes... Но не всегда это дает полную картину. Например: 1. PCB в проекте ещё нет. Не добавлена, не сделана. Пока что есть только схема. Хотелось бы знать, какие классы с какими членами сгенерировались при её компиляции. 2. PCB в проекте уже есть, но при переносе изменений из схемы в PCB или наоборот между классами цепей схемы и PCB есть различия. Для полноты картины хотелось бы видеть, что за классы сгенерировались при компиляции схемы и какие классы есть в PCB. Если с просмотром классов в PCB проблем нет, то вот как поглядеть классы, сгенерированные в результате компиляции схемы?
  9. Нет. Я об этом не говорил. Автор темы - да, возможно. Моя же задача - разместить константную структуру в области флеш-памяти, одновременно инициализировав её при этом нужными мне значениями. Чтобы была возможность изменять некоторые параметры не затрагивая основную прошивку и не перекомпилируя и перезаливая программу. Пример со знакогенератором для матричного индикатора тоже очень подходящий. Там стоит та же задача, только размещать надо массив с начертанием символов.
  10. Изначальная задача (у меня) - инициализировать объект, разместив его по точному, заданному мной, адресу. Объект - структура с кучей полей - настроечных параметров. Указатель на объект сделать можно. Присвоить ему нужный адрес тоже. Разместить объект в памяти по этому указателю также можно. Но инициализировать такой объект одновременно с его объявлением через указатель нельзя. Далее, уже в самой программе, в функции main() или любой другой функции, можно присвоить значения его полям. По-отдельности каждому. Но мне надо не присвоить по-отдельности, а именно инициализировать все разом через список инициализации. В конечном итоге я должен получить, чтобы вместе с кодом программы в прошивке присутствовало значение этого объекта, которое будет зашито в область флеш-памяти по заданному адресу. Ещё один распространенный пример из этой серии - размещение таблицы символов знакогенератора для матричного индикатора в области флеш-памяти.
  11. Пришлось-таки использовать директивы. Чтобы скрыть компиляторозависимую часть кода - обернул её макросом. Пока что определил только часть для Кейла. Когда понадобится использовать код в других IDE с другими компиляторами - надо будет взамен #error определить соответствующие директивы размещения. #include <stdint.h> // Простая структура для примера struct MyConfig_st { uint8_t Field1; uint8_t Field2; uint8_t Field3; }; #define CONFIG_ADR 0x1E800 // Адрес структуры конфигурации в памяти EEPROM // Макрос атрибута размещения объекта по адресу ADR_VAL #if defined ( __CC_ARM ) // for ARM Compiler #define __AT_ADDR(ADR_VAL) __attribute__((at(ADR_VAL))) #elif defined ( __ICCARM__ ) // for IAR Compiler #error __AT_ADDR(ADR_VAL) не определён для компилятора IAR! #elif defined ( __GNUC__ ) // for GNU Compiler #error __AT_ADDR(ADR_VAL) не определён для компилятора GNU! #elif defined ( __TASKING__ ) // for TASKING Compiler #error __AT_ADDR(ADR_VAL) не определён для компилятора TASKING! #elif defined ( __CMCARM__ ) // for Phyton CMC-ARM Compiler #error __AT_ADDR(ADR_VAL) не определён для компилятора Phyton CMC-ARM! #else #error __AT_ADDR(ADR_VAL) не определён для используемого компилятора! #endif // Объявляем и инициализируем константную структуру конфигурации по адресу CONFIG_ADR const MyConfig_st MyConfig __AT_ADDR(CONFIG_ADR) ={0x66,0x41,0x7};
  12. 2018 Вопросы начинающих

    Нет. Есть такой тип компонентов - перемычки (Jumper). Если конт. площадки на одной ПП внутри заготовки соединить с такими же на другой ПП и назначить им Type=Jumper и одинаковое ненулевое значение JumperID, то Альтиум будет знать, что они соединены внешним проводом - перемычкой. Тогда никакого конфликта или ошибок не будет.
  13. 2018 Вопросы начинающих

    Нет. Это будут 3 проекта: два PCB- проекта, и один проект мультиборд. Причем у каждого из PCB-проектов будет своя схема. А то, что я имею ввиду, это один PCB-проект с одной схемой со сквозной нумерацией компонентов (она может состоять из нескольких листов), элементы которой раскиданы по двум или более печатным платам. Причем эти платы в проекте присутствуют именно в виде PCB, а не в виде ссылок на другие PCB-проекты. И нумерация компонентов на них полностью соответствует схеме.
  14. 2018 Вопросы начинающих

    Возможно, это не то, о чём был вопрос. А может и оно. Это появился новый тип проектов - прибор (или устройство). Т.е. несколько электрически и механически связанных между собой PCB, ЭРИ, соединителей, жгутов/проводов. Полезная штука. В предыдущих версиях этого не хватало. Из-за этого приходилось схему всего прибора делать, как PCB-проект, содержащий только листы схем без PCB. А функциональные блоки ( в т.ч. печатные платы) изображать прямоугольниками с контактными площадками (соединителями), чисто графически. Естественно, возможностей для автоматической проверки и выявления ошибок такого проекта было мало. А вопрос, возможно, был в том, что концепция PCB-проекта Альтиума - это один проект - одна печатная плата. А не появилась ли в 18 версии возможность результатом одного PCB-проекта иметь более одной печатной платы? Типа, раскидать схему на две PCB, а затем сделать из них склейку, связав цепи на платах перемычками из проводов?
  15. Для описанной задачи этого не требуется. Всё, что надо для этого знать я сообщил компилятору двумя макросами: #define CONFIG_ADR 0x20000 // Адрес стр-ры конфигурации в памяти EEPROM #define MyConfig_ptr ((MyConfig_st*)CONFIG_ADR) // Указатель на стр-ру конфигурации в памяти EEPROM и описанием типа (структуры) MyConfig_st. От языка/компилятора требуется лишь поддержка инициализации объекта по указателю на него (тот самый (MyConfig_st*)CONFIG_ADR ). А с этим, как оказалось, засада. Указатель создать можно. Его можно использовать в коде для обращения к объектам: записи/чтения в/из них значений. На этом принципе построено обращение ко всем регистрам периферии. Но вот инициализировать объект по нему списком инициализации почему-то оказалось нельзя. По имени объекта можно, а по указателю на него нельзя. Было бы можно - задача решилась бы. Жаль.