|
scmRTOS (версия 310) IAR AVR 5511 (mega128a) |
|
|
|
Jun 30 2011, 11:42
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(Acvarif @ Jun 30 2011, 11:29)  Попытался скомпилировать scmRTOS (версия 310) IAR AVR 5511 (mega128a) - (Error[Pe020]: identifier "SPMCR" is undefined ...\scmRTOS_TARGET_CFG.h 119). Похоже на несовместимость версий ОС и IAR? Может кто сталкивался. Как можно подправить?
С какой версией IAR AVR scmRTOS (версия 310) работает без исправлений? Вроде понял. Если компилировать тестовый проект (во вложении) под Atmega32 все работает. Под 128a появляется вышеописанная ошибка потому, как в 128а име6ется регистр SPMCSR (Store Program Memory Control and Status Register), а в scmRTOS забит только SPMCR регистр (подходит для меги32). Вот только где он забит и как это дело подправить пока не найду. Помогите please, кому не лень Цитата(Acvarif @ Jun 30 2011, 14:22)  Вроде понял. Если компилировать тестовый проект (во вложении) под Atmega32 все работает. Под 128a появляется вышеописанная ошибка потому, как в 128а име6ется регистр SPMCSR (Store Program Memory Control and Status Register), а в scmRTOS забит только SPMCR регистр (подходит для меги32).
Вот только где он забит и как это дело подправить пока не найду.
Помогите please, кому не лень Нашел. Достаточно в файле scmRTOS_TARGET_CFG.h в строке #define SPM_CONTROL_REG SPMCR - SPMCR заменить на SPMCSR Вообще у IAR какой-то кавардак с этими регистрами, в частности с их названиями. Неужели нельзя одни и те же по функциональности регистры называть одинаково? Хотя с другой стороны они поддерживаются того, что прописано в даташитах на девайсы.
Сообщение отредактировал Acvarif - Jun 30 2011, 11:23
|
|
|
|
|
Jun 30 2011, 12:47
|

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

