реклама на сайте
подробности

 
 
10 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Вопросы по scmRTOS
sergeeff
сообщение May 18 2009, 05:49
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну и лады.
Go to the top of the page
 
+Quote Post
dxp
сообщение May 18 2009, 05:54
Сообщение #32


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ReAl @ May 16 2009, 19:17) *
Если постараться - можно.
В конструкторе TBaseProcess после Kernel.RegisterProcess(this), там, где формируется начальный стековый кадр, затолкать этот же this в такое место, чтобы после восстановления контекста он оказался в нужных регистрах. Только, насколько я понимаю, тип параметра exec у конструктора для этого должен быть другой - указатель на функцию-член.

Да, согласен, если постараться, то можно. Раз уж готовим сами стековый кадр, то и внедрить туда this тоже можно. Только зачем? Я ни одной приличной причины не знаю. По своей сути функция exec - это функция пользователя. Ей от самого объекта-процесса ничего не надо. Т.е. это отдельная фукнция, просто помещенная в пространство имен процесса. С таким же успехом можно было бы создавать произвольные глобальные функции и подсовывать их в конструктор процесса. Ну, как сделано, так сделано. smile.gif В духе ++. 


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 09:31
Сообщение #33


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



13. Что такое системный процесс Idle и для чего он нужен?

14. Как "сообщить" scmRTOS о том, что я в качестве системного таймера выбрал таймер Т0?

15. По поводу scmRTOS_SYSTIMER_NEST_INTS_ENABLE. Зачем разрешать вложенные прерывания в обработчике прерывания от системного таймера?
Для какой-нибудь очень важной и срочной задачи (если она есть)?

Сообщение отредактировал n_bogoyavlensky - May 18 2009, 09:35


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 18 2009, 11:37
Сообщение #34


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(n_bogoyavlensky @ May 18 2009, 12:31) *
13. Что такое системный процесс Idle и для чего он нужен?
Процессор выполняет его, когда все пользовательские процессы находятся в состоянии ожидания. В нем может быть, например, команда перевода процессора в спячку.
Цитата(n_bogoyavlensky @ May 18 2009, 12:31) *
14. Как "сообщить" scmRTOS о том, что я в качестве системного таймера выбрал таймер Т0?
Хороший. вопрос. Учитывая, что в примерах именно T0 уже выбран в качестве системного таймера.
Цитата(n_bogoyavlensky @ May 18 2009, 12:31) *
Зачем разрешать вложенные прерывания в обработчике прерывания от системного таймера?
Для какой-нибудь очень важной и срочной задачи (если она есть)?
Да. Для других прерываний, которые могут не использовать сервисы ОС.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 12:24
Сообщение #35


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Ну вот, запустил smile.gif
Только вот код много места занимает.
С опцией компилятора -Os, rtos.elf.hex - 8 кб, бинарный - около 3 кб.
Это нормально? Или для сокращения размера надо ещё что-нибудь в опции компилятора добавить?

Код
#include <avr/io.h>
#include <scmRTOS.h>

typedef OS::process<OS::pr0, 150> TProc1;
typedef OS::process<OS::pr1, 150> TProc2;

TProc1 Proc1;
TProc2 Proc2;

int main(void)
{
    DDRB |= _BV(PB0);
    DDRC |= _BV(PC5);

    TCCR0B = (1 << CS01) | (1 << CS00);    // clk/64
    TIMSK0 |=  (1 << TOIE0);

    OS::Run();

    return 0;
};

namespace OS
{
    template<> OS_PROCESS void TProc1::Exec()
    {
        for(;;)
        {
            if ((PORTB & _BV(PB0))) {PORTB &= ~_BV(PB0);} else {PORTB |= _BV(PB0);};
            Sleep(10);
        };
    };
};

namespace OS
{
    template<> OS_PROCESS void TProc2::Exec()
    {
        for(;;)
        {
            if ((PORTC & _BV(PC5))) {PORTC &= ~_BV(PC5);} else {PORTC |= _BV(PC5);};
            Sleep(10);
        };
    };
};


Цитата(Сергей Борщ @ May 18 2009, 15:37) *
Процессор выполняет его, когда все пользовательские процессы находятся в состоянии ожидания. В нем может быть, например, команда перевода процессора в спячку.


А ещё что там может быть? Что угодно с учётом того, что этот процесс самый низкоприоритетный?

Цитата
Хороший. вопрос. Учитывая, что в примерах именно T0 уже выбран в качестве системного таймера.


Примеры смотрел. Но не так подробно все исходники. Времени пока нет.
Пока нигде не "сообщал" и всё работает с Т0.
Но ответ хотелось бы знать smile.gif



