All streams
Search
Write a publication
Pull to refresh
46
0
Лаврентий Иванов @Pugnator

Пользователь

Send message
В целом я делаю так.

Тут описание
Это просто идея, которая мне нравится. Я не делают время-критичных устройств и лишний 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, к примеру, так:
__disable_irq();
self = this;
....
switch (channel)
.....
Reg = (USART_TypeDef*) USART1_BASE;
IRQ_VECTOR_TABLE[USART1_IRQn + IRQ0_EX] = isrptr;
....
init();
__enable_irq();


Где наш обработчик выглядит так
class Uart *Uart::self = nullptr;

...


void Uart::isr(void)
  {
    if (self->Reg->SR & USART_SR_RXNE) //receive
      {
        self->Reg->SR &= ~USART_SR_RXNE;
      }
    else if (self->Reg->SR & USART_SR_TC) //transfer
      {
        self->Reg->SR &= ~USART_SR_TC;
      }
  }


Это наш базовый 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 при создании ставят свой обработчик в таблицу прерываний, сохраняя предыдущее значение. В деструкторе восстанавливают предыдущее состояние.

Всё то же самое для SPI, I2C, DMA и прочих SDIO
Я вот даже использую для этих целей статический член класса. И могу описывать прерывание внутри объекта, и каждый тип «драйвера» имеет свой обработчик. крайне читаемый код получается
Говорят, you cannot teach an old dog new tricks, но чем чёрт ни шутит. В любом случае, спасибо за статью!
спасибо огромное за столь развернутое объяснение. Я лишь пишу модели для Proteus на Lua, и хотел прикрутить SystemC ради более выразительного описания процессоров, нежели разрозненные модули выдумывая каждый раз что-то новое.
Я обратил внимание на QBox, он имеет уже интерфейс к Qemu, TLM 2.0
И вот даже готовые модули, к примеру, Cortex-M3

У меня всё очень любительское, но эту тема мне очень интересна
Ну, мне как любителю пишущему на плюсах это немного затратно, кмк. Мне систС нужен как конструктор для симуляторов, с удобным интерфейсом на TLE2.0. Через скрипты и прочее. Для того, чтобы не изобретать свои примитивы. А использовать удобную библиотеку.
А подскажите, какую литературу порекомендуете по SysC. в сети лишь примитивное описание, вроде «создадим вентиль или-не»
все вокруг можно фольгой закрыть, оставив окошко над элементом. Но я тем же соломоном спокойно паяю stm32 тот же. Выпаивать можно и оплеткой
Возможно просто не так поняли. У меня слово «стример» ассоциируется именно с TEAC MT-2ST и сокомпания, вроде тех что я подключал к спектруму в свое время. Ибо обычно употребляется «tape»/«ленточный накопитель»/«библиотека».
Но эт вопрос к саппорту, да
Эм. А что мешает пользоваться LTO-1 даже? Поддерживаются все.
В гуях тоже всё есть. Я просто привел пример
2009-2010 как минимум. LTO-6 работает.
Ну, поддержка LTO есть уже много лет.
Это если изначально знать про это
Shogun — очень простой английский, читается очень хорошо, интересно. И вообще вся его азиатская серия
лежит такой от ЕС ЭВМ. на 8кбит, судя по количеству колец. все хочу подключить его к самоделке на Z80, но пока не до этого
А Вала разве не всё?
Очень люблю GTK+, но сейчас перехожу на QT просто потому, что устал от ужасов Glade:
Падения на сохранении проекта, фантомные объекты внутри XML после удаления объекта, который приходится удалять из файла руками, глюки при изменении текста полей: если начать править текст, он удалялся и прочее, прочее прочее.
Постепенно просто устал от этого. Последний раз им пользовался с полгода назад, собирая из исходников. То, что было в репах убунты было ещё хуже.
А жаль, тот же Broadway очень заинтересовал в свое время
Что-то ёкнуло в памяти и полез в гугл. Была у меня imageНота-М
И правда — вверх лапами
Из паспорта:
Работает в любом положении.
А если учесть что это «не менее 500ч», то в реальности может быть и 2000 и более. А ВП серия так и в 10 раз дольше работает заявленного часто. Я вот свои не менял пока. Я давно не проверял, не ушли ли сеточные токи, но на слух хуже работать не стал за годы. А я ведь по дурости и предкаскад на 6Н1П сделал, сам не знаю зачем. И всё равно никаких проблем так и не встретил.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity