Jump to content

    

Darth Vader

Участник
  • Content Count

    187
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Darth Vader

  • Rank
    Частый гость

Recent Profile Visitors

689 profile views
  1. А ещё инсталлятор CubeIDE не может начать установку программы из папки, путь к которой содержит кириллицу! Инсталлятор, Карл !!! И кто-то из них, то ли CubeIDE, то ли CubeMX, то ли оба некорректно работают в системе из под пользователя с кириллицей. Создают в папке c:\Users\ ещё 2 папки с длинными именами-кракозябрами. Вобщем, тушите свет.
  2. Шёл 2020 год, а ПО так и не научилось корректно работать с кириллицей. Словно снова попал в 97.
  3. Ещё один баг. CubeMX 5.5.0, STM32CubeF1 Firmware Package V1.8.0 генерация кода для MDK-ARM. Если в пути к папке с проектом (или в имени проекта) имеется кириллица - проект генерируется с ошибкой. В проект не добавляется стартап. Хотя он и лежит там. Приходится добавлять вручную. Сам Куб при этом предупреждает, что с проектом что-то не так - есть проблемы.
  4. Посмотрите энциклопедию знаний Амперки. Там есть раздел по программированию на С++. Не бойтесь, плюсы там лишь для красного словца. До ООП там дело не доходит, всё ограничивается Си-подмножеством, базовыми понятиями. Ну и впринципе на сайте Амперки много информации по Ардуино.
  5. И можно будет смело претендовать на должность заместителя директора российского офиса Альтиум. Как минимум.
  6. Нельзя. Делите большую схему на несколько листов. Работать с длиными портянками (А2х5 и т.п.) неудобно.
  7. В версии 6.40 Последовательность не помню. Подбирал экспериментально. Попробуйте сначала FlashDL, потомFlashBP и JFlash. Не требует обновлений - нормально. Для v8 ничегонового не появляется. Для них последняя прошивка от ноября 2014 года.
  8. Выделение места под стек и кучу в Си

    На первом этапе я хотел полностью повторить ассемблерный стартап в части резервирования места под кучу и стек но на С/С++. Т.е. объявить дефайнами размеры стека и кучи, объявить 2 массива соответствующих размеров. Один резервирует память под стек, второй под кучу. На втором добавить ещё пару дефайнов - адреса размещения стека и кучи в памяти и атрибуты __attribute__((at(address))) для масивов, чтобы поместить их в нужные мне места. Вот, собственно, вся задача. А потом возник вопрос, а не следует ли как-то дополнительно сообщить компилятору/линкеру об адресах размещения и размерах областей стека и кучи? Если этого не сделать, то где компилятор выделит память под объект, встретив в коде malloc() или new() ? В конечном итоге полностью отказаться от ассемблерного стартапа, заменив его на С\С++ стартап.
  9. Выделение места под стек и кучу в Си

    Читал. Там нет ничего про __heap_limit, __stack_base и пр. Попробуйте сами. Например тут. Просто стало интересно. Почему нельзя самому определить массивы нужных размеров, разместить их в памяти по нужному тебе адресу директивами типа __attribute__((at(address))), занести конечный адрес массива стека в таблицу векторов и быть счастливым. Потом возникли вопросы, а нужно ли как-то сообщить о границах стека и кучи компилятору/линкеру. Стал искать, что значат магические слова __heap_limit, __stack_base и пр. из ассемблерного стартапа. К своему удивлению, не нашел их упоминания ни в описании компилятора, ни линкера. Поиском нашел их в совершенно неожиданных местах тут. Но вопросы остались. Почему их надо объявлять именно в ассемблерных файлах или в ассемблерных вставках? Чем их объявление через #define в C/C++ файле хуже, чем через EQU в ассемблерном? Чем "настоящая" куча отличается от "ненастоящей"? Я думал, что куча - она одна для всего. Все используют её. И я в своём коде, и все стандартные и нестандартные функции. Как стек - он ведь один для всех. Вот почему в ассемблерном файле всё просто, а в С/С++ так сложно? Я надеялся обойтись четырьмя дефайнами (адреса размещения и размеры стека и кучи) и двумя массивами (под стек и под кучу).
  10. Как в Си-файле выделить место под стек и кучу? Компилятор ARM 5.06 (среда Keil MDK ARM 5.24). Имеется стандартный ассемблерный файл Startup.s из CMSIS. Показан фрагмент, где резервируется память под стек и кучу. Хочу сделать его аналог на Си. Как объявлять таблицу векторов прерываний много где описано - в любой теме про загрузчики есть эта информация. А вот как выделить (зарезервировать) память под стек и кучу нигде не находил. Предлагаю здесь обсудить этот вопрос. Изначально я хотел сделать так: объявить два массива байт с выравниванием по границе 8 байт: один под стек, второй под кучу. Размеры задать константами, объявленными, как макросы через #define. Адрес конца массива под стек занести в начало таблицы векторов прерываний. Встал вопрос: а нужно ли как-то сообщить компилятору/линкеру о размещении и размерах стека и кучи? Оказалось, что да, надо. Здесь пишут, что надо определить имена: __initial_sp, __heap_base, __heap_limit. Вот по их использованию есть несколько вопросов: 1. В примере по ссылке в ассемблерной вставке эти имена только определяются. Резервирование памяти в явном виде, как в ассемблерном стартапе, не происходит. Вопрос: почему? Ведь в ассемблерном стартапе память под стек и кучу явно выделяется директивой SPACE. 2. Почему их надо определять именно в ассемблерном коде? Почему нельзя определить в Си-коде через #define? Зачем для этого городить ассемблерные вставки?
  11. Инициализация глобальных и локальных статических переменных, вызов конструкторов глобальных объектов (для С++ кода), копирование кода RAM-функций из флеша в ОЗУ. Может ещё что-то пропустил.
  12. IAR 8.40.1, директива __forceinline

    Добейтесь компиляции без ошибок с обычным inline. Потом уже добавляйте __forceinline. Попробуйте сделать: 1. Объявите метод класса без inline. 2. Перед определением поставьте inline. 3. Определение встраиваемых методов класса должно располагаться в файле хидера класса, т.е. в одном файле с их объявлением, после объявления самого класса. Это обязательное условие. Без него компилятор будет выдавать ошибку.
  13. Stm32f405 запись во Flash 16bit

    Пусть автор сам решает. Моё дело предупредить.
  14. Stm32f405 запись во Flash 16bit

    Это законченный унифицированный кусок кода, оформленный в функцию. Он не должен иметь таких побочных действий. Если бы это был просто выдранный из контекста кусок кода - я бы согласился. Но для функции такое поведение недопустимо. Она не должна изменять (портить) того, что её не касается. Если она это делает - значит она неправильно спроектирована либо реализована.
  15. Stm32f405 запись во Flash 16bit

    Присваивание нового значения регистру потенциально может изменить любое битовое поле в нём. А не только те, что хотел изменить автор. Например, в приведённой строке он "попутно" сбрасывает биты ERRIE и IOPIE (25 и 24 позиции). А если до этого они были выставлены в 1? Намеренно, чтобы получить запрос на прерывания по этим событиям. А после такой записи в регистр логика работы программы нарушится и надо будет искать, а почему же программа не заходит в обработчик прерываний, которые я разрешил? А потом оказывается, что в функции записи флеша ты, сам того не желая, сбрасываешь разрешения на эти прерывания. А всё потому, что делаешь запись вместо чтения-модификации-запись. Я не настаиваю. Я предупреждаю и предостерегаю о возможных последствиях. Запись надо применять осторожно, точно убедившись, что значения всех соседних бит в регистре можно безнаказанно занулять.