|
Цитата(Acvarif @ Jun 30 2011, 14:42)  Нашел. Достаточно в файле scmRTOS_TARGET_CFG.h в строке #define SPM_CONTROL_REG SPMCR - SPMCR заменить на SPMCSR
Вообще у IAR какой-то кавардак с этими регистрами, в частности с их названиями. Неужели нельзя одни и те же по функциональности регистры называть одинаково? Хотя с другой стороны они поддерживаются того, что прописано в даташитах на девайсы. Вот именно. Кавардак у Атмела. У avr-gcc имена регистров -- простые #define на адреса, поэотму нет проблем с Код #ifdef SPMCR #define SPM_CONTROL_REG SPMCR #elif defined(SPMCSR) #define SPM_CONTROL_REG SPMCSR #else #error SPM_CONTROL_REG is not defined #endif У IAR так сделать не выйдет, нужно поимённо проверять модели контроллеров. На всех не напасёшся, так что примеры сделаны под какие-то конкретные модели, при смене нужно менять. В AVR-ских примерах под 4.0 я постарался напихать комментариев вида "пример рассчитан на XXX, для других может понадобиться изменение имён регистров", в документации коротко упомняуто где и что сидит по файлам примеров.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jun 30 2011, 12:54
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(ReAl @ Jun 30 2011, 15:47)  В AVR-ских примерах под 4.0 я постарался напихать комментариев вида "пример рассчитан на XXX, для других может понадобиться изменение имён регистров", в документации коротко упомняуто где и что сидит по файлам примеров. Да, верно. У Atmel. А примеры под 4.0 где можно взять?
|
|
|
|
|
Jun 30 2011, 16:32
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
И все же скажите пожалуйста под какую версию IAR AVR выполнены примеры scmRTOS v3.10? В Iar avr 5511 (mega32) (1_EventFlag) все компилится нормально, но в симуляторе работает с предупреждениями и неверно - зацикливается в ядре здесь Код RaiseContextSwitch(); do { EnableContextSwitch(); DUMMY_INSTR(); DisableContextSwitch(); } while(!IsContextSwitchDone()); и в OS_Target.h здесь Код INLINE inline void EnableInterrupts() { __enable_interrupt(); } INLINE inline void DisableInterrupts() { __disable_interrupt(); }
#pragma segment="CSTACK" #pragma segment="RSTACK"
#define ABS_WORD(x) (*((volatile word*)x))
INLINE inline TStackItem* GetDataSP() { return reinterpret_cast<TStackItem*>(ABS_WORD(28)); } INLINE inline TStackItem* GetReturnSP() { return reinterpret_cast<TStackItem*>(SP); }
INLINE inline void SetISRStackPointers() { ABS_WORD(28) = reinterpret_cast<word>(__segment_end("CSTACK")); SP = reinterpret_cast<word>(__segment_end("RSTACK")) - 1; }
INLINE inline void SetDataSP(TStackItem* sp) { ABS_WORD(28) = reinterpret_cast<word>(sp); } INLINE inline void SetReturnSP(TStackItem* sp) { SP = reinterpret_cast<word>(sp); }
namespace OS { INLINE inline void EnableContextSwitch() { EnableInterrupts(); } INLINE inline void DisableContextSwitch() { DisableInterrupts(); } } (Thu Jun 30 19:04:28 2011: The stack pointer for stack 'RStack' (currently DATA:0x0001A5) is outside the stack range (DATA:0x000080 to DATA:0x0000A0) ) При переходе на mega128a в симуляторе виснуть начинает гораздо раньше (все время сидит на OS::Run(); И все же попробовал запустил в железе, надеясь увидеть дергание PINB4 по прериванию таймера 1 . В железе (под mega128a) не работает совсем. Очевидно так же как и в симуляторе висит. Подскажите пожалуйста как все же запустить OS в симуляторе (в железе тоже должна заработать). Очень уж хочется опробовать ее возможности и сравнить с обычной программой на C. Привлекают (по документации) ее шустрость и небольшие требования к ресурсам железа. Какраз для этого и железо имеется под рукой и реальная задача (асинхронный обмен и обработка данных по двум USART)
|
|
|
|
|
Jun 30 2011, 17:48
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(AHTOXA @ Jun 30 2011, 20:04)  Спасибо. Попробую разобраться... Совсем запутался в файлах, где что куда. Может есть где одним архивом Samples для AVR IAR?
|
|
|
|
|
Jun 30 2011, 19:24
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(Acvarif @ Jun 30 2011, 20:48)  Спасибо. Попробую разобраться...
Совсем запутался в файлах, где что куда. Может есть где одним архивом Samples для AVR IAR? Ничего не получается. Полная путаница. Если у кого есть Samples для AVR IAR в сборе выложите пожалуйста. Скажите пожалуйста под какую версию IAR AVR выполнены примеры в scmRTOS v 3.10? Спасибо.
Сообщение отредактировал Acvarif - Jun 30 2011, 19:31
|
|
|
|
|
Jun 30 2011, 19:29
|

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

|
Поставьте себе SVN Сделайте Код svn co http://scmrtos.svn.sourceforge.net/svnroot/scmrtos/branches/pre-v400/Samples/AVR/IAR scmRTOS-samples для получения кода примеров AVR/IAR. Потом перейдите в образовавшийся каталог scmRTOS-samples (ну или дайте в строке выше другое понравившееся имя) и запустите батник switch.bat для подкачки кода ОС. Потом достаточно будет запускать Код svn up для получения апдейтов.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jun 30 2011, 19:49
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(ReAl @ Jun 30 2011, 22:29)  Поставьте себе SVN Сделайте Код svn co http://scmrtos.svn.sourceforge.net/svnroot/scmrtos/branches/pre-v400/Samples/AVR/IAR scmRTOS-samples для получения кода примеров AVR/IAR. Потом перейдите в образовавшийся каталог scmRTOS-samples (ну или дайте в строке выше другое понравившееся имя) и запустите батник switch.bat для подкачки кода ОС. Потом достаточно будет запускать Код svn up для получения апдейтов. Виноват, но, что такое SVN я понятия не имею. Разбираться с этим... разберусь конечно. Наверняка еще понадобится. Если у кого есть возможность буду признателен за архив Samples/AVR/IAR И всетаки под какой версией AVR/IAR корректно работают Samples/AVR/IAR scmRTOS версии 3.10? Цитата(AHTOXA @ Jun 30 2011, 22:39)  Там же внизу есть ссылка "Download GNU tarball". Это как раз и есть одним архивом  А вообще конечно лучше поставить клиент svn, всяко пригодится. Прошу прощения. Не врубился. GNU tarball я скачал. Там все пустое. Как этим всем пользоваться?
|
|
|
|
|
Jun 30 2011, 20:36
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(AHTOXA @ Jun 30 2011, 22:56)  Хм. Проверил вот эту ссылку - всё скачалось, все примеры и сама ось. Спасибо. Все скачалось нормально (не по той ссылке ходил). Попробую разобраться... Цитата(Acvarif @ Jun 30 2011, 23:05)  Спасибо. Все скачалось нормально (не по той ссылке ходил). Попробую разобраться... Запустил в IAR AVR 5511 все прошло нормально. При переходе на симулятор та же картина: Предупреждения типа Thu Jun 30 23:19:57 2011: The stack pointer for stack 'CStack' (currently DATA:0x00022A) is outside the stack range (DATA:0x000100 to DATA:0x000120) при заходе в main на Timer1_Ovf.wait(); и повисание на тех же местах (код выше). Думаю в железе будет все то же. Или я не прав? Может я чего не понимаю. Неужели в симуляторе так и не плучится увидеть работу хотя бы двух процессов? Цель простая - увидеть в дебагере простое дергание ногами (типа PORTB ^= (1<<4)) хотя бы в одном процессе (например по прерываниям таймера 1) Наверняка то же самое можно будет увидеть и в железе. Дальше все должно плучаться... Что я делаю не так?
|
|
|
|
|
Jul 1 2011, 01:38
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Цитата(Acvarif @ Jul 1 2011, 03:36)  Thu Jun 30 23:19:57 2011: The stack pointer for stack 'CStack' (currently DATA:0x00022A) is outside the stack range (DATA:0x000100 to DATA:0x000120) Это нормально, ведь ОСь использует свои стеки для задач. Не обращайте внимание. Цитата(Acvarif @ Jul 1 2011, 03:36)  Неужели в симуляторе так и не плучится увидеть работу хотя бы двух процессов? В симуляторе IAR надо ручками запустить необходимые прерывания. И это очень неудобно. А без прерываний Ось как будет работать.
|
|
|
|
|
Jul 1 2011, 06:12
|

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

|
QUOTE (Acvarif @ Jun 30 2011, 19:32)  но в симуляторе работает с предупреждениями и неверно - зацикливается в ядре здесь Симулятор ИАРа от рождения никогда не симулировал периферию. Никогда. И не собирается. А в переключателе контекста используется свойство периферии вызывать прерывание. Хотите в симуляторе - используйте scmRTOS_CONTEXT_SWITCH_SCHEME 0, но это будет уже другая программа, с другими требованиями к стекам и т.д. Не мучайте себя - отлаживайте сразу в железе.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|