или наплодить состояний, оптимизировать автомат и потом пытаться понять, что же там не взлетело
Зачем? Вполне по силам написать утилиту, которая поправит таблицу и проведет, если надо оптимизацию.
В конце концов, системы типа parser builder'а как раз по БНФ строят таблицы. Тут — аналогично.
а если надо вывод сделать в половине состояний? А в другой половине состояний писать в UART?
одна микросхема для генерации секундных импульсов, три счётчика (60, 60 и 24) и два шифратора для индикатора. Всего шесть корпусов. Плюс один-два корпуса для защиты от дребезга контактов для кнопок настройки времени (мы же не китайцы
Так это все в старых часах и так есть, и генератор, и счетчики. Я, правда, не смотрел, как там дешифрация идет.
Возможно, я совсем-совсем ошибаюсь, но мне кажется, что мы можем описать mdlкой ряд страниц, смапить в виртуальное пространство, потом при расширении, смапить на следующие вирт. адреса встык новый кусок новой Mdlкой. Но может это работает только для драйверов, только для nonpaged памяти — не уверен. Так, чисто в порядке бреда.
О документированности: вот, пожалуйста, виндовые структурки:
//
// I/O system definitions.
//
// Define a Memory Descriptor List (MDL)
//
// An MDL describes pages in a virtual buffer in terms of physical pages. The
// pages associated with the buffer are described in an array that is allocated
// just after the MDL header structure itself. In a future compiler this will
// be placed at:
//
// ULONG Pages[];
//
// Until this declaration is permitted, however, one simply calculates the
// base of the array by adding one to the base MDL pointer:
//
// Pages = (PULONG) (Mdl + 1);
//
// Notice that while in the context of the subject thread, the base virtual
// address of a buffer mapped by an MDL may be referenced using the following:
//
// Mdl->StartVa | Mdl->ByteOffset
//
typedef struct _MDL {
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
} MDL, *PMDL;
Во-первых, кишки винды документированы, и вполне неплохо (да, да, я не сравниваю с Линуксом. Неплохо для проприетарной ос).
Во-вторых, в Линуксе модуль структурки не правит, это делается все равно через ядро и стандартный вызов, насколько я понимаю.
В Win есть Mdl, с которыми можно поиграться, но это на уровне драйверов/ядра.
Это не извращение. Это другой способ выполнить ту же задачу.
Вот когда-то давно видел, как на Visual Basic перегоняли из бинарной строки 4 байта в integer путем прохода циклом с получением ASCII кода и умножением-сложением — вот это извращение.
А представить поле данных как массив или структуру — просто другой метод работы с данными.
Речь шла о работе с устройствами, что из той-же оперы.
Вопрос был про volatile, который в контексте работы с периферией, как я понимаю, употребляется там, где железо (через тот же DMA) может что-то переписать. Нет?
Примеры, конечно, уровня Hello World, но в вашем случае это можно сделать только путем вызова функции, а это лишние действия по её вызову
Функцию, да.
Да и когда требуется вызвать одну инструкцию, городить целую функцию это слишком.
Так одна инструкция — предельный случай. Для обмена, емнип, есть встроенная функция swap. Байты можно поменять местами через тот же equivalence.
Просто бывает интересно именно восстанавливать вещи, не собирая новое в старом корпусе. У меня не такой большой опыт, вот и прикидываю, как надо делать сопряжение. Если у 176 серии слабые выходы, то по транзисторному каскаду на каждый выход?
Да не, по большому счету я согласен, что Фортран не так удобен для работы с аппаратурой — не тот инструмент просто.
Но все то же сделать можно, пусть и непривычным путем, кмк.
То что С для работы с бинарными данными и для побитовых операций вне конкуренции, сомнений не вызывает.
Тот же Delphi имеет такой же функционал по этой части.
Зачем? Вполне по силам написать утилиту, которая поправит таблицу и проведет, если надо оптимизацию.
В конце концов, системы типа parser builder'а как раз по БНФ строят таблицы. Тут — аналогично.
Вполне реализуемо.
Так это все в старых часах и так есть, и генератор, и счетчики. Я, правда, не смотрел, как там дешифрация идет.
О документированности: вот, пожалуйста, виндовые структурки:
Во-вторых, в Линуксе модуль структурки не правит, это делается все равно через ядро и стандартный вызов, насколько я понимаю.
В Win есть Mdl, с которыми можно поиграться, но это на уровне драйверов/ядра.
поллитрыпересекающихся графиков не обойтись — скорее всего, в точке 128к как раз наступает равновесие.Тут про winapi
Тут про dll
Это не извращение. Это другой способ выполнить ту же задачу.
Вот когда-то давно видел, как на Visual Basic перегоняли из бинарной строки 4 байта в integer путем прохода циклом с получением ASCII кода и умножением-сложением — вот это извращение.
А представить поле данных как массив или структуру — просто другой метод работы с данными.
Вопрос был про volatile, который в контексте работы с периферией, как я понимаю, употребляется там, где железо (через тот же DMA) может что-то переписать. Нет?
Функцию, да.
Так одна инструкция — предельный случай. Для обмена, емнип, есть встроенная функция swap. Байты можно поменять местами через тот же equivalence.
Отсутствие затрат на копирование должно покрывать такой overhead.
Но все то же сделать можно, пусть и непривычным путем, кмк.
Тот же Delphi имеет такой же функционал по этой части.