Задать вопрос
  • Error: no multiboot header found при загрузке своей ОС, как исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужны подробности сборки. Согласно спецификации заголовок multiboot должен быть в пределах 8192 байт от начала, но если в сборку не подсовывать никаких дополнительных ключей и потом пытаться загружать elf-файл, то в нём multiboot header может оказаться дальше 8К от начала:

    $ gcc -m32 boot.s -nodefaultlibs -nostartfiles -Wl,-Tlinker.ld -no-pie -o boot.elf
    $ readelf -S boot.elf
    There are 8 section headers, starting at offset 0x3140:
    
    Section Headers:
      [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
      [ 0]                   NULL            00000000 000000 000000 00      0   0  0
      [ 1] .note.gnu.bu[...] NOTE            00100000 001000 000024 00   A  0   0  4
      [ 2] .multiboot        PROGBITS        00101000 003000 00000c 00      0   0 4096
      [ 3] .text             PROGBITS        00102000 002000 000009 00  AX  0   0 4096
      [ 4] .bss              NOBITS          00103000 003000 004000 00  WA  0   0 4096
      [ 5] .symtab           SYMTAB          00000000 00300c 0000a0 10      6   9  4
      [ 6] .strtab           STRTAB          00000000 0030ac 00004d 00      0   0  1
      [ 7] .shstrtab         STRTAB          00000000 0030f9 000044 00      0   0  1
    Key to Flags:
      W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
      L (link order), O (extra OS processing required), G (group), T (TLS),
      C (compressed), x (unknown), o (OS specific), E (exclude),
      D (mbind), p (processor specific)


    При такой сборке секция .multiboot оказалась по смещению 0x3000.
    Ответ написан
    Комментировать
  • Как ATmega88 подружить с кодом на С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сигналы доходят до меги, но она не включает ни один из светиков.

    Я бы начал с отладки простым безусловным включением led на старте программы. Потому что 1К резистор последовательно со светодиодом с падением в 2В ограничивает ток 3ма, чего, скорее всего, недостаточно для заметного свечения.
    Ответ написан
    Комментировать
  • Как заменить вывод текущей скорости консольной speedtest или подобной на построчный (LF - CRLF)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если записать вывод данных в файл
    # /opt/speedtest/speedtest | tee spdt.log
    то в файле не видно промежуточных значений значений.

    Дело в том, что консольная программа может определить, направлен ли её вывод в терминал или в файл, и вести себя по разному, в зависимости от этого. Понаблюдать, что и как именно программа выводит можно запустив её под strace, например так:
    strace -f -e ioctl,write -o log <program command line>

    Соответственно, поймать что такая программа выводит в процессе можно только предоставив ей в качестве вывода эмуляцию терминала.
    Ответ написан
    1 комментарий
  • Ошибка с ESP32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что это значит

    подозреваю, что вот эта часть: ���`�B��Χh� �l<*�� !����� -- это вывод скетча на 9600. Откуда LoadProhibited -- непонятно.

    можно ли это как-то исправить?

    только разобравшись, что происходит. idf.py monitor обычно декодирует стек трейс и выводит соответствующие строчки исходников, можно начать отсюда.
    Ответ написан
  • Try/catch и goto?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для выхода из вложенных циклов при try/catch в случае исключения произойдёт свертка стека

    stack unwinding или развёртка стека происходит при выходе из одного или более вложенных вызовов, т.е. когда текущим должен стать более ранний кадр стека. При выходе из вложенных циклов в пределах одной функции кадр стека не меняется, но по правилам языка автоматические переменные из покинутых блоков должны быть уничтожены. Компилятор генерирует для этого код вызова деструкторов и вставляет его вызовы на пути выхода из блоков. В случае stack unwinding компилятор генерирует код вызова деструкторов, но вызов этого кода происходит более сложным путём. О том, как делается stack unwinding в gcc почитать можно здесь, о том как в этот процесс встраивается вызов деструкторов -- здесь.

    будет ли тоже самое для goto?

    То же самое будет и для goto.
    Ответ написан
    Комментировать
  • Как включить SVGA VESA режим в x86 GAS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    movw $0x4F02, %ax
    movb $0x03, %bl
    int $0x10

    в bh остался мусор, а этот вызов принимает аргумент в bx.
    Ответ написан
    Комментировать
  • Можно ли в ESP32-Cam одновременно использовать SD карту и периферийное устройство общающееся по SPI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как это сделать вместе?

    Повесить второе SPI-устройство на отдельную линию CS. Я вижу, что сигнал U2RXD с разъёма P1 можно для этого использовать, если речь об этом модуле.
    Ответ написан
  • Возможно ли собрать libffi под esp32(esp-idf)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно ли собрать libffi под esp32(esp-idf)?

    Да. В коде порта libffi для xtensa никаких сложностей при сборке под esp32s3 быть не должно. Но, я подозреваю, что прийдётся разобраться с тем, как совместить libffi с idf.
    Ответ написан
  • Makefile не правильно раскрывает переменные, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    SRC_DIR := src/brick_game/tetris # Папка с исходным кодом

    вот из этой строки нужно убрать все пробелы после слова tetris. Потому что иначе они попадают в переменную SRC_DIR. Комментарий можно оставить только впритык. Это же относится и к определениям остальных переменных.
    Ответ написан
    2 комментария
  • Какое напряжение на контактах spi esp32s3 n16r8?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какое напряжение на контактах FSPI на esp32 s3 n16r8

    Это недостаточно точное обозначение, потому что функция FSPI может быть включена у разных пинов через IOMUX, не говоря уже о том, что через GPIO matrix эти сигналы могут быть выведены вообще на любые пины. С напряжением всё более определённо, esp32s3 TRM в разделе 6.10.2 говорит, что GPIO33 ~ GPIO37 and GPIO47 ~ GPIO48 can be powered either by VDD_SPI or VDD3P3_CPU, и что VDD_SPI can be configured to use an internal LDO. The LDO input and output both are 1.8 V. If the LDO is not enabled, VDD_SPI is connected directly to the same power supply as VDD3P3_RTC. На всех остальных пинах с выбранной цифровой функцией будет 3.3в в активном состоянии.
    Ответ написан
  • Каким образом прерывания работают в esp8266?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нашел документацию по ISA Xtensa

    Если вопрос действительно "каким образом прерывания работают", то isa book -- правильное место чтобы начать разбираться.

    В memory map esp8266 этот вектор заносится по адресу 0x40000050
    Не уверен, конечно, что это так


    Это так, можно посмотреть в конфигурационном оверлее.
    Ответ написан
  • Есть ли модуль реального времени в AI Thinker ESP32 (ESP32 CAM)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет. То что в esp32 называется RTC -- это не энергонезависимые часы.
    Ответ написан
    3 комментария
  • Как вернуться к текущей ветке после git reset HEAD~1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    посмотреть в git reflog, сделать git reset <commit> с нужным хешем. Если с момента выполнения git reset HEAD~1 не было больше никаких reset/checkout, это можно записать как git reset HEAD@{1}.
    Ответ написан
    Комментировать
  • Почему время выполнения программы так сильно различается?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    … 75% cpu 2:23,52 total
    … 113% cpu 1:22,71 total
    … 73% cpu 2:20,75 total
    количество потоков в программе равно количеству потоков процессора (в моём случае - 8…

    Похоже, что твоя программа не справляется с загрузкой всех ядер, едва одно ядро она нагружает. Я бы смотрел в то как потоки взаимодействуют друг с другом и искал там явную или скрытую сериализацию.
    Ответ написан
    Комментировать
  • Как задать, что бы компилятор при -fdump-rtl-expand, выдавал абсолютный путь?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я думаю, что никак -- в каком виде пути к файлам компилятору переданы -- в таком виде они и будут использованы, как для чтения, так и для вывода в диагностике.
    Ответ написан
    Комментировать
  • Нету структуры file_operation, в хедере fs.h, как исправить? как установить полные хедеры ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    изучаю разработку модулей ядра,попытался скомпилировать модуль использующий структуру file_operation - ошибка,как оказалось в моих хедерах ядра(/usr/include/linux/) нету данной структуры

    Хедеры ядра которые устанавливаются в системе -- это интерфейс между ядром и юзерспейсом (uapi). Хедер который тебе нужен -- внутренний хедер ядра. Чтобы собрать модуль ядра нужно иметь сконфигурированные исходники этого ядра. Почитать можно здесь.
    Ответ написан
    Комментировать
  • 2 переменные в одном адресе Си11 ARM STM32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может, дело в отладчике?

    Может и в отладчике. Поскольку обе переменные глобальные, то для проверки можно посмотреть в вывод readelf -a -- там должны быть их адреса. Или напечатать адреса из программы.
    Ответ написан
  • Почему функция неправильно изменяет динамический массив?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можете подсказать причину?

    Неправильная работа с указателями. Конкретно:

    void test(char** array){
    	array = malloc(sizeof(char*));
    	array[0] = malloc(255 * sizeof(char));
    	strcpy(array[0], "Hello world!");
    }

    Если имелось в виду выделение и возврат массива строк, то должно быть так:
    void test(char*** array){
    	*array = malloc(sizeof(char*));
    	(*array)[0] = malloc(255 * sizeof(char));
    	strcpy((*array)[0], "Hello world!");
    }


    char** array;
    test(array);

    Здесь должно быть
    char** array;
    test(&array);
    Ответ написан
    3 комментария
  • Как вводить и выводить отрицательные числа turbo assembler?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    возможно, я неправильно использую sf флаг?
    mov al, mas[si]
    cmp ax, ax
    jns positiveOut   ;;;;

    cmp ax, ax сравнивает ax с самим собой, результат немного предсказуем: они равны, т.е. sf = 0, zf = 1. Чтобы узнать знак числа нужно либо сравнивать его с нулём, либо использовать вместо cmp логическую операцию -- test, or или and.

    Кстати, mov al, mas[si] загружает из памяти только al, в ah остаётся мусор от предыдущих операций. По-нормальному после mov нужно сделать знаковое расширение al в ax, если собираешься дальше работать с ax, например так:
    mov al, mas[si]
    cbw


    sub ax, 1                 
    not ax

    Зачем две инструкции, когда есть neg ax?
    Ответ написан
    Комментировать
  • Почему неправильно считается количество строк глобами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    myvar=$(find "/tmp/folders" -iname "App *" -type d -maxdepth 1)
    count=${#myvar[@]}
    echo $count


    И в ответ получаю число 120, которое означает количество символов, а не строк

    И это верно.

    2. Почему в моем примере выводится количество символов в переменной, а не количество строк?

    Потому что ${#myvar[@]} -- это длина массива. Если идея была создать в первой строке массив из имён файлов, то там не хватает пары скобок:
    myvar=( $(find "/tmp/folders" -iname "App *" -type d -maxdepth 1) )

    С таким определением myvar становится массивом а ${#myvar[@]} выведет длину этого массива, т.е. количество строк в нём.
    spoiler
    Имена файлов с пробелами, кстати, эту стройную картину малость испортят.
    С вашим определением выводится длинна массива, но в качестве массива выступает одна строка, так что это длина строки в символах.

    1. Реально ли подсчитать количество строк в файле или переменной с помощью глобов, как показано тут - https://stackoverflow.com/a/32727260 ?

    Да. Но использование для этой цели массивов оболочки выглядит странно и расточительно. В shell канонично считать строки командой wc -l.
    Ответ написан
    1 комментарий