Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: scmRtos для медных чайников
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Страницы: 1, 2, 3
_Артём_
Цитата(Chudik @ Oct 5 2012, 17:22) *
может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам?

Конечно может быть и членом класса (экземпляр при этом - глобальная переменная) и глобальной переменной.
Насчёт локальной не знаю, не думал.
AHTOXA
Локальной тоже может.
Например, представьте, что у вас есть несколько пулов такого вида:
Код
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... Очень удобно, спокойно пишу из любого потока.
---
Ой, что-то я поспешил. Это же не локальные объекты, это как раз члены классаsm.gif
Зачем могут понадобиться локальные мутексы - с ходу не придумалось.
_Артём_
Цитата(AHTOXA @ Oct 5 2012, 19:41) *
Локальной тоже может.

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

Цитата(AHTOXA @ Oct 5 2012, 19:41) *
Зачем могут понадобиться локальные мутексы - с ходу не придумалось.

Говорят глобальные переменные - это плохо, чем их меньше, тем лучше.
Chudik
Цитата(AHTOXA @ Oct 5 2012, 09:41) *
У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока.

Вот, вот. На удивление нужно именно это wink.gif
Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?
Дело в том, что в последний раз с С++ я работал лет 15 назад и потому сейчас приходится всё вспоминать по-новой.
При этом тогда это были модели обработки сигналов на РС, которые потом перекидывались в DSP, но обработка уже писалась на соответствующем ассемблере. Т.е. мутексы просто не требовались. Так что не только вспоминать приходится, но и кое-что узнавать.
Ещё хорошо, что с месяц назад поработал на подхвате на проекте с freeRTOS. Вспомнились приёмы работы с RTOS в принципе sm.gif
_Артём_
Цитата(Chudik @ Oct 6 2012, 02:59) *
Вот, вот. На удивление нужно именно это wink.gif
Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

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



Chudik
Цитата(_Артём_ @ Oct 5 2012, 18:03) *
А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )?

Устраивают, но при отстутствии опыта работы с этой системой написать свои драйвера под неё в грамотном стиле займёт не меньше недели. Если не больше. А если автор системы сможет дать авторский вариант таких драйверов, это сильно упростит дело.
В обмен потом смогу выложить драйвер графического дисплея в текстовом режиме, работающего по этому SPI. И попозже драйвер I2C, созданный по образу и подобию. RS485 на базе того же UART.
Нужна точка опоры sm.gif
AHTOXA
Цитата(Chudik @ Oct 6 2012, 05:59) *
Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

Вот SPI.h+Pin.h: Нажмите для просмотра прикрепленного файла
Используется это примерно так:
Создаём шаблон для устройства, подключённого к 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
AHTOXA
Огромное спасибо! Как раз первое, что я собирался делать - это дисплей через SPI.
У меня уже сделан аналогичный дисплей тоже через SPI для предыдущего проекта без RTOS. Буду теперь соединять двух ёжиков sm.gif Надеюсь, что это не займёт слишком много времени.
Chudik
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. Надеюсь, что не придётся менять слишком много.

Блин, разрываюсь между тремя проектами: пара хардверных и этот. Скорость написания никакая. sad.gif
AHTOXA
По-моему, вполне. В любом случае, по ходу дела всегда можно что-то подправить/изменить/добавить.
Chudik
Цитата(AHTOXA @ Oct 11 2012, 20:33) *
по ходу дела всегда можно что-то подправить/изменить/добавить.

Ну да, что и происходит.
Посмотри пожалуйста.

Код
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
      Pin<1, 4, 'L'> LCD_RST;   // Active 0, set to it during CSL
      uint8_t   status;         // 1/0 - On/Off. OLED requires to be off when not in use
      
      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:
      TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref);            
      void Set_contrast(uint8_t data);
      
      uint8_t getstatus(void);
      void On(void);    // Because of using OLED display
      void Off(void);   // Because of using OLED display
      
      void SetFont(uint8_t num);
      uint8_t GetFont(void);
      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 putchar(unsigned char ch, uint8_t xpos, uint8_t ypos);
      void putstring(char *string, uint8_t xpos, uint8_t ypos);
      void ShowFont(unsigned char num);
}