Как я понял, если следовать логике авторов ОС, то для Idle код надо вставлять в IdleProcessUserHook()? smile.gif
А где её определять?
В своём модуле или в OS_Target_cpp.cpp?
Наверное, в своём лучше...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 18 2009, 12:27
Сообщение #36


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(n_bogoyavlensky @ May 18 2009, 15:12) *
Ну вот, запустил smile.gif
Только вот код много места занимает.
С опцией компилятора -Os, rtos.elf.hex - 8 кб, бинарный - около 3 кб.
Это нормально? Или для сокращения размера надо ещё что-нибудь в опции компилятора добавить?


http://electronix.ru/forum/index.php?s=&am...st&p=593569

Цитата(n_bogoyavlensky @ May 18 2009, 15:12) *
А ещё что там может быть? Что угодно с учётом того, что этот процесс самый низкоприоритетный?
И что он не может пользоваться "ожидающими" сервисами. Т.е. послать сигнал может, ждать его - нет.
Код
start = OS::GetTickCount();
while( (OS::GetTickCount() - start) < 10 );
может
Код
Sleep(10);
не может.

Хук, естественно, лучше в своём.

Цитата(n_bogoyavlensky @ May 18 2009, 15:12) *
Примеры смотрел. Но не так подробно все исходники. Времени пока нет.
А у нас, значит, валом...


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 12:59
Сообщение #37


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Нашёл:

В OS_Target_cpp.cpp определена функция:

Код
//    System timer ISR
//
OS_INTERRUPT void SYSTEM_TIMER_VECTOR(void)
{
    scmRTOS_ISRW_TYPE ISR;
    Kernel.SystemTimer();

  #if scmRTOS_SYSTIMER_HOOK_ENABLE == 1

    // enable nested interrupts ONLY if user hook enabled
  #if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 1
    ENABLE_NESTED_INTERRUPTS();
  #endif

    SystemTimerUserHook();
  #endif
}


А выбор вектора прерывания системного таймера осуществлён в scmRTOS_TARGET_CFG.h.
Здесь и выбираем нужный системный таймер.
А в main его инициализируем...

Код
//       System Timer stuff
//
//
#if defined(TIMER0_OVF0_vect)
#  define SYSTEM_TIMER_VECTOR TIMER0_OVF0_vect
#elif defined(TIMER0_OVF_vect)
#  define SYSTEM_TIMER_VECTOR TIMER0_OVF_vect
#else
#  error "Timer0 overflow vector not defined"
#endif

#if defined(TIMSK0)
#  define TIMSK0_REG TIMSK0
#elif defined(TIMSK)
#  define TIMSK0_REG TIMSK
#else
#  error "Timer0 interrupt mask register not defined"
#endif

#define LOCK_SYSTEM_TIMER()    ( TIMSK0_REG &= ~(1 << TOIE0) )
#define UNLOCK_SYSTEM_TIMER()  ( TIMSK0_REG |=  (1 << TOIE0) )


Цитата(ReAl @ May 18 2009, 16:27) *


Пробовал, разницы нет...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 18 2009, 13:46
Сообщение #38


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(n_bogoyavlensky @ May 18 2009, 15:59) *
Пробовал, разницы нет...

Странно.
Пример 1-EventFlag из порта - явно сложнее Вашего кода.
CFLAGS = -Os -ffunction-sections -fdata-sections
LDFLAGS = -Wl,--gc-sections -Wl,--relax

Код
======== Beginning of project event_flag processing
avr-gcc.exe (GCC) 4.2.2 (WinAVR 20071221)
...
==== Compiling ./src/main.cpp
==== Compiling ../scmRTOS/Common/OS_Kernel.cpp
==== Compiling ../scmRTOS/Common/OS_Services.cpp
==== Compiling ../scmRTOS/Common/usrlib.cpp
==== Compiling ../scmRTOS/AVR/OS_Target_cpp.cpp
==== Compiling ../scmRTOS/AVR/OS_Target_asm.S
==== Link to event_flag.elf
==== extract event_flag.hex
======== All OK, project size:
AVR Memory Usage
----------------
Device: atmega168
Program:    1792 bytes (10.9% Full)
(.text + .data + .bootloader)
Data:        444 bytes (43.4% Full)
(.data + .bss + .noinit)

Код
======== Beginning of project event_flag processing
avr-gcc.exe (GCC) 3.4.6
...
======== All OK, project size:
AVR Memory Usage
----------------
Device: atmega168
Program:    2084 bytes (12.7% Full)
(.text + .data + .bootloader)
Data:        444 bytes (43.4% Full)
(.data + .bss + .noinit)

Код
======== Beginning of project event_flag processing
avr-gcc.exe (WinAVR 20081205) 4.3.2
...
======== All OK, project size:
AVR Memory Usage
----------------
Device: atmega168
Program:    1686 bytes (10.3% Full)
(.text + .data + .bootloader)
Data:        444 bytes (43.4% Full)
(.data + .bss + .noinit)

Код
======== Beginning of project event_flag processing
avr-gcc.exe (WinAVR 20090313) 4.3.2
...
======== All OK, project size:
AVR Memory Usage
----------------
Device: atmega168
Program:    1664 bytes (10.2% Full)
(.text + .data + .bootloader)
Data:        444 bytes (43.4% Full)
(.data + .bss + .noinit)


-funsigned-bitfields -fshort-enums компилятору ещё немного уменьшает код, байт на тридцать в зависимости от версии компилятора (собственно, в примерах в makefile эти опции стоят, но я не упоминал их в том посте и сейчас для соответствия ему убрал)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 14:58
Сообщение #39


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Не могу понять... почему у меня тогда код почти в два раза больше? sad.gif
Что тут можно предпринять?

Сообщение отредактировал n_bogoyavlensky - May 18 2009, 15:15


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 18 2009, 16:42
Сообщение #40


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(n_bogoyavlensky @ May 18 2009, 17:58) *
Не могу понять... почему у меня тогда код почти в два раза больше? sad.gif
Что тут можно предпринять?
Попробуйте разобраться - какие опции реально получает компилятор. Я-то всем управляю руками через самописній makefile, а сто там среда куда подставляет...

p.s. если у меня на уровне makefile отключить линкеру --gc-sections --relax, то віходит 3400-3500 байт в зависимости от версии компилятора


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 17:14
Сообщение #41


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(ReAl @ May 18 2009, 20:42) *
Попробуйте разобраться - какие опции реально получает компилятор. Я-то всем управляю руками через самописній makefile, а сто там среда куда подставляет...


Я пока не знаю как это сделать sad.gif
Вроде, прописал всё куда нужно...
Надо как-то попробовать включить полный вывод того, что делает среда...

Цитата
p.s. если у меня на уровне makefile отключить линкеру --gc-sections --relax, то віходит 3400-3500 байт в зависимости от версии компилятора


Кстати, вот ещё что...
Добавил в проект старый модуль на Си (xxx.c).
Получил на все функции в нём сообщения о том, что они не определены...
Переименовал файл в "xxx.cpp" - всё сразу нашлось.
Почему?
Добавлял-то я файл с расширением...

Сообщение отредактировал n_bogoyavlensky - May 18 2009, 17:19


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 18 2009, 17:25
Сообщение #42


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(n_bogoyavlensky @ May 18 2009, 20:14) *
Добавил в проект старый модуль на Си (xxx.c).
Получил на все функции в нём сообщения о том, что они не определены...
Переименовал файл в "xxx.cpp" - всё сразу нашлось.
Почему?
Добавлял-то я файл с расширением...
В .h они были объявлены "как обычно" и при компиляции С++ файлов (других в проекте) компилятор, грубо говоря, пытался на них сослаться как на С++ - функции.
Надо внутренности этого h-файла охватить таким
Код
#ifdef __cplusplus
extern "C" {
#endif

// тут объявления всех функций из С-файла

#ifdef __cplusplus
}
#endif


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 18 2009, 17:28
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Уважаемый коллега!

Неужели вам в google трудно поискать ответы на тысячу раз расписанные вопросы совместной работы .с и .сpp модулей?

Вы своим пытливым взглядом не разглядивали устройство .h файлов в библиотеках? Так вот там есть такая кострукция:

Код
#ifdef __cplusplus

extern "C" {
#endif /* __cplusplus */

int            ааа(int j);
int            bbb(const char *s);

.....

#ifdef __cplusplus
}
#endif /* __cplusplus */


Это заставляет С++ -ный компилятор генерить С-совместимые (nonmangled) имена. Что и вам надо сделать с вашими .h файлами (если вы ими в своими проектами пользуетесь, надеюсь).
Go to the top of the page
 
+Quote Post
koluna
сообщение May 18 2009, 18:05
Сообщение #44


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Спасибо Вам всем большое smile.gif
Обязательно посмотрю подробнее.


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 18 2009, 18:08
Сообщение #45


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(n_bogoyavlensky @ May 18 2009, 22:05) *
Спасибо Вам всем большое smile.gif
Обязательно посмотрю подробнее.


Может надо взять за правило сначала посмотреть все по-подробнее, а уже потом...
Go to the top of the page
 
+Quote Post

10 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 09:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01529 секунд с 7
ELECTRONIX ©2004-2016