Jump to content
    

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

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

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

не помогает

 

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

Share this post


Link to post
Share on other sites

:)

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

добрый день!

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

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

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

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

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

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

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

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

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

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

Edited by dezna

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

1_EventFlag.lss.txt

Edited by dezna

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

        KEEP(SORT(*)(.ctors))

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

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

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

<Default_SystemTimer_ISR> - тоже

<__Init_Data> - тоже.

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

вот новый lss

1_EventFlag.lss.txt

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

Share this post


Link to post
Share on other sites

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

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

 

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...