Это просто идея, которая мне нравится. Я не делают время-критичных устройств и лишний call-другой мне погоду не делает.
Как мне кажется, каждый такой «драйвер» получается крайне читаемым с точки зрения алгоритма работы. Но это лишь мое мнение
К примеру, у нас есть класс для уарт.
class Uart
{
public:
Uart (short ch, word bd, bool doinit);
Uart (short ch, word bd, word isrptr = 0);
~Uart(void);
static class Uart *self;
static void isr (void);
//тут какой-то код
protected:
//тут всякое разное
USART_TypeDef* Reg;
};
static class Uart *self;
Данный указатель на себя нужен для того, чтобы получить доступ к самому классу изнутри статической функции — нашего обработчика прерываний. Так как хоть привязки к классу нет, но статический метод имеет доступ к другим статическим членам класса.
USART_TypeDef* Reg
Является указателем на нужный нам регистр нужного порта для автоматизации.
В инициализации он устанавливается через блок switch, к примеру, так:
Это наш базовый placeholder, тут можно выполнять нужные нам действия.
Теперь мы поверх этого класса наследуемся, скажем, в класс GPS
class Gps: public Uart
{
public:
Gps(short ch, word bd) :
Uart::Uart(ch, bd, (word) &gpsisr)
{
Gps::self = this;
}
static void gpsisr(void);
static class Gps *self;
};
Спокойно пишем свой обработчик внутри GPS класса
void Gps::gpsisr(void)
{
if (self->Reg->SR & USART_SR_RXNE)
{
short a = self->Reg->DR;
self->Reg->SR &= ~USART_SR_RXNE;
if (self->ready)
{
return;
}
if (0 == self->nmeastr_len && '$' != a)
{
return;
}
.....................И.Т.Д.
}
}
Каждый объект — устройство, работающий поверх UART при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.
Я вот даже использую для этих целей статический член класса. И могу описывать прерывание внутри объекта, и каждый тип «драйвера» имеет свой обработчик. крайне читаемый код получается
спасибо огромное за столь развернутое объяснение. Я лишь пишу модели для Proteus на Lua, и хотел прикрутить SystemC ради более выразительного описания процессоров, нежели разрозненные модули выдумывая каждый раз что-то новое.
Я обратил внимание на QBox, он имеет уже интерфейс к Qemu, TLM 2.0
И вот даже готовые модули, к примеру, Cortex-M3
У меня всё очень любительское, но эту тема мне очень интересна
Ну, мне как любителю пишущему на плюсах это немного затратно, кмк. Мне систС нужен как конструктор для симуляторов, с удобным интерфейсом на TLE2.0. Через скрипты и прочее. Для того, чтобы не изобретать свои примитивы. А использовать удобную библиотеку.
Возможно просто не так поняли. У меня слово «стример» ассоциируется именно с TEAC MT-2ST и сокомпания, вроде тех что я подключал к спектруму в свое время. Ибо обычно употребляется «tape»/«ленточный накопитель»/«библиотека».
Но эт вопрос к саппорту, да
Очень люблю GTK+, но сейчас перехожу на QT просто потому, что устал от ужасов Glade:
Падения на сохранении проекта, фантомные объекты внутри XML после удаления объекта, который приходится удалять из файла руками, глюки при изменении текста полей: если начать править текст, он удалялся и прочее, прочее прочее.
Постепенно просто устал от этого. Последний раз им пользовался с полгода назад, собирая из исходников. То, что было в репах убунты было ещё хуже.
А жаль, тот же Broadway очень заинтересовал в свое время
А если учесть что это «не менее 500ч», то в реальности может быть и 2000 и более. А ВП серия так и в 10 раз дольше работает заявленного часто. Я вот свои не менял пока. Я давно не проверял, не ушли ли сеточные токи, но на слух хуже работать не стал за годы. А я ведь по дурости и предкаскад на 6Н1П сделал, сам не знаю зачем. И всё равно никаких проблем так и не встретил.
Как мне кажется, каждый такой «драйвер» получается крайне читаемым с точки зрения алгоритма работы. Но это лишь мое мнение
К примеру, у нас есть класс для уарт.
Данный указатель на себя нужен для того, чтобы получить доступ к самому классу изнутри статической функции — нашего обработчика прерываний. Так как хоть привязки к классу нет, но статический метод имеет доступ к другим статическим членам класса.
Является указателем на нужный нам регистр нужного порта для автоматизации.
В инициализации он устанавливается через блок switch, к примеру, так:
Где наш обработчик выглядит так
Это наш базовый placeholder, тут можно выполнять нужные нам действия.
Теперь мы поверх этого класса наследуемся, скажем, в класс GPS
Спокойно пишем свой обработчик внутри GPS класса
Каждый объект — устройство, работающий поверх UART при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.
Всё то же самое для SPI, I2C, DMA и прочих SDIO
Я обратил внимание на QBox, он имеет уже интерфейс к Qemu, TLM 2.0
И вот даже готовые модули, к примеру, Cortex-M3
У меня всё очень любительское, но эту тема мне очень интересна
Но эт вопрос к саппорту, да
В гуях тоже всё есть. Я просто привел пример
Падения на сохранении проекта, фантомные объекты внутри XML после удаления объекта, который приходится удалять из файла руками, глюки при изменении текста полей: если начать править текст, он удалялся и прочее, прочее прочее.
Постепенно просто устал от этого. Последний раз им пользовался с полгода назад, собирая из исходников. То, что было в репах убунты было ещё хуже.
А жаль, тот же Broadway очень заинтересовал в свое время
И правда — вверх лапами