Перейти к содержанию
    

scmRtos для медных чайников

Ну да. Через mutex обычно и делается.

Спасибо.

Насколько я понимаю, у тебя есть опыт работы с этой системой. Пока уважаемые авторы системы заняты, может подскажешь по поводу моей структуры. Нормально или что-то изменил бы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не нашёл в документации других членов класса process кроме так exec. Это так и должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не нашёл в документации других членов класса process кроме так exec. Это так и должно быть?

Да, где-то так:

        template<TPriority pr, size_t stack_size>
        class process : public TBaseProcess
        {
        public:
            INLINE_PROCESS_CTOR process();

            OS_PROCESS static void exec();
            
        #if scmRTOS_PROCESS_RESTART_ENABLE == 1
            INLINE void terminate();
        #endif

 

Но так как process насладник TBaseProcess,

то есть ещё методы, перешедшие по наследству от TBaseProcess:

        static void sleep(timeout_t timeout = 0);
               void wake_up();
               void force_wake_up();
        INLINE void start() { force_wake_up(); }

        INLINE bool is_sleeping() const;
        INLINE bool is_suspended() const;
        /// и так далее.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно глупый вопрос: может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам?

Конечно может быть и членом класса (экземпляр при этом - глобальная переменная) и глобальной переменной.

Насчёт локальной не знаю, не думал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локальной тоже может.

Например, представьте, что у вас есть несколько пулов такого вида:

class Pool {
public:
    void lock()             { mutex_.lock(); }
    void unlock()           { mutex_.unlock(); }
    bool try_to_lock()      { return mutex_.lock_softly(); }
    ...
private:
    OS::TMutex mutex_;
    ...
}

У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока.

---

Ой, что-то я поспешил. Это же не локальные объекты, это как раз члены класса:)

Зачем могут понадобиться локальные мутексы - с ходу не придумалось.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локальной тоже может.

Класс тоже может быть локальной переменной.

 

Зачем могут понадобиться локальные мутексы - с ходу не придумалось.

Говорят глобальные переменные - это плохо, чем их меньше, тем лучше.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока.

Вот, вот. На удивление нужно именно это ;)

Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

Дело в том, что в последний раз с С++ я работал лет 15 назад и потому сейчас приходится всё вспоминать по-новой.

При этом тогда это были модели обработки сигналов на РС, которые потом перекидывались в DSP, но обработка уже писалась на соответствующем ассемблере. Т.е. мутексы просто не требовались. Так что не только вспоминать приходится, но и кое-что узнавать.

Ещё хорошо, что с месяц назад поработал на подхвате на проекте с freeRTOS. Вспомнились приёмы работы с RTOS в принципе :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот, вот. На удивление нужно именно это ;)

Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )?

Устраивают, но при отстутствии опыта работы с этой системой написать свои драйвера под неё в грамотном стиле займёт не меньше недели. Если не больше. А если автор системы сможет дать авторский вариант таких драйверов, это сильно упростит дело.

В обмен потом смогу выложить драйвер графического дисплея в текстовом режиме, работающего по этому SPI. И попозже драйвер I2C, созданный по образу и подобию. RS485 на базе того же UART.

Нужна точка опоры :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

Вот SPI.h+Pin.h: spi_msp430.zip

Используется это примерно так:

Создаём шаблон для устройства, подключённого к SPI (в данном случае - цепочка микросхем Max7219)

template<int chip_count, typename cs_pin>
class TMax7219
{
    private:
        spi_base_t& spi;
        typedef cs_pin CS;
        inline void select(void) { spi.lock(); CS::On(); }
        inline void deselect(void) { CS::Off(); spi.unlock();  }
        inline void write(uint16_t w) { spi << w; }
        void write_all(uint16_t w) {
            select();
            for (int i = chip_count; i; i--)
                write(w);
            deselect();
        }
    public:
        TMax7219(spi_base_t& spiref)
            : spi(spiref)
            {
                CS::Off();
                CS::Direct(OUTPUT);
            }
        void set_sleep(bool value) { write_all(value ? 0x0C00 : 0x0C01); }
        void set_test(bool value) { write_all(value ? 0x0F01 : 0x0F00); }
        void set_brightness(uint8_t value) { write_all(0x0A00 | (value & 0x0f)); }
...
}

 

Затем (файл hw.h):

#include "pin.h"
#include "spi.h"

typedef spi_t<SPI1> TSpi1;
extern TSpi1 spi1;

#include "max7219.h"
typedef TMax7219<2, Pin<5, 4, 'L'> > TMax7219;
extern TMax7219 Max;

 

И, наконец, hw.cpp:

TSpi1 spi1;
TMax7219 Max(spi1);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AHTOXA

Огромное спасибо! Как раз первое, что я собирался делать - это дисплей через SPI.

У меня уже сделан аналогичный дисплей тоже через SPI для предыдущего проекта без RTOS. Буду теперь соединять двух ёжиков :) Надеюсь, что это не займёт слишком много времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AHTOXA

Прикинул объявление класса для дисплея. Посмотри пожалуйста с точки зрения формы и логичности. Может что-то подправить?

template<typename cs_pin>
class TDisplay
{
  private:
      spi_base_t& spi;
      typedef cs_pin LCD_CS;
      
      Pin<2, 6, 'H'> LCD_RS;    // H for Data, L for Command
      
      unsigned char   *font;
      uint8_t fontnumber, fontwidth, fontheight;
      uint8_t x, y; // position on the screen
      
      inline void select(void) { spi.lock(); LCD_CS::On(); }
      inline void deselect(void) { LCD_CS::Off(); spi.unlock();  }
      inline void send(uint8_t data) { spi << data; }
      void send_array(uint8_t *data, uint16_t count)
      { select();
        for(uint16_t i=0; i<count; i++)
          spi << data[i];
        deselect();
      }
      void send_command(uint8_t *data, uint16_t count);
      void send_data(uint8_t *data, uint16_t count);
      void goto_xy(uint8_t x, uint8_t y);
  public:
      void TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref);            
      void Set_contrast(uint8_t data);
      void ClrLines(unsigned char startline, unsigned char linesnum);    // Clear number of text lines
      void ClrText(unsigned char line, unsigned char xpos, unsigned char length); // Clear part of the line

      void SetFont(uint8_t num);
      uint8_t GetFont(void);
      void putchar(unsigned char ch, uint8_t xpos, uint8_t ypos);
      void putstring(char *string, uint8_t xpos, uint8_t ypos);
      void ShowSoftFont(unsigned char num);

}

 

Здесь только для вывода текста. Мне пока графика не нужна.

Функции будут описаны в другом файле. Они есть в виде функций C. Надеюсь, что не придётся менять слишком много.

 

Блин, разрываюсь между тремя проектами: пара хардверных и этот. Скорость написания никакая. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, вполне. В любом случае, по ходу дела всегда можно что-то подправить/изменить/добавить.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...