URAN 0 20 февраля, 2008 Опубликовано 20 февраля, 2008 · Жалоба Хочется научиться работать с этой штукой - scmRTOS & AVR(Atmega8) & IAR 4.30A ! Почитал темы которые есть на форуме, почитал User's Manual v2. Возникло некторое количество вопросов: 1. Какая последовательность создания проекта: мои предположения - создаем в IAR новый проект, тискаем добавить файлы в проект и добавляем OS_Kernel.cpp , OS_Services.cpp , OS_Target_asm.s90 , OS_Target_cpp.cpp , usrlib.cpp. В maim.cpp пишем #include <scmRTOS.h> . Затем каким то образом нужно создать самому как я понял scmRTOS_TARGET_CFG.h и scmRTOS_CONFIG.h, но как не ясно или их нужно тупо скопировать из примера автора и если что нада то менять. 2. Почему в примерах автор добавляет void OS::SystemTimerUserHook() { } void OS::IdleProcessUserHook() { } Так нужно делать всегда ? 3. Дальше >> понятно что для AVR передачу управления можно осуществить сгенерировав прерывание например от компоратора как описано в документации, но непонятно как нужно оформить функцию обработки этого прерывания, и чем она будет отличаться от функции обработки других прерываний. О взаимодействии между потоками пока вроде понятно. Может кто нить может описать последовательность начальных действий и привести пример кода или хотя бы шапку , где есть процессы и обработчики прерываний и передача управления. Мог написать что - нибудь глупое, потому как в круг моих понятий scmRTOS пока входит очень туманно или вообще не входит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 21 февраля, 2008 Опубликовано 21 февраля, 2008 · Жалоба . Затем каким то образом нужно создать самому как я понял scmRTOS_TARGET_CFG.h и scmRTOS_CONFIG.h, но как не ясно или их нужно тупо скопировать из примера автора и если что нада то менять. Можно и так, и так. Как больше нравится. Чем плохо взять имеющиеся и откорретировать под свои потребности? 2. Почему в примерах автор добавляет void OS::SystemTimerUserHook() { } void OS::IdleProcessUserHook() { } В примерах для иллюстрации. Если они нужны, оставьте и используйте, не нужны, уберите. Все в ваших руках. Так нужно делать всегда ? 3. Дальше >> понятно что для AVR передачу управления можно осуществить сгенерировав прерывание например от компоратора как описано в документации, но непонятно как нужно оформить функцию обработки этого прерывания, и чем она будет отличаться от функции обработки других прерываний. О взаимодействии между потоками пока вроде понятно. Может кто нить может описать последовательность начальных действий и привести пример кода или хотя бы шапку , где есть процессы и обработчики прерываний и передача управления. Есть полноценный рабочий пример. Под IAR. Возьмите его за основу. Используйте в качестве "рыбы" для своего проекта. Используйте его в качестве референса, когда возникает вопрос, как сделать ту или иную базовую вещь. Пока не придет собственное устойчивое понимание (тогда будете сразу делать по-своему). Используйте его для исследования того, что реально происходит в процессоре, гоняя пример в отладчике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 21 февраля, 2008 Опубликовано 21 февраля, 2008 · Жалоба Вот взял из примера , это обработчик прерывания, кторый как я понял работает для передачи управления, но каким образо не понятно : #pragma vector=TIMER1_COMPA_vect OS_INTERRUPT void Timer1_period_ISR() { OS::TISRW_SS ISRW; ENABLE_NESTED_INTERRUPTS(); //-------------------------------------------------- // // Message test // // Send data as message // TMamont m; // create message content m.src = TMamont::ISR_SRC; m.data = 10; MamontMsg = m; // put the content to the OS::message object PORTB |= (1 << 4); MamontMsg.sendISR(); // send the message } В main разрешены 3 прерывания , а обработчик описан только один, че за ..... int main() { DDRB |= (1 << 4); TCCR1B |= (1 << WGM12); // CTC mode OCR1A = 10005; // TCCR1B |= (1 << CS10); // Timer1 run with prescaling 1 TIMSK |= (1 << OCIE1A); // Timer1 OC interrupt enable--------------1 ое TCCR0 = 0x03; // Start System Timer TIMSK |= (1 << TOIE0); //-----------------------------------------------2 ое ACSR |= (1 << ACBG) | (1 << ACIE); /* Ref ON, IE ON */ -----------3 е DDRB |= (1 << 3); /* AIN1*/ OS::Run(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 21 февраля, 2008 Опубликовано 21 февраля, 2008 (изменено) · Жалоба С предыдущим вроде разобрался, все оказалось проще чем я думал, вопросы о следующем: Что зачит вот это ENABLE_NESTED_INTERRUPTS(); написанное в обработчике прерывания Почему в main нету глобального разрешения прерывания, как без него может произойти прерывание от таймера да и вообще любое, или где то в ядре прописывается (я понял что так и есть ) ?, Зачем нужны прерывания от системного таймера ? Все относится к примерам из папки самой операционки. И еще как в IAR можно изменить имя проекта ? Изменено 21 февраля, 2008 пользователем URANst Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 февраля, 2008 Опубликовано 21 февраля, 2008 · Жалоба ENABLE_NESTED_INTERRUPTS(); - разрешить вложенные прерывания. Прерывания разрешаются при выполнении OS::Run(); которая, как изволите видеть, вызывается именно из main. Прерывания от системного таймера нужны для выполнения функции Sleep() с параметром и для осуществления ожиданий сигналов, семафоров и прочих сервисов с задержкой. Имя проекта можно заменить в проводнике Windows, а потом открыть новый проект в IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
URAN 0 21 февраля, 2008 Опубликовано 21 февраля, 2008 · Жалоба Так получается что 1 прерывание сис таймера - это единица задержки для сервисов ? Т.е. если кварц 8 МГц, то единица задержки для сервисов == 1/(8 MГц/64)*256 (установлен делитель 64 для TIMER0), тогда что возвращает GetTickCount == количество прерываний сис таймера с момента начала работы ОС ? Зачем может понадобиться прерывать апаратное прерывание контроллера, разве это хорошо ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 21 февраля, 2008 Опубликовано 21 февраля, 2008 · Жалоба Так получается что 1 прерывание сис таймера - это единица задержки для сервисов ? Т.е. если кварц 8 МГц, то единица задержки для сервисов == 1/(8 MГц/64)*256 (установлен делитель 64 для TIMER0), тогда что возвращает GetTickCount == количество прерываний сис таймера с момента начала работы ОС ? Да и да. Ответы на это есть в документации :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 2 марта, 2008 Опубликовано 2 марта, 2008 · Жалоба Тоже решил попробовать эту ОС. Долго не мог решится из-за отсутствия опыта работы в С++. Хочу "прикрутить" эту ОС к своему проекту на Си. Кстати, как это правильней сделать : добавить мои исходники на Си к smcRTOS или можно еще как-то? Взял тестовый пример. Удачно скомпилился под Megs32. А под Megs324P выдает кучу ошибок (порядка 270). В чем засада, не пойму. Ведь Мега324 должна быть полностью совместима с Мегой32 ? PS. Может быть проблема в этом: I/O Mapping and SRAM The I/O memory space contains 64 addresses for CPU peripheral control registers. The ATmega164P/324P/644P I/O space and I/O range are changed and extended compared to ATmega16/32. The extended I/O space goes from 0x60 to 0xFF in data memory space where ST/STS/STD and LD/LDS/LDD instructions must be used. The memory map is slightly different between the ATmega16/32 and the ATmega164P/324P/644P due to extended I/O space. The ATmega164P/324P/644P internal data SRAM addressing starts at 0x100 as opposed to 0x60 in ATmega16/32. Это из документа AVR505: Migration between ATmega16/32 and ATmega164P/324P/644P PS2/// Вот так всегда. Ломаешь голову второй день... А как-только напишешь в форум, так сразу нашел в чем проблема. У Меги324 в файле iom324p.h есть определения: /* SREG */ #define I 7 #define T 6 #define H 5 #define S 4 #define V 3 #define N 2 #define Z 1 #define C 0 Выдает первые ошибки на эти строки: Error[Pe040]: expected an identifier template<typename T, word size, class S> friend class channel; template<typename T> friend class message; Т.е. я так понял имеется переопределение идентификаторов T и S. Главное, что раньше я сталкивался с такой проблемой, когда присваивал переменным одну букву... И все-таки, как бы эту проблему "красиво" решить? PS3. Я могу ошибиться, но разве OS_Kernel не имеет собственного namespace дабы избегать подобные проблемы? :unsure: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 3 марта, 2008 Опубликовано 3 марта, 2008 · Жалоба Выдает первые ошибки на эти строки: Error[Pe040]: expected an identifier template<typename T, word size, class S> friend class channel; template<typename T> friend class message; Т.е. я так понял имеется переопределение идентификаторов T и S. Главное, что раньше я сталкивался с такой проблемой, когда присваивал переменным одну букву... И все-таки, как бы эту проблему "красиво" решить? PS3. Я могу ошибиться, но разве OS_Kernel не имеет собственного namespace дабы избегать подобные проблемы? :unsure: Тут дело не в пространствах имен, а в том, что препроцессор работает до компилятора и делает просто тупую текстовую подстановку, поэтому к моменту работы компилятора (анализа текста, разрешения имен и прочего) вместо T уже все подставлено. Яркий пример кривизны препроцессора и хорошая иллюстрация, почему его желательно по максимуму избегать. Ну, а в данном конкретном случае можно только "порадоваться" за разработчиков IAR, слепивших такую пакостную "бомбочку". Это ж надо догадаться задефайнить такие короткие имена! Как-то я на MSP430 тоже плотно присел, пока выяснял, что локальное имя N работает не так, как задумано - тоже иаровский дефайн был. Только там хитрее получилось - не так явно вылезало, ошибка была совсем не про конфликт имен. Препроцессор мастдай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 3 марта, 2008 Опубликовано 3 марта, 2008 · Жалоба Так что же мне делать в этом конкретном случае кроме как закоментировать проблемные дефайны в iom324p.h ? Как бы потом это не вылезло боком... Может не в тему(вопроса) будет сказано. Нашел еще одну интересную ОС - eXtreme Minimal Kernel XMK Почему-то на форуме о ней даже не упоминалось. Разработчик утверждает, что нет других мультизадачных preemtive free RTOS, которая будет работать в такой минимальной конфигурации (340 bytes of ROM and 18 bytes of RAM). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 3 марта, 2008 Опубликовано 3 марта, 2008 · Жалоба Может не в тему(вопроса) будет сказано. Нашел еще одну интересную ОС - eXtreme Minimal Kernel XMK Судя по последним обновлениям (октябрь 2004) автор утратил к ней интерес. А вот что касается потребностей памяти, то по-моему в этих прогнозах кое-что умалчивается, а именно, расход ОЗУ на стеки процессов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 4 марта, 2008 Опубликовано 4 марта, 2008 · Жалоба При включении моих исходников проекта на Си в проект smcRTOS (пример 1-EventFlag)возникла проблема. Error[e18]: Range error, PC offset out of range. Valid range is -4096 (-0x1000) to 4094 (0x0FFE). File: D:\...\scmRTOS\AVR\OS_Target_asm.s90, Line: 234 Source: xjmp ContextSwitcher_ISR Where $ = #no label found# + 0x5C [0x5C] in module "scmRTOS_Asm" (D:\...\1-EventFlag\Release\Obj\OS_Target_asm.r90), offset 0x5C in segment part 1, segment INTVEC What: #no label found# - ($ + 2) [0x1388] Allowed range: 0xFFFFF000 - 0xFFF Operand: #no label found# [0x13e6] in module scmRTOS_Asm (D:\...\1-EventFlag\Release\Obj\OS_Target_asm.r90), Offset 0x0 in segment part 2, segment CODE Мой проект пока состоит из последовательного вызовов функций инициализации различной переферии. Ошибка возникает при подключении lcd_Init(); Отдельно мой проект отлажен под Мега324P. Занимал около 20кБ ROM и около 500 байт RAM. Пробовал изменить на Мега 644P и изменить размеры CSTACK, RSTACK. Не помогло. Как решить эту проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 4 марта, 2008 Опубликовано 4 марта, 2008 · Жалоба Судя по последним обновлениям (октябрь 2004) автор утратил к ней интерес. В overview XMK, которое можно найти в исходниках указана сегодняшняя дата (March 4, 2008). Выглядит подозрительно ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 4 марта, 2008 Опубликовано 4 марта, 2008 · Жалоба Мой проект пока состоит из последовательного вызовов функций инициализации различной переферии.Каким-то образом обработчик прерывания переключения контекста оказывается в месте, куда не "дотягивается" xjmp из области векторов. Судя по ограничению +/- 4К вместо макроса xjmp подставляется RJMP, хотя нужен JMP. Глянул в исходники:#if (A90_PROC_OPTION == 0) || (A90_PROC_OPTION == 1) #define xcall rcall #define xjmp rjmp #else #define xcall call #define xjmp jmp #endif Где определяется A90_PROC_OPTION я не нашел - ни в исходниках, ни в описании ассемблера. Неопределенный символ считается равным нулю. Можно предположить, что перед этим должна быть (утерянная) строка #define A90_PROC_OPTION ((__TID__ >> 4) & 0x0F) dxp завтра разберется, откуда вылезла эта бага. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 4 марта, 2008 Опубликовано 4 марта, 2008 · Жалоба Имеет ли значение уровень оптимизации компилятора для smcRTOS ? Я всегда ставлю MAX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться