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

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

Угу, именно так.

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

 

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

 

 

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


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

Ничего не понимаю

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 */

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

 

Посоветуйте, что делать? :(

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


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

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

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


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

Логично, конечно.

Сейчас посмотрю. Мне казалось, что они одинаковые... :rolleyes:

 

======================

Посмотрел. Регистры совсем другие. Ладно, попробую разобраться.

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


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

Регистры переназначил. Функцию 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(); }

не помогает

 

Уфф... тяжко. Надеюсь, что когда проделаю первые шаги дальше будет легче :)

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


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

:)

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.)

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


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

Ага, спасибо, поменял. Полегчало. :)

Соотвественно, убрал свои изменения для второй части вопроса.

 

Теперь уже после того, как эта часть откомпилировалась, буду свой класс дисплея допиливать. :)

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


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

добрый день!

появилась необходимость использовать scmRTOS в своём проекте.

пробовал 1-EVENT на кристаллах: STM32F100CB и STM32F103VG.

не заработало ни на одном.

изменял только main.cpp на предмет светодиодов.

приборы взял заведомо рабочие.

ни один процесс не запускается, хотя в main() программа заходит. т.е. принудительно светодиоды при инициализации МК

включаются (на обеих железках).

использую GCC 4.6.2. может в компиляторе какой косяк?

собирается всё без ошибок. в makefile правил только компилятор, ну и загрузчик.

подскажите пожалуйста куда посмотреть? только начинаю разбираться с ОС.

Изменено пользователем dezna

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


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

Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело?

Для проверки попробуйте поменять TProc1::exec() вот на такую:

    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            sleep(500);
            PB0.On();
            sleep(500);
            PB0.Off();
        }
    }

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


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

Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело?

 

я об этом думал. подключал осцилограф.

на всякий случай попробовал - нет, не работает!

LSS файл для сравниения. замена Pin<'B', 0> - <'B', 11>, Pin<'B', 1> - <'B', 12>

1_EventFlag.lss.txt

Изменено пользователем dezna

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


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

В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались.

Что за компилятор у вас?

Попробуйте yagarto или kgp. С ними я проверял - работает.

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


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

В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались.

Что за компилятор у вас?

я просил товарища собрать мне рабочий пример. он у себя проверил - работает. на моей железке тоже.

так вот: компилятор уоптимизировал программу до "нельзя" (судя по размеру в 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)

 

Попробуйте yagarto или kgp. С ними я проверял - работает.

yagarto - под линук не нашёл

kgp - попробую

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

потому как все остальные проекты то работают.

 

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


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

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))

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


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

        KEEP(SORT(*)(.ctors))

уже лучше, но всё равно чего-то ещё не хватает

сравниваю один проект от 2-х компиляторов:

<OS::TBaseProcess::init_stack_frame - раза в 2 меньше

<Default_SystemTimer_ISR> - тоже

<__Init_Data> - тоже.

к сожалению в арм асме я "0", потому проанализировать не могу

вот новый lss

1_EventFlag.lss.txt

помогите пожалуйста добить этот вопрос!

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


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

Сложно сказать. Листинг практически идентичен моему. init_stack_frame и Default_SystemTimer_ISR - вообще один-в-один.

Должно работать!

 

ЗЫ. Если уж совсем не пойдёт, и вы боитесь самодельных сборок, то есть Sourcery CodeBench Lite, бывшая sourcery g++ lite. (качать ARM EABI Release).

 

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


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

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

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

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

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

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

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

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

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

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