|
|
  |
Вопросы по scmRTOS |
|
|
|
May 18 2009, 05:54
|

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

|
Цитата(ReAl @ May 16 2009, 19:17)  Если постараться - можно. В конструкторе TBaseProcess после Kernel.RegisterProcess(this), там, где формируется начальный стековый кадр, затолкать этот же this в такое место, чтобы после восстановления контекста он оказался в нужных регистрах. Только, насколько я понимаю, тип параметра exec у конструктора для этого должен быть другой - указатель на функцию-член. Да, согласен, если постараться, то можно. Раз уж готовим сами стековый кадр, то и внедрить туда this тоже можно. Только зачем? Я ни одной приличной причины не знаю. По своей сути функция exec - это функция пользователя. Ей от самого объекта-процесса ничего не надо. Т.е. это отдельная фукнция, просто помещенная в пространство имен процесса. С таким же успехом можно было бы создавать произвольные глобальные функции и подсовывать их в конструктор процесса. Ну, как сделано, так сделано.  В духе ++.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 18 2009, 11:37
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 18 2009, 12:24
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Ну вот, запустил  Только вот код много места занимает. С опцией компилятора -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. Но ответ хотелось бы знать  Как я понял, если следовать логике авторов ОС, то для Idle код надо вставлять в IdleProcessUserHook()? А где её определять? В своём модуле или в OS_Target_cpp.cpp? Наверное, в своём лучше...
--------------------
Благодарю заранее!
|
|
|
|
|
May 18 2009, 12:27
|

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

|
Цитата(n_bogoyavlensky @ May 18 2009, 15:12)  Ну вот, запустил  Только вот код много места занимает. С опцией компилятора -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)  Примеры смотрел. Но не так подробно все исходники. Времени пока нет. А у нас, значит, валом...
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 18 2009, 12:59
|
Профессионал
    
Группа: Участник
Сообщений: 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)  Пробовал, разницы нет...
--------------------
Благодарю заранее!
|
|
|
|
|
May 18 2009, 13:46
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 эти опции стоят, но я не упоминал их в том посте и сейчас для соответствия ему убрал)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 18 2009, 17:14
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(ReAl @ May 18 2009, 20:42)  Попробуйте разобраться - какие опции реально получает компилятор. Я-то всем управляю руками через самописній makefile, а сто там среда куда подставляет... Я пока не знаю как это сделать  Вроде, прописал всё куда нужно... Надо как-то попробовать включить полный вывод того, что делает среда... Цитата p.s. если у меня на уровне makefile отключить линкеру --gc-sections --relax, то віходит 3400-3500 байт в зависимости от версии компилятора Кстати, вот ещё что... Добавил в проект старый модуль на Си (xxx.c). Получил на все функции в нём сообщения о том, что они не определены... Переименовал файл в "xxx.cpp" - всё сразу нашлось. Почему? Добавлял-то я файл с расширением...
Сообщение отредактировал n_bogoyavlensky - May 18 2009, 17:19
--------------------
Благодарю заранее!
|
|
|
|
|
May 18 2009, 17:25
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 18 2009, 17:28
|
Профессионал
    
Группа: Свой
Сообщений: 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 файлами (если вы ими в своими проектами пользуетесь, надеюсь).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|