И несколько начальных функций. Не надо-ли что-то подправить? Хотелось бы понять перед тем, как перейду к описанию public функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. rolleyes.gif
Массив init приведён просто для референса. С ним как раз более-менее всё понятно. sm.gif
Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены sm.gif

Код
const uint8_t init[] =  {0x40,    //Display start line 0
                         0xa1,    //ADC reverse    <<<< Probably need to be changed
                         0xc0,    //Normal COM0...COM63
                         0xa6,    //Display normal
                         0xa2,    //Set Bias 1/9 (Duty 1/65)
                         0x2f,    //Booster, Regulator and Follower On
                         0xf8,    //Set internal Booster to 4x
                         0x00,
                         0x27,    //Contrast set
                         0x81,
                         0x16,
                         0xac,    //Set indicator
                         0x00,     //0x01,
                         0xAF, //};    //Display on
                         0xb0,    //Page start sddress 0
                         0x10,    //Set Higher Column Start Address 0
                         0x00     //Set Lower Column Start Address 0
                         };

/**************** Functions **************************************************/

void TDisplay::send_command(uint8_t *data, uint16_t count)
{
  LCD_RS::Off();    // switch to send command
  send_array(data, count);  // SPI CS controlled inside this function
}

void TDisplay::send_data(uint8_t *data, uint16_t count)
{
  LCD_RS::On();    // switch to send data
  send_array(data, count);  // SPI CS controlled inside this function
}

// Set symbol position in text mode
//Parameter:
//     x:    X - Position on screen (0 - 127)
//     y:    Y - Position on screen (0 - 8)
void TDisplay::goto_xy(uint8_t x, uint8_t y);
{
  uint8_t set[] = {0xb0, 0x10, 0x00};    //Control commands array
  set[0] += y;        //Y - Add Y Position to Set Page Start Address
  set[1] += x >> 4;   //High - Nibble auf Steuerbefehl addieren
  set[2] += x & 0x0f; //Low - Nibble auf Steuerbefehl addieren
  send_command(set, 3);
}

//TDisplay constructor
TDisplay::TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref)
{
  LCD_RST::Off();   // unreset LCD
  
  send_command((uint8_t *)init, sizeof(init));  // Initialization

    for(uint8_t line=0; line<8; line++) // clear display memory
    {
        goto_xy(0, line);
        spiref.select();
        send(0);
        spiref.deselect();
    }
}
AHTOXA
Я, честно говоря, не совсем понимаю, что я должен там высмотретьsm.gif
В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё.
Единственное замечание: если у вас шаблон
Код
template<typename cs_pin>
class TDisplay
{
...
, то реализация функций должна быть в том же *.h файле, и выглядеть вот так:
Код
template<typename cs_pin>
void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count)
{
...
Chudik
Ну, вот такие замечания и нужны sm.gif Спасибо.
Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам sm.gif Мне только, чтобы по форме правильно было.

А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.
AHTOXA
Цитата(Chudik @ Oct 14 2012, 00:54) *
А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр

Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле.
Короче, лучше про это почитать какую-нибудь книжкуsm.gif
Chudik
AHTOXA
получил сообщение в IAR
Код
Error[Pe020]: identifier "namespace" is undefined      D:\Designs\M3\Firmware\M3_Terminal\scmRTOS\Common\usrlib.h 52

Пример Event компилируется. В нём такой ошибки, естественно, не возникает.
Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал?

Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять... rolleyes.gif
AHTOXA
Я в IAR-е не копенгагенsm.gif
Сергей Борщ
QUOTE (Chudik @ Oct 18 2012, 02:45) *
identifier "namespace" is undefined
говорит о том, что вы пытаетесть C++ заголовочный файл компилировать в режиме C. А это возможно, если вы какой-то из заголовочных файлов ОС (вероятно scmRTOS.h) прямо или косвенно включили в какой-то из файлов с расширением .c
Chudik
Посмотрел опции компиляции. Там стоял автоматическкий выбор компилятора в зависимости от расширения. Поставил использование С++ - этот момент прошёл нормально.
Теперь пытаюсь понять, почему
Код
Error[Pe864]: spi_t is not a template D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19
Error[Pe020]: identifier "SPI1" is undefined D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19

при том, что spi.h включён в проект. rolleyes.gif
AHTOXA
А в файле M3_Terminal.h есть строчка
Код
#include "spi.h"

?
Chudik
Конечно:
Код
#ifndef M3_TERMINAL_H
#define M3_TERMINAL_H

#define CSL_used

#include "Peripheral\pin.h"
#include "Peripheral\spi.h"

typedef spi_t<SPI1> TSpi1;
extern    TSpi1 spi1;

typedef TDisplay < Pin<2, 5, 'L'> > TDisplay;
extern    TDisplay    display;

#endif  // M3_TERMINAL_H
AHTOXA
Хм. Странно.
1. Возможно где-то ещё есть объявление типа spi_t.
2. Я не разбираюсь в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.
Chudik
Разобрался, мой косяк был - кросс ссылки на файлы .h sm.gif
Цитата(AHTOXA @ Oct 18 2012, 12:49) *
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.

в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 wink.gif
_Артём_
Цитата(AHTOXA @ Oct 18 2012, 22:49) *
в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.

А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

К примеру в Eclipse или Visual Studio хидеры включаются в проект. IAR EW - тоже какбы-IDE.

Цитата(Chudik @ Oct 19 2012, 00:00) *
Разобрался, мой косяк был - кросс ссылки на файлы .h

Кросс ссылки - это что? Не представил...
AHTOXA
Цитата(Chudik @ Oct 19 2012, 03:00) *

sm.gif

Цитата(_Артём_ @ Oct 19 2012, 03:20) *
А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp.
Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.
Chudik
Цитата(AHTOXA @ Oct 18 2012, 21:54) *
Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.

Угу, именно так.
_Артём_
Цитата(Chudik @ Oct 19 2012, 23:22) *
Угу, именно так.

Это шаблон такой.

Когда в h-файлах содержится значительная часть проекта(шаблоны), то хотелось бы иметь возможность добраться до их содержимого простым кликом мыши.

Chudik
Ничего не понимаю
Код
Error[Pe020]: identifier "U0CTL" is undefined G:\My_Designs\RKI\M3\Firmware\M3_Terminal\Peripheral\spi.h 104

Где этот U0CTL определён? Когда начинаю искать, то указывает только на spi.h

Если подключаю "msp430.h", то эта ошибка исчезает, но при этом возникает другая:
Код
Error[Pe101]: "IE1" has already been declared in the current scope (at line 108 of "E:\Design\TI\IAR Systems\Embedded Workbench 6.4\430\inc\io430x24x.h") E:\Design\TI\IAR Systems\Embedded Workbench 6.4\430\inc\msp430f2410.h 133
          detected during compilation of secondary translation unit "G:\My_Designs\RKI\M3\Firmware\M3_Terminal\M3_Terminal.cpp"

посмотрел директории с файлами msp430...h Нашёл, что там кроме этого есть io430x....h , причём msp430... для С, а io430... = для С++. Хорошо, подумал я. Хоть не любитель менять системные файлы, но сделал следующее в msp430.h
Код
#ifdef __cplusplus
  #include <io430.h>
#else
  // здесь выбор кокретного файла, отвечающего за нужный чип
#endif /* ifdef __cplusplus */

Но при этом опять возвращается к первой ошибке из указанной здесь.

Посоветуйте, что делать? sad.gif
AHTOXA
Это же GCC-шные названия файлов и регистров у меня! Просто подключите IAR-овские, и поправьте несовпадающие названия регистров (типа U0CTL).
Chudik
Логично, конечно.
Сейчас посмотрю. Мне казалось, что они одинаковые... rolleyes.gif

======================
Посмотрел. Регистры совсем другие. Ладно, попробую разобраться.
Chudik
Регистры переназначил. Функцию rw для SPI подправил в соответствии с переписанными регистрами. Эта часть откомпилировалась.

Теперь вопросы:
в spi.h определено:
Код
template <spi_num_t>  // строка добавлена, поскольку без неё потом появлялась ошибка при использовании класса spi_base_t
class spi_base_t
{
private:
    OS::TMutex mutex;
public:
....


В соответствии с указаниями маэстро в http://electronix.ru/forum/index.php?showt...t&p=1099201
пишу
Код
typedef spi_base_t<SPI1> TSpi1;
extern    TSpi1 spi1;     // << line 19 in errors list

Соответственно получаю ошибку:
Код
Error[Pe322]: object of abstract class type "spi_base_t<(spi_num_t)1U>" is not allowed:  
            function "spi_base_t<<unnamed>>::rw [with <unnamed>=(spi_num_t)1U]" is a pure virtual function
           G:\My_Designs\RKI\M3\Firmware\M3_Terminal\M3_terminal.h 19


Также на описание класса spi_t в spi.h
Код
template <spi_num_t spi_num>
class spi_t : public spi_base_t <spi_num>    // added <spi_num>
{
private:
    typedef spi_regs_t<spi_num> regs;
    typedef spi_pins_t<spi_num> pins_t;
    typedef typename pins_t::PinSCK SCK;
    typedef typename pins_t::PinMISO MISO;
    typedef typename pins_t::PinMOSI MOSI;
public:
    spi_t(): spi_base_t() { init(); }     // << line 151 in errors list

получаю следующие ошибки:
Код
Error[Pe441]: argument list for class template "spi_base_t" is missing G:\My_Designs\RKI\M3\Firmware\M3_Terminal\Peripheral\spi.h 151


пытался ставить
Код
spi_t(): spi_base_t(spi_num) { init(); }
spi_t(): spi_base_t<spi_num> { init(); }
не помогает

Уфф... тяжко. Надеюсь, что когда проделаю первые шаги дальше будет легче sm.gif
AHTOXA
sm.gif
1. spi_base_t - это не шаблонный класс, не надо к нему добавлять "template <spi_num_t>".
2. spi_base_t - это абстрактный класс, нельзя создавать его экземпляры. Замените
typedef spi_base_t<SPI1> TSpi1;
на
typedef spi_t<SPI1> TSpi1;
(Идея spi_base_t в том, чтобы иметь базовый класс для всех реализаций SPI. Мы можем передавать ссылку на него в конструкторы других объектов, которые висят на SPI.)
Chudik
Ага, спасибо, поменял. Полегчало. sm.gif
Соотвественно, убрал свои изменения для второй части вопроса.

Теперь уже после того, как эта часть откомпилировалась, буду свой класс дисплея допиливать. sm.gif
dezna
добрый день!
появилась необходимость использовать scmRTOS в своём проекте.
пробовал 1-EVENT на кристаллах: STM32F100CB и STM32F103VG.
не заработало ни на одном.
изменял только main.cpp на предмет светодиодов.
приборы взял заведомо рабочие.
ни один процесс не запускается, хотя в main() программа заходит. т.е. принудительно светодиоды при инициализации МК
включаются (на обеих железках).
использую GCC 4.6.2. может в компиляторе какой косяк?
собирается всё без ошибок. в makefile правил только компилятор, ну и загрузчик.
подскажите пожалуйста куда посмотреть? только начинаю разбираться с ОС.
AHTOXA
Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело?
Для проверки попробуйте поменять TProc1::exec() вот на такую:
Код
    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            sleep(500);
            PB0.On();
            sleep(500);
            PB0.Off();
        }
    }
dezna
Цитата(AHTOXA @ Jan 21 2013, 15:10) *
Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело?


я об этом думал. подключал осцилограф.
на всякий случай попробовал - нет, не работает!
LSS файл для сравниения. замена Pin<'B', 0> - <'B', 11>, Pin<'B', 1> - <'B', 12>
Нажмите для просмотра прикрепленного файла
AHTOXA
В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались.
Что за компилятор у вас?
Попробуйте yagarto или kgp. С ними я проверял - работает.
dezna
Цитата(AHTOXA @ Jan 21 2013, 20:22) *
В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались.
Что за компилятор у вас?

я просил товарища собрать мне рабочий пример. он у себя проверил - работает. на моей железке тоже.
так вот: компилятор уоптимизировал программу до "нельзя" (судя по размеру в 3 раза).
там нет упоминания о процессах вообще. судя по всему он посчитал включение выключение выходов не существенным!
как это обойти?
компилятор gcc-4.6.2
вот флаги сборки:
Using built-in specs.
COLLECT_GCC=/opt/arm-elf/bin/arm-elf-gcc-4.6.2
COLLECT_LTO_WRAPPER=/opt/arm-elf/libexec/gcc/arm-elf/4.6.2/lto-wrapper
Target: arm-elf
Configured with: ../gcc-4.6.2/configure --prefix=/opt/arm-elf --target=arm-elf --with-gnu-ld --with-gnu-as --disable-nls --disable-libssp --enable-interwork --enable-multilib --with-newlib --with-headers=../newlib-1.20.0/newlib/libc/include/ --enable-languages=c,c++ --with-float=soft --without-ppl
Thread model: single
gcc version 4.6.2 (GCC)

Цитата(AHTOXA @ Jan 21 2013, 20:22) *
Попробуйте yagarto или kgp. С ними я проверял - работает.

yagarto - под линук не нашёл
kgp - попробую
но конечно хотелось бы разобраться с моей сборкой. могу куда-нибудь скинуть для проверки.
потому как все остальные проекты то работают.
AHTOXA
Цитата(dezna @ Jan 22 2013, 10:58) *
COLLECT_GCC=/opt/arm-elf/bin/arm-elf-gcc-4.6.2

А, у вас не-eabi сборка. Она складывает конструкторы в другое место.
Попробуйте в скрипт линкера после строки
Код
        KEEP(SORT(*)(.init_array))  /* eabi uses .init_array for static constructor lists */

вставить
Код
        KEEP(SORT(*)(.ctors))
dezna
Цитата(AHTOXA @ Jan 22 2013, 09:47) *
Код
        KEEP(SORT(*)(.ctors))

уже лучше, но всё равно чего-то ещё не хватает
сравниваю один проект от 2-х компиляторов:
<OS::TBaseProcess::init_stack_frame - раза в 2 меньше
<Default_SystemTimer_ISR> - тоже
<__Init_Data> - тоже.
к сожалению в арм асме я "0", потому проанализировать не могу
вот новый lss
Нажмите для просмотра прикрепленного файла
помогите пожалуйста добить этот вопрос!
AHTOXA
Сложно сказать. Листинг практически идентичен моему. init_stack_frame и Default_SystemTimer_ISR - вообще один-в-один.
Должно работать!

ЗЫ. Если уж совсем не пойдёт, и вы боитесь самодельных сборок, то есть Sourcery CodeBench Lite, бывшая sourcery g++ lite. (качать ARM EABI Release).
IgorKossak
Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет.
dezna
Цитата(AHTOXA @ Jan 22 2013, 12:20) *
Сложно сказать. Листинг практически идентичен моему. init_stack_frame и Default_SystemTimer_ISR - вообще один-в-один.
Должно работать!

но не хочет. может ещё какие-нибудь отличия имеются?
пытался kgp слить - там 64 бит версия. не пошла.
Цитата(AHTOXA @ Jan 22 2013, 12:20) *
ЗЫ. Если уж совсем не пойдёт, и вы боитесь самодельных сборок

сам собирал gcc. просто, как говорится, на ходу коней не меняют. чтоб не отказались остальные проекты работать.
а иметь под каждый проект свой компилятор - не айс, да и места не напасёшься.
потому вот и хотелось добить. то что это компилятор это понятно. осталось понять как это обойти.
mdmitry
Цитата(IgorKossak @ Jan 22 2013, 11:32) *
Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет.

Так он только С поддерживает, или я не прав?
(Programming Languages: C )

P.S. Сам и отвечу: не прав. В сообщении №97 IgorKossak'а указана ссылка в которой присутствуют оба компилятора (проверил архив для linux).
dezna
Цитата(IgorKossak @ Jan 22 2013, 12:32) *
Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет.

спасибо попробую
AHTOXA
Цитата(dezna @ Jan 22 2013, 16:11) *
но не хочет. может ещё какие-нибудь отличия имеются?

Я добросовестно просмотрел весь листинг. Различия на уровне кодогенерации, ничего криминального. Всё, что надо - присутствует, и вызывается.
В плане шаманства - попробуйте закомментировать в makefile строчки
Код
    CFLAGS    += -ffunction-sections -fdata-sections
,
Код
    CXXFLAGS    += -ffunction-sections -fdata-sections
и
Код
    LD_FLAGS    += -Wl,--gc-sections

Ну и ещё раз проверьте, что тип процессора, определённый в makefile, соответствует реальному.


Цитата(IgorKossak @ Jan 22 2013, 14:32) *
Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro.
Я поискал на страничке по ссылке слово "Linaro", и не нашёл. Потом погуглил, и нашёл другую страничку с тулчейном от Linaro sm.gif
Судя по ответам на первом сайте:
Цитата
GCC ARM Embedded (call Embedded later) is tuned for Cortex-M/R. Linaro GCC
(call Linaro later) is tuned for Cortex-A.
Embedded values code size more than performance. Linaro vice versa.

Embedded has a longer release cycle (1 year) and longer maintenance cycle
(2 years). Usually no features or optimizations will be added in
maintenance period. Linaro has monthly release to follow closely to
mainline with latest optimization for newest processors.

Embedded mainly targets bare-metal or RTOS applications. Linaro mainly
targets Linux/Andriod kernel/applications.

, для нас больше подходит первый вариант. Но он - не Linaro.
dezna
Цитата(AHTOXA @ Jan 22 2013, 14:57) *
Я добросовестно просмотрел весь листинг. Различия на уровне кодогенерации, ничего криминального. Всё, что надо - присутствует, и вызывается.
В плане шаманства - попробуйте закомментировать в makefile строчки

это не понадобилось, хоть и попробовал. всё заработало после правки ld скрипта, за что огромное спасибо.
всё оказалось гораздо прозаичнее. связано с программатором и каким-то образом с прерываниями (нога BOOT0 к +VCC постоянно).
при выключеных прерываниях всё работает, а как разрешаются, то похоже проц переходит на встроенный загрузчик программ.
что и происходило. в main() дёргались светодиоды 3 раза, а когда запускалась ось - всё "висло".

Цитата(AHTOXA @ Jan 22 2013, 14:57) *
для нас больше подходит первый вариант. Но он - не Linaro.

скачал первый вариант, попробовал. всё работает, как и на моём (уже). только код он раздувает почти в 2 раза.
моим HEX файл - 3725 байт
скачаным - 5705
задумался!
IgorKossak
Цитата(AHTOXA @ Jan 22 2013, 12:57) *
Я поискал на страничке по ссылке слово "Linaro", и не нашёл.

На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу. Это как раз то, что нужно.
demiurg_spb
Цитата(IgorKossak @ Jan 22 2013, 15:49) *
На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу. Это как раз то, что нужно.
А я с другого сайта http://www.coocox.org/CoIDE/Compiler_Settings.html,
где мне понравилась фраза:
Цитата
CooCox suggest you to choose ARM GCC as the compiler since it is from ARM official.
Выходит что Linaro - под крылом ARM...
IgorKossak
Цитата(demiurg_spb @ Jan 22 2013, 14:58) *
Выходит что Linaro - под крылом ARM...

Где-то в переписке читал, что разработчики Linaro и есть сотрудники ARM.
AHTOXA
Цитата(IgorKossak @ Jan 22 2013, 17:49) *
На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу.

А, теперь всё понятно. Но давайте всё же для однозначности будем называть эту сборку "GCC ARM Embedded", как они сами её называют?
Надо затестить её, и, если всё нормально, то использовать её как референсную. А то sourcery g++ lite теперь просто так не скачать, да и вообще будущее её неясно.
А тут всё же ARM участвует, солидноsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.