• С чего начать, чтобы написать свою библиотеку по загрузке бинарника в микроконтроллер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У твоей задачи есть как минимум два решения. Одно, попроще: взять готовую программу прошивки, посмотреть, как она работает, написать библиотеку реализующую то же самое. Другое, посложнее: начать со спецификации контроллера который ты собираешься прошивать и раскручивать зависимости с той стороны. Поскольку ни то, ни другое решение сами по себе большого смысла не имеют (потому что есть уже программы для прошивки), тебе надо решить, чего ты сам хочешь получить от этого упражнения.

    Есть, может, какие-то специальные книги по этой теме?

    Спецификации на контроллер, а недостаток большой картины можно покрыть википедией и всяким osdev.org
    Ответ написан
    Комментировать
  • Как можно улучшить код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как можно улучшить код?

    - отформатировать по какому-нибудь стандарту, чтобы хотя бы строчки не гуляли влево-вправо.
    - пользоваться тернарным оператором вместо if когда это имеет смысл. На мой взгляд, d = n < 0 ? -n : n выглядит куда лучше семистрочного if/else.
    - не дублировать код когда этого легко избежать:
    if(n<0) {
        cout<<"-";
    }


    Ну и добавлю, что у этого кода есть проблема с обработкой входного значения -2147483648.
    Ответ написан
    Комментировать
  • Как отправлять пакеты по Wi-Fi для управления МК ESP8622?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сеть вай-фай раздает сама плата, телефон к ней подключается и условно говорят когда в приложении нажата кнопка1 то на плату должна прийти команда включить светодиод1…
    как это реализовать

    Выбрать протокол взаимодействия (UDP, TCP), выбрать или разработать протокол уровня приложения, реализовать сервер выполняющийся на esp8266, реализовать клиент выполняющийся на андроид.
    В простейшем случае можно сделать для esp8266 UDP-сервер принимающий один байт, значение которого соответствует состоянию светодиода и включающий/выключающий светодиод при приёме этого байта. Клиент на андроид, соответственно, должен будет посылать по UDP на условленный порт один байт при нажатии или отпускании кнопки в приложении. Поиск по словам "python udp" находит полезные результаты.
    Ответ написан
    Комментировать
  • Компиляция C++ кода на Ubuntu и Windows даёт мне разный результат, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Уже не знаю что делать

    Не знаешь что делать -- включай санитайзеры:
    $ g++ -std=c++11 -g -fsanitize=undefined -fsanitize=address main.cc tools.cc -o test
    $ ./test
    ==3245365==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x606000000060 at pc 0x55b559719b47 bp 0x7ffcc39300a0 sp 0x7ffcc3930098
    READ of size 8 at 0x606000000060 thread T0
        #0 0x55b559719b46 in Processor::encode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) toster/1320980/main.cc:41


    mainc.cc:41 это std::bitset<16> KR = K_array[i];, цикл по i идёт до 9, а в массиве K_array 8 элементов.
    Ответ написан
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #define BIT_SET(port, bit) (port |= (1 << bit))
    
    int main(void)
    {
        BIT_SET(PORTB, PORTB0);
    }


    вот такой вариант, с макро-функцией, работает, так как это просто текстовая замена

    Он работает, потому что с таким определением BIT_SET PORTB не может быть определён просто как 0x04. Потому что просто текстовая замена 0x04 |= 1 << 0 не имеет смысла. Он определён как volatile ссылка на память с адресом 0x04. Когда ты научишься передавать ссылку на такую память в функцию, функция тоже начнёт работать.
    Ответ написан
    3 комментария
  • Как подставить в echo переменную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как я могу данные из них подставить в echo, сохранив при этом функционал запроса?

    eval "echo {$A1}.{$A2}.{$A3}"
    Потому что расширение таких конструкций со скобками -- функция shell, поэтому они должны буквально в таком виде попасть в shell. eval применяет функциональность shell к произвольной строке.
    Ответ написан
    3 комментария
  • В чем возникает проблема при работе с драйвером порта - UART4?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Речь идет именно о RS485, UART подключен к микросхеме трансивера RS485. Пин RTS используется для организации полудуплексной передачи.

    Ок, я проглядел это место, давай попробуем ещё раз.

    Если вывод dev_err() поставить перед spin_lock_irqsave(&port->lock, flags); то всё работает.

    Верно ли, что когда всё работает (со вставленным dev_err), serial8250_em485_stop_tx вызывается после передачи только из serial8250_console_write, а когда всё не работает эта функция не вызывается вообще?

    Глядя в функцию serial8250_handle_irq я вижу, что обработка окончания передачи зависит от того, используется DMA или нет. Используется ли в вашей конфигурации DMA? Работает ли передача, если DMA отключить?
    Ответ написан
  • Как хранится c++ struct в памяти и как определить размер вручную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    поэтапаный алгоритм определения размера

    Если откинуть тонкости связанные с битовыми полями, то алгоритм простой. Обозначим выравнивание всей структуры A, размер всей структуры S, размер головы структуры из i полей Si, размер i-го поля SFi, выравнивание i-го поля AFi, операцию округления X вверх до ближайшего кратного Y R(X, Y) (т.е., например, R(4, 4) = 4, R(5, 4) = 8), количество полей структуры n. Тогда

    S0 = 0
    Si = R(Si - 1, AFi) + SFi
    A = maxi = 1..n(AFi)
    S = R(Sn, A)

    Второй и третий шаги гарантируют, что в выравненной структуре каждое поле тоже выравнено.
    Четвёртый шаг гарантирует, что если такие структуры поместить в массив, то все элементы массива будут одинаково выравнены.

    Разумеется всю эту математику имеет смысл делать если пишешь компилятор, во всех остальных случаях размеры и выравнивания структур можно узнать непосредственно у компилятора.
    Ответ написан
    Комментировать
  • Как в С++ проверить double на целочисленность?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #include <cmath>
    int isInteger(double num)
    {
        return num == trunc(num);
    }

    Ну и нужно понимать, что с некоторого (в зависимости от конкретной разрядности double) значения порядка любой double станет целочисленным из-за ограниченности длины мантиссы.
    Ответ написан
    8 комментариев
  • Почему библиотека не ставится?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пытаюсь поставить библиотеку, не получается
    почему?
    file INSTALL cannot find
    "/home/durachok/HTTPParser/build/_deps/ethernet-src/include/Ethernet.h": No
    such file or directory.


    Потому что здесь написана какая-то фигня, ссылающаяся на несуществующий файл.
    Ответ написан
    Комментировать
  • Почему при запуске программы через командную строку на mac выходит segmentation fault 11?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    atoi(argv[1]) ожидает, что у программы при запуске будет как минимум один параметр командной строки. Segfault который ты видишь -- это результат запуска программы без аргументов.
    Ответ написан
    1 комментарий
  • Как склеить байты правильно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char ... c=0xA1

    здесь нужно использовать unsigned char, иначе после знакового расширения получишь гарантированно отрицательный результат

    Как склеить байты правильно?

    чтобы склеить байты правильно, нужно знать, какой порядок байт принят в этом файле. См. big endian, little endian.
    Ответ написан
    1 комментарий
  • Не работает код, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ; Вывод суммы элементов выше главной диагонали
        mov ah, 2
        mov dl, cl
        int 21h

    функция 2 прерывания int21h выводит один символ с кодом в dl. Если код суммирования работает верно, это 2 + 3 + 6 = 11. Символ с кодом 11 -- непечатный, и, даже если бы он был печатным, подозреваю, что это не то, что тебе было нужно. В общем случае нужно переводить полученную сумму в строку цифр и эту строку печатать.
    Ответ написан
    8 комментариев
  • Как написать драйвер на андроид?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    чтоб прикрутить к ней камеру от сони нужно получается написать драйвер

    Нужно узнать, что это за камера и какой у неё интерфейс. Может статься, что драйвер для неё уже есть. В любом случае, если нужен драйвер, без этого шага его не написать.
    Ответ написан
    Комментировать
  • Что делает компьютер, когда получает машинную инструкцию поделить на ноль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что же сделает программа на чистом ассемблере?

    Программа "на чистом ассемблере" всё равно выполняется в каком-то окружении. От этого окружения и зависит, что именно произойдёт. С программой запущенной на x86 в реальном режиме произойдёт одно (прерывание int 0), запущенной под windows -- другое (исключение -> SEH -> завершение программы), запущенной под linux -- третье (но довольно похожее -- исключение -> сигнал -> завершение программы), а запущенной на микроконтроллере с ядром arm -- так и вообще ничего не произойдёт: разделит и глазом не моргнёт, вернёт 0 в качестве результата деления.
    Ответ написан
    Комментировать
  • Почему constinit помогает решить проблему static order initialization fiasco?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Единицы трансляции ведь загружаются в произвольном порядке?

    "загружаются" -- неподходящее здесь слово. Единицы трансляции связываются в единый исполняемый образ на стадии линковки и всё что в них было загружается одновременно.

    Каким образом наличие слова constinit в одной из единиц трансляции гарантирует, что она загрузится раньше?

    Это слово гарантирует, что такой объект будет инициализирован до начала динамической инициализации, см, а это всё, что требуется для решения проблемы static order initialization fiasco.
    Ответ написан
    Комментировать
  • Как подключить дисплей с использованием FreeRTOS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какие нюансы надо учесть при подключении дисплея, при формировании задачи ОСРВ?

    Если дисплей работает без ОС, то, судя по всему, нюансы подключения успешно учтены. Из нюансов запуска задачи на ум приходит размер выделенного ей стека.
    Ответ написан
  • Почему не выводятся данные в консоль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как только я ввожу число литров и нажимаю энтер все сбрасывается и ничего не выводится. Код пишется в vscode, код пытаюсь запустить в самой консоли vscode. В чем может быть проблема?

    В том, что консоль с выводом программы закрывается сразу после того как программа заканчивается, а заканчивается она сразу после вывода. Одно из возможных решений -- запускать программу в отдельной консоли.

    Может с кодом что-то не то

    С кодом всё ок.
    Ответ написан
    1 комментарий
  • Как записать информацию из вывода в файл с неизвестным названием?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как перенаправить информацию из вывода команд в файл, который создается в процессе проверки командой
    #touch $( date '+%Y-%m-%d_%H-%M' )

    Записать имя файла в переменную и дальше везде использовать её. Например:
    …
    file=$( date '+%Y-%m-%d_%H-%M' )
    touch "$file"
    …
    echo -e "               Product Name : $PN_FRU" >> "$file"
    …
    Ответ написан
    Комментировать
  • C++ CMake Как исправить ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не могу понять в чем дело

    Судя по всему в макросе assert использован текст с какими-то забавными символами. Два очевидных способа решения:
    - можно эти строки удалить, в корректно написанной программе они ни на что не влияют.
    - можно разобраться с тем, что не так внутри assert. Начать можно, например, выполнив вместо компиляции препроцессирование (заменив в командной строке вызова gcc -c на -E) и почитав внимательно препроцессированный код в местах на которые ругается компилятор.
    Ответ написан
    Комментировать