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