Chudik 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Ну да. Через mutex обычно и делается. Спасибо. Насколько я понимаю, у тебя есть опыт работы с этой системой. Пока уважаемые авторы системы заняты, может подскажешь по поводу моей структуры. Нормально или что-то изменил бы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Не нашёл в документации других членов класса process кроме так exec. Это так и должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Не нашёл в документации других членов класса 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; /// и так далее..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Ага, спасибо, нашёл в доке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Возможно глупый вопрос: может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам? Конечно может быть и членом класса (экземпляр при этом - глобальная переменная) и глобальной переменной. Насчёт локальной не знаю, не думал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Локальной тоже может. Например, представьте, что у вас есть несколько пулов такого вида: 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... Очень удобно, спокойно пишу из любого потока. --- Ой, что-то я поспешил. Это же не локальные объекты, это как раз члены класса:) Зачем могут понадобиться локальные мутексы - с ходу не придумалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Локальной тоже может. Класс тоже может быть локальной переменной. Зачем могут понадобиться локальные мутексы - с ходу не придумалось. Говорят глобальные переменные - это плохо, чем их меньше, тем лучше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока. Вот, вот. На удивление нужно именно это ;) Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними? Дело в том, что в последний раз с С++ я работал лет 15 назад и потому сейчас приходится всё вспоминать по-новой. При этом тогда это были модели обработки сигналов на РС, которые потом перекидывались в DSP, но обработка уже писалась на соответствующем ассемблере. Т.е. мутексы просто не требовались. Так что не только вспоминать приходится, но и кое-что узнавать. Ещё хорошо, что с месяц назад поработал на подхвате на проекте с freeRTOS. Вспомнились приёмы работы с RTOS в принципе :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба Вот, вот. На удивление нужно именно это ;) Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними? А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )? Устраивают, но при отстутствии опыта работы с этой системой написать свои драйвера под неё в грамотном стиле займёт не меньше недели. Если не больше. А если автор системы сможет дать авторский вариант таких драйверов, это сильно упростит дело. В обмен потом смогу выложить драйвер графического дисплея в текстовом режиме, работающего по этому SPI. И попозже драйвер I2C, созданный по образу и подобию. RS485 на базе того же UART. Нужна точка опоры :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними? Вот 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба AHTOXA Огромное спасибо! Как раз первое, что я собирался делать - это дисплей через SPI. У меня уже сделан аналогичный дисплей тоже через SPI для предыдущего проекта без RTOS. Буду теперь соединять двух ёжиков :) Надеюсь, что это не займёт слишком много времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chudik 0 11 октября, 2012 Опубликовано 11 октября, 2012 · Жалоба 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. Надеюсь, что не придётся менять слишком много. Блин, разрываюсь между тремя проектами: пара хардверных и этот. Скорость написания никакая. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 октября, 2012 Опубликовано 12 октября, 2012 · Жалоба По-моему, вполне. В любом случае, по ходу дела всегда можно что-то подправить/изменить/добавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться