Обновить
17
0.1
Artyom Styazhkin@DoHelloWorld

Software Engineer

Отправить сообщение

В целом согласен, у меня просто такой SoC на котором Linux и мультикор DSP с MMU, по факту там ОСРВ типа FreeRTOS и статическая линковка, похоже на МК, но чуть пожирнее, там MMU умеет отлавливать сегфолты и выдавать PC где он случился.

Если кандидат вкурсе про MMU - однозначно, лайк.
А так вопрос можн оперефразировать: "Знаешь PC на котором упал, досупа к железке нет, как можно начать копать имея на руках исходники"

В в линкерном файле резервируешь столько флеши сколько тебе нужно создав еще один MEMORY блок. Кладешь туда секцию с условным названием default_params.
Подгатавливаешь бинарный файл с параметрами, бинарник можно преобразовать в объектник с секцией default_params, через objcopy. Добавляешь объектник на этапе линковки, получаешь на выходе бинарник с прошивкой и параметрами.

На самом деле могут быть еще варианты. Тут на сколько фантазии хватит =)

Ну мы же не на разминировании бомбы) кандидат всегда имеет возможность задать уточняющие вопросы и это как правило идёт только в плюс.

Я не требую выложить реализацию, просто интересно как кандидат будет подходить к задаче. Это я тоже кандидату даю понять.

Про футпринт, это просто сленг, который часто используют эмбедеры, если не понятно, можно заменить на "размер прошивки". Понимание сленга не обязанность кандидата)

Если кандидат, идет уверенно, я еще задаю такие вопросы:
1) Хочу вместе с прошивкой зашивать массив с "дефолтными" параметрами в последнюю страницу флеша. Что надо сделать?
2) Пусть у вас есть MMU который показывет вам PC на котором идет segfault, отладчик недоступен. Как будете отлаживать? Тут еще можно вспомнить про то как static может немного затруднить эту задачу.
3) Хочу чтоб код выплнялся из RAM. Как сделать?
Если кандидат умеет в С++
4) Вы скомпилировали программу с пустым мейном, ее футпринт 10+кб, что будем делать?

Что касается самого простого блокирующего вызова, насколько мне известно байты в уарт пишутся по событию USART_SR_TXE . Это означает, что приемный буфер пуст и данные ушли в сдвиговый регистр USART.USART_SR_TC событие, когда байт покинул сдвиговый регистр.

Решил проблему с добавлением коммита в сборку, правда в cmake, но я думаю в make тоже можно.

Берем последний тэг.

execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
                 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
                 OUTPUT_VARIABLE GIT_TAG_NAME)

Берем количество коммитов от последнего тэга.

execute_process(COMMAND ${GIT_EXECUTABLE} rev-list ${GIT_TAG_NAME}..HEAD --count
                 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
                 OUTPUT_VARIABLE GIT_COMMIT_AMOUNT)

Юзаем эти переменные в файле, который подтягиваем к проекту

configure_file(gitversion.h.in gitversion.h)


посмотрел, регистры доступны, даже в сдк есть какие никакие обертки над регистрами. В регистрах START генерить можно

или реализовывать программный I2C драйвер чисто на GPIO и аппаратных таймерах.

Ну не обязательно колхозить. Насколько помню можно спуститься до регистров и написать драйвер на CMSIS, там можно сколько угодно стартов сделать

Может там с PLL что-то? USB вроде требует 48 МГц, и если для 96 делитель простой - 2, то для 108 такой делитель не прокатит

Для плюсов можно -fno-exceptions -fno-rtti иначе прилинкует подефолту. В тесте они не нужны. вроде

Согласен, возможно 11 лет необходимо в средней статистике, но мне, например, последние два года школы запомнились тупой зубрежкой к ЕГЭ с минимумом новых материалов. Социальная жизнь была веселая, мне повезло, но учеба скучная и нудная, потому что мне она достаточно легко давалась. В универе было тоже круто, как его сократить не знаю, разве что, как то набирать предметы индивидуально, потому что как не крути, все универские знания юзать не будешь уж точно. И если бы я сократил общий "стаж" своего образования года на 2, то я был бы не против.

Хех, недавно вылез из своего Сишного подвала посмотреть на С++17 в эмбеде и мне в целом понравилось. Сразу столько вкусняшек из коробки, да еще и код часто бывает компактнее.

Ну вообще & ещё адрес умеет брать и приоритет у этой операции другой =)

Последнее, что я встретил это тест по Си на 40 вопросов, среди которых был а-ля, расставьте в порядке приоритета операторы: &, |, ==, &&, + и тд. На мой вопрос какую конкретно операцию они подразумевают под &, сказали что я должен сам знать.

В целом табличка на 360 значений выйдет на 1440 байт, если через градус нужна точность. У stm32f0 RAMы не так много, но в целом во flash можно положить с ней не все так плохо, там вроде от 32 КБ.

Watch dog на мой взгляд нужен точно, чтобы гарантированно ребутнуться в стабильное состояние. Дальше могут быть варианты - крутиться дальше, что может быть приемлемо но не всегда. У stm есть варик посмотреть причину ресета, если ресет был по watch dog, то можно показать ошибку, установить необходимые выводы в безопасное состояние и перейти в контролируемое зависание.

Не используйте stdint. только int, long, long long и так далее.

Забавно отвечать на коммент спустя 3 года. Был коммерческий проект, работал на архитектуре cortex-m3, пришёл ковид, чипы пропали, запас стал подходить к концу, схватили первое, что выпало в продажу и точно покрывало хардварную часть - cortex-m4. Портируем проект. Сейчас вообще хз будут ли чипы, а если будут то какие, предполагаю, что ещё один порт не за горами.

На эмбеддера это вообщепервый вопрос даже для джунов. Мне кажется, когда на С++ стандартный вопрос спрашивают: три основные понятния ООП, то в эмбеде три основных ключевых слова: volatile, static, register/extern и совсем для тех кто угарает: restrict.

Еще, как пример, часто их использую при реализации конечных автоматов. Чем по свичам прыгать, проще массив с указателями на функции сделать( на мой вкус).

1

Информация

В рейтинге
4 634-й
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность