• Что произойдёт при попытке получить доступ к адресу 0х0 виртуальной памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В контексте языка С++ будет неопределённое поведение с непредсказуемыми последствиями. Оптимизирующий компилятор может реорганизовать последовательность выполнения программы рассчитывая на то, что разыменовываемый указатель в валидной программе не может быть равен 0.

    В контексте поведения программы, если доступ по адресу 0 произойдёт, поведение зависит от ОС/среды выполнения. Варианты -- программе будет послан сигнал SIGSEGV (POSIX), в программе произойдёт исключение (windows), доступ будет выполнен как к любому другому адресу (ОС без защиты памяти).
    Ответ написан
    Комментировать
  • Возможно ли подключать библиотеки в модуль ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    программу для изменения маршрута пакета в спутниковом сегменте
    планирую всё переписать на Си, сделать модуль ядра

    Лучше начать с изучения существующей функциональности доступной в ядре для этой цели. Вполне может быть, что ваша задача уже решена.

    Нужно в идеале кэш и отправку некоторых данных, как я понимаю это всё придётся писать в нуля в ядре

    В ядре есть несколько реализаций специализированных механизмов кеширования. Маршрутизация и отправка данных по идее не должны никак пересекаться.
    Ответ написан
    Комментировать
  • Как скопировать значение переменной окружения через указатель в СИ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как скопировать значение

    Для этого надо понимать структуру данных. Структура переменных окружения такова: есть символьный массив содержащий текст всех переменных, и есть массив указателей, содержащий указатели на начало каждой переменной в первом массиве. Копировать указатели из второго массива но не копировать сами переменные бесполезно.

    С другой стороны, в этом задании вообще не нужно ничего копировать. И пользоваться strtok тоже не нужно. Нужно искать длину названий переменных. Сделать это можно так:
    #include <string.h>
    
    void ShortNames(char **arr, int num)
    {
        int i;
        for (i = 0; arr[i]; ++i) {
            int len = strchr(arr[i], '=') - arr[i];
            if (len <= num)
                printf("%.*s\n", len, arr[i]);
        }
    }
    Ответ написан
  • Есть ли какие-нибудь паттерны или фрейворки для программирования под многоядерные ARMы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли какие-нибудь ... технологии в языках, ориентированные на многоядерность?

    OpenMP.
    Ответ написан
    Комментировать
  • Какая файловая система в RAM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть как минимум 2 разных подхода. В первом подходе RAM используется для эмуляции блочного устройства. Например в линуксе драйвера brd и mtdram умеют эмулировать обычные и MTD блочные устройства. Это блочное устройство можно отформатировать в любую файловую систему для таких блочных устройств поддерживаемую ОС. Во втором подходе RAM используется драйвером файловой системы напрямую. В линуксе это файловая система tmpfs.
    Ответ написан
  • Почему идёт бесконечный цикл?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov     cx, 3
    cellValues:
            mov     edx, lenBM
            mov     ecx, borderMiddle
            mov     ebx, 1
            mov     eax, 4
            int     0x80
            loop    cellValues

    Думал, терётся cx от ecx

    Трётся, и не cx, а ecx. И инициализировать и сохранять/восстанавливать надо ecx, потому что в 32-битном коде ecx работает счётчиком для опкода loop.
    С другой стороны, использование опкода loop в наше время выглядит анахронизмом. Если есть регистр который не меняется системным вызовом лучше использовать его и делать явный dec и jnz.
    Ответ написан
  • Как задать поведение препроцессора C в GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

    Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
    #define foo bar
    #define func foo
    ...
    #undef func
    ...
    #define func foo
    Ответ написан
    3 комментария
  • Как подключиться к SQLite3?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    typedef int (*function);

    Это не определение типа указателя на функцию. Это указатель на int. Указатель на функцию выглядит как-то так:
    typedef int (*function)(void);

    status = sqlite3_open_v2(TEMP_DB_PATH, &sql_db, SQLITE_OPEN_READONLY, NULL);

    Это выглядит как обычное связывание. Потому что sqlite3_open_v2 выглядит как имя функции, а не указателя, полученного через GetProcAddress. Чтобы оно работало нужно правильное объявление функции sqlite3_open_v2 во время компиляции и нужно линковаться с implib sqlite3 во время линковки.
    Но в чём смысл мешать в одном и том же коде такое связывание и LoadLibrary/GetProcAddress?

    sqlite3_close(sql_db);

    Если sqlite3_close принимает параметр, этот параметр должен быть и в typedef которым определён его тип. Например:
    typedef sqlite3;
    typedef int (*fn1) (sqlite3* db);
    Ответ написан
    Комментировать
  • Как передать переменную в команды BSF/BCF?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    подскажите хотя бы с переменной в эти BSF/BCF

    Набираешь в гугле "pic datasheet", (если знаешь какой именно PIC у тебя -- уточни, получишь более релевантный результат) получаешь ссылку на спецификацию конкретного процессора. Открываешь её и ищешь в оглавлении раздел "Instruction Set" или похожий по смыслу, в нём ищешь свою инструкцию. Если это сделать, то ты найдёшь такой текст:
    For bit-oriented instructions, ‘b’ represents a bit field designator
    which selects the bit affected by the operation, while ‘f’ represents
    the address of the file in which the bit is located.

    и такую картинку:
    5ee43a094f624209976491.png
    из чего ты сможешь сделать вывод, что нельзя этими инструкциями поменять бит по номеру, записанному в переменной, можно только явно указать в инструкции номер бита который надо поменять.

    Выйти из положения можно несколькими способами, самый простой на мой взгляд -- иметь регистр в котором установлен единственный бит, соответствующий самому старшему биту, который должен быть установлен в наборе огоньков (а набор непрерывный, если я правильно понял задание). Этот бит можно двигать на 1 влево и вправо инструкциями rlf/rrf и операцией xorwf добавлять/убирать из набора огоньков.
    Ответ написан
  • Почему выбивает ошыбку Error ld returned 1 exit status?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему выбивает ошыбку Error ld returned 1 exit status?

    Потому что ты объявил

    void InitPhotoFrame(int, int, int, int);
    и вызвал
    InitPhotoFrame(200,200,0, Edge);
    функцию с четырьмя аргументами, а определил
    void InitPhotoFrame(int x1, int y1, int z1, int m, int n)

    -- с пятью.
    Ответ написан
  • Как передать управление в __asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как правильно передать управление в __asm?

    Проблема не в том, что ты "не смог передать управление в __asm", а в том, что внутри __asm ты перепутал порядок аргументов функции TerminateProcess: аргументы передаваемые через стек в конвенции __stdcall кладутся на него в обратном порядке. Попробуй
    __asm {
          mov eax, hProcess
          push 0
          push eax
          call TerminateProcess
        }
    Ответ написан
    Комментировать
  • Как узнать адрес стека в x86 архитектуре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как мне найти его адрес?

    Поставить метку в нужном месте. Загрузить адрес метки в регистр
    section .bss
    stack_bottom:
    resb 8192
    stack_top:
    .text
    mov eax, stack_bottom
    Ответ написан
    3 комментария
  • В чем проблема в коде?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пока z не сделаетется в 1024/1000000*255*20 секунд ждем
    while (z < 21) 
    {   
        if (TCNT0 == 255) 
        {
            z++;    
        };
    };

    Русским языком говоря , нажал кнопку подождал примерно 5.2 с

    Не, ты тут подождал какое-то другое время. Потому что если в таймер заходит clkio/1024, то TCNT будет равен 255 далеко не один цикл.

    Код не работает в протеусе и сыплет ошибками

    Ну так он же пишет тебе адрес, PC=0x005e, посмотри что по этому адресу происходит.
    Ответ написан
  • Как происходит выборка команды в процессоре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Допустим, значение счетчика равно 0000, я должен записать байт 10h. Как я понял, команду нужно указать через пульта управления на RAM (слева). Например, указал 10h, то получается что во все 3 защелки записывается 10h (То есть 10h 10h 10h) ???

    Нет, не получается. Если значение счётчика равно 0000, то байт 10h ты запишешь только по адресу 0. А машина будет извлекать три байта по адресам 0000, 0001 и 0002 в защёлки:
    В нашем сумматоре каждая ко-
    манда занимает по 3 байта и извлекается из памяти побайто-
    во. Выборка одной команды занимает три цикла синхронизи-
    рующего сигнала, а полный командный цикл — четыре цикла
    синхронизирующего сигнала.


    А как записать команду 10h 00 00??

    Надо перейти к адресу 0001 и записать байт 00, затем к адресу 0002 и записать байт 00.
    В предыдущей главе написано, как можно программировать такую память.
    Ответ написан
    3 комментария
  • Как исправить код умножения матриц?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Код умножает матрицу на эту же транспонированную матрицу.

    Приведённый код почти умножает две разные матрицы. Если перенести MulMatr[i] = new int[c2]; из цикла по j на один уровень выше в цикл по i -- будет хорошо умножать. Но к сегфолту это отношения скорее всего не имеет.
    Что вызывает вопросы -- так это то, что ты не проверяешь, что r2 == c1.

    Работает при размере матрицы n*m, n<=m, если n>m выдает System.AccessViolationException.

    Покажи весь код.
    Ответ написан
    5 комментариев
  • Почему при удалении файла fwrite не возвращает ошибку?

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

    Ты не файл удаляешь, а только его имя из каталога. Файл остаётся до тех пор, пока не будет закрыт последний дескриптор указывающий на него. Все процессы открывшие файл до удаления его имени будут иметь к нему доступ до тех пор. В этом можно убедиться заглянув в /proc/<pid>/fd твоего процесса.
    Ответ написан
    5 комментариев
  • Как определить смещение в Assembler?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1000 – это адрес (А), но только относительный. Чему равно смещение (Х).

    Судя по таблице инструкций этого микропроцессора и по примеру №6 на стр. 10, смещение должно быть равно разности целевого адреса и адреса следующей команды. Т.е. X = 1000 - 504, с учётом вашей системы счисления. 504 потому что 2 байта занимает команда (которая будет выглядеть как 020567) и ещё два байта -- индексное слово, т.е. X.
    Ответ написан
    Комментировать
  • Можно ли создать шаблон только для одного метода класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно ли создать шаблон только для одного метода класса?

    Да, можно. В чём сложность взять и попробовать?
    class C {
    public:
        template<typename T>
        void f(T v)
        {
            ...
        }
    };
    Ответ написан
    2 комментария
  • Как сделать loop по директориям с пробелами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Наверняка есть какое-то просто решение?

    Классика же, разделять имена нулями:
    locate -0 '.txt' | xargs -0 -I\{} echo 'cp "{}" /mnt/e/BOOK'
    Ответ написан
    2 комментария
  • Записать значение команды bash в переменную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    echo -en 'AT^NDISDUP=1,1,"internet.tele2.ru"\r\n' > /dev/ttyUSB2

    Эта команда чтобы установить соединение? А к моменту вызова команды ip=$(ip addr show wwp0s6u2i1 ... оно уже успевает установиться и интерфейс получает ip-адрес?
    Ответ написан