Задать вопрос
  • Проблема со связкой ЦАП + DMA в циклическом режиме на gd32f303zet6. Как убрать 0 между циклами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Проблема заключается в том, что при достижении конца цикла, dma подстовывает цап нулевое значение.

    А есть уверенность, что это именно последнее значение из цикла DMA?

    Вот это место в коде как-то подозрительно выглядит:
    dma_init_struct.memory_addr   = (uint32_t)_binary_C__data_for_MC_2_bin_start + 20;

    с учётом того, что ни определения этого массива нет в приведённом коде, ни как он заполняется не видно.
    Два предложения:
    - проверить, что в этом массиве всё на месте
    - уменьшить dma_init_struct.number на 1, а потом увеличить dma_init_struct.memory_addr на 2 и понаблюдать за тем, не исчезает ли эффект.
    Ответ написан
  • X86 intel, Почему если идет запись в текущию исполняемую кеш-линию Машиного кода, скорость падает в 100 раз?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Отсюда вывод, что если происходит запись в исполняемую кеш-линию, то добавляется 100 наносекунд, и под 50-100 раз падает скорость .И я не могу загуглить почему так.

    Открываешь intel developer's manual, третий том, "System programming guide", раздел 13.6 "Self-modifying code". Там ровно об этом и написано.
    Ответ написан
    Комментировать
  • Как разместить бинарный файл и передать ему управление?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Какой минимальный набор изменений требуется в main.rs чтобы было понимание что выполнение находится в _start?

    Можно вообще ничего не менять, а просто запускать QEMU с ключами -d in_asm,exec и смотреть в лог выполнения.

    Какой командой лучше запускать qemu чтобы происходило размещение в памяти и передача управления ELF?

    Насколько я вижу riscv машины игнорируют адрес точки входа в ELF-файлах которые им передаются через -kernel.

    Если запускать через -device loader, какой адрес (dts в спойлере ниже) необходимо указать (и можно ли так вообще)?

    0x80000000, elf должен быть слинкован так, чтобы точка входа была по этому адресу.

    Можно ли запускать через параметр -kernel и, если да, то как?

    bare metal на платформе virt и без извращений -- я не вижу как.

    если вернуть графику то в окне вместо такой же пустой консольной строки уже другая с вводом команд в qemu).

    Это интерфейс монитора qemu. Его можно отключить опцией -monitor none.
    Ответ написан
    4 комментария
  • Как решить данную задачу?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я бы сказал, что нужно завести переменные для (a + i) (API) и (-1)^i (M1PI), переменную для результата (result), текущее слагаемое собирать в регистре 1. На каждой итерации вычислять текущее слагаемое ряда, прибавлять его к результату, а потом обновлять значения (-1)^i и (a + i) для следующей итерации. Как-то так:
    movr    0, N
        srm     0, ONE
        jz      PRINT
    CYCL:
        movr    1, M1PI
        mrm     1, API
        arm     1, result 
        movm    1, result
        mmm     M1PI, M1
        amm     API, ONE
        loop    CYCL
    PRINT:
        movr    1, result
        out     1
        stop
    
    ONE:        .dw 1
    M1:         .dw -1
    
    M1PI:       .dw 1
    API:        .dw 1
    result:     .dw 0
        end
    Ответ написан
    Комментировать
  • Почему в самописном приёмнике данные не принимаются без Serial.print()?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    декодирование кода Хэмминга происходит неверно(да и приём байт в целом), если в цикле заполнения буфера отсутствует вывод serial

    это происходит потому, что приём буфера синхронизируется только в его начале, по преамбуле, после этого никакой синхронизации нет. Чтобы приём выполнялся корректно, задержки при семплировании битов приёмником не должны отличаться от задержек при передаче больше чем на (длительность одного бита)/(максимальное число битов в сообщении). В передатчике из дополнительных задержек -- печать байта и пробела после каждого переданного байта:
    for(int i = 0;i<24;++i) {
        sendByte(block[i]);
        Serial.print(block[i],HEX);Serial.print(' ');
    }


    В приёмнике -- печать двух байт и двух пробелов после приёма каждых двух байтов:
    for(int i = 0;i<10;++i) {
          uint8_t byte1 = receiveByte();uint8_t byte2 = receiveByte();
          buffer[i*2] = byte1; buffer[i*2+1] = byte2; 
          //delay(200);
         Serial.print(byte1,HEX); Serial.print(' '); Serial.print(byte2,HEX);Serial.print(' ');
    }


    В среднем задержки в приёмнике и передатчике при наличии печати в Serial совпадают. А при удалении печати в приёмнике задержки начинают расходиться слишком сильно.

    Я бы не рекомендовал вставлять вызовы Serial.print() или других функций с переменным временем выполнения в алгоритм требующий работы в режиме реального времени.
    Ответ написан
    Комментировать
  • Почему в ethtool не выводится информация о партнёре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему в ethtool не выводится информация о партнёре?

    Не реализовано в драйвере. Информация о том, что предложил link partner берётся из поля lp_advertising структуры ethtool_cmd, см. Функция igb_get_link_ksettings это поле не заполняет, см. Вот пример функции, которая заполняет, см.
    Ответ написан
    Комментировать
  • Почему мой лексер выдает неизвестные токены?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (strncmp(&(*input)[pos], "пер", 3) == 0) {

    Если очень хочется сравнивать строки так, то вместо 3 правильнее будет написать sizeof("пер") -1. И вместо pos += 3; -- pos += sizeof("пер") - 1;
    Ответ написан
    1 комментарий
  • Можно ли использовать не парные Acquire/Release порядки памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    могу ли я использовать Relaxed в 3?

    Если тебе не важно то, что ты при этом можешь пропустить изменение head, то можешь. Но тебе должно быть важно, потому что это же единственная загрузка head в producer_maybe_push().
    Ответ написан
    7 комментариев
  • Как передать ссылку на двумерный массив в функцию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int mat(int ***matrix, int m, int n) {

    Зачем три звёздочки? Для двумерного массива достаточно было бы двух:

    int mat(int **matrix, int m, int n) {
      for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) {
          printf("x: %d / y: %d /  ", i, j);
          matrix[i][j] = 1;
        }
    
      return 0;
    }
    
    int mato(int **matrix, int m, int n) {
      for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
          if (j == m - 1) {
              printf("%d\n", matrix[i][j]);
          } else {
              printf("%d ", matrix[i][j]);
          }
      return 0;  
    }
    
    int main() {
        int **matrix = malloc(XMAX * YMAX * sizeof(int) + XMAX * sizeof(int*));
        ...
        if (mat(matrix, XMAX, YMAX) != 0) {
          free(matrix);
          return 1;
        }
        
        mato(matrix, XMAX, YMAX);
        ...
    }


    В коде с тремя звёздочками конкретно здесь:
    mat(&matrix[0][0], XMAX, YMAX)
    передаётся неправильный указатель, потому что matrix --- это не настоящий двумерный массив, и matrix и &matrix[0][0] указывают в разные места.

    Ну и порекламирую свой давнишний обзорный ответ на подобный вопрос.
    Ответ написан
    3 комментария
  • Отдельный контекстный стек процессора. Как думате, стоит ли?

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

    Это будет иметь последствия для реализации многозадачности (переключение с задачи на задачу должно будет выгружать весь контекст одной и загружать весь контекст другой задачи), а так же для функций типа setjmp()/longjmp() и getcontext()/setcontext().

    Адрес возвртата недоступен, и его не только не перезапишут, но и не узнают.

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

    Вам нужно обсуждать свои идеи с программистами которые будут делать низкоуровневый софт для вашего процессора, потому что именно перед ними будет стоять выбор: портировать существующий код или писать своё. Портировать существующий код будет тем сложнее, чем больше будет у вашего процессора особенностей. Писать своё начиная с самого низа -- это колоссальный объём страданий, а нежелание страдать по полной программе приведёт к тому, что ваш процессор станет нишевым, а значит бенефиты, которые могли бы принести его странности просто не реализуются.
    Ответ написан
    4 комментария
  • Почему компилятор не видит реализацию методов во компиляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ld.exe: .pio\build\desktop\test\desktop\test_user\user.test.o: in function `test_only_strongest_zone_applies()':
    P:\stalker\dosimetr-arduino/test/desktop/test_user/user.test.cpp:31:(.text+0x104): undefined reference to `User::updatePosition(GpsPosition const&)'

    Линковщик тебе говорит, что методы класса User не определены.

    в какую сторону копать

    Надо разобраться, где находятся реализации указанных функций, в objects/User.hpp или где-то ещё, и понять, каким образом должен собираться этот код.
    Ответ написан
  • Проблема с переключением на su пользователя?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не понимаю какой пароль он требует.

    пароль пользователя builder. Если пароля нет -- можно его задать. Либо сначала стать рутом, после чего su в любого пользователя сработает без пароля.
    Ответ написан
    1 комментарий
  • Как работает realoc? Копирует непосредственно ли она содержимое в физической памяти?

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

    в linux есть mremap.

    реализовано ли так хоть где-то?

    И в glibc есть такая опция и в newlib и в musl и в uclibc-ng.
    Ответ написан
    Комментировать
  • Как запретить системе Ubuntu 24 убивать процесс systemd?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    https://man7.org/linux/man-pages/man5/proc_pid_oom... :
    The lowest possible value, -1000, is equivalent to disabling OOM-killing entirely for that task, since it will always report a badness score of 0.
    Ответ написан
    Комментировать
  • Как загрузить код в attiny13?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В статье написано:
    я использовал микроконтроллер Attiny13, прослушивающий по UART последовательность команд, поэтому для загрузки нового кода достаточно любого адаптера USB-UART.

    Это значит, что attiny13 нужна своя собственная программа и она должна быть заранее прошита в него. Был ли вами выполнен этот шаг? Я не могу найти ссылки на код для attiny ни в переводе ни в оригинальной статье.
    Ответ написан
    Комментировать
  • Как импортировать пользовательский модуль в Linux ядро?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    выдаёт ошибку
    insmod: ERROR: could not insert module flc2.ko: Invalid parameters

    Это значит что твоя функция flc2_module_init() возвращает -EINVAL. Заглянув в единственную функцию register_qdisc() которую ты вызываешь, можно увидеть следующее:
    if (qops->peek == NULL) {
                    if (qops->dequeue == NULL)
                            qops->peek = noop_qdisc_ops.peek;
                    else
                            goto out_einval;
            }

    т.е. одновременное peek == NULL и dequeue != NULL гарантированно приводит к ошибке которую ты наблюдаешь.
    Разбирайся с заполнением структуры flc2_qdisc_ops.
    Ответ написан
    Комментировать
  • RISC-V / Входят ли инструкции работы с CSR в "базовый" набор rv32i?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет, не входят. rv32i -- это часть непривилегированной архитектуры. Доступ к CSR -- это часть привилегированной архитектуры.
    Ответ написан
  • Что делать если истек срок годности SUB ключ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А как быть, если истек срок годности sub ключа, которым шифровались пароли?

    Срок годности имеет смысл для ключа которым ставят подписи. В любом случае ключ не перестанет работать от того, что у кого-то какая-то текущая дата, потому что у кого-то другого текущая дата может быть другой.

    Ну или другой вариант, украли телефон и всё.
    При этом есть секретный ключ.

    Непонятно, что ты хотел сказать. При чём тут телефон? У кого есть секретный ключ?
    Ответ написан
  • Какой приоритет операций, разворачивающихся из fold-expression?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Согласно eel.is/c++draft/expr.prim.fold#nt:fold-operator и eel.is/c++draft/temp.variadic#14 чтобы получить то что ты хотел (и что стандарт называет термином "binary left fold") вместо cout << (args << ...) << endl; надо было написать (cout << ... << args) << endl;

    почему ж в результате оно себя ведёт так, как будто скобки есть??

    Потому что у тебя получился binary right fold.

    Какой приоритет операций, разворачивающихся из fold-expression?

    Поскольку операция одна и та же, приоритет одинаковый. Свойство о котором ты говоришь называется "ассоциативность". binary right fold ассоциирует подвыражения справа налево, binary left -- слева направо.
    Ответ написан
    3 комментария
  • Почему не собирается kaldi?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот вывод ошибки make test в директории src

    1) зачем запускать make test в каталоге src, когда у проекта есть система сборки основанная на CMake и можно запускать make test в каталоге где выполняется сборка?
    2) на ubuntu 22.04.5 c libblas-3.10.0, liblapack-3.10.0 и libatlas-3.10.3 сборка завершается успешно и make test в каталоге сборки тоже завершается успешно: 100% tests passed, 0 tests failed out of 132

    Команда компиляции для первого файла из приведённого лога с ошибкой при этом такая:
    cd /home/jcmvbkbc/tmp/tests/1390844/kaldi/build/src/matrix && /usr/bin/c++ -DHAVE_CLAPACK=1 -DKALDI_NO_PORTAUDIO=1 -Dkaldi_matrix_EXPORTS -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/build/_deps/openfst-src/src/include -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/tools/CLAPACK -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/src/matrix/.. -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/src/base/.. -fPIC -std=c++14 -MD -MT src/matrix/CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o -MF CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o.d -o CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o -c /home/jcmvbkbc/tmp/tests/1390844/kaldi/src/matrix/kaldi-matrix.cc
    Ответ написан
    1 комментарий