LessNik 0 9 января, 2008 Опубликовано 9 января, 2008 · Жалоба Привет всем. Решил поиграться с scmRTOS. Скачал порт под арм, но поддержки AT91Sam7x... там не было. Дописал часть сам, но ОС работает как-то не стабильно. Может где-то ошибся... Может кто-нибудь поделится уже отлаженным портом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 9 января, 2008 Опубликовано 9 января, 2008 · Жалоба Решил поиграться с scmRTOS. Скачал порт под арм, но поддержки AT91Sam7x... там не было.А чем SAM7X отличается от SAM7S с точки зрения исходников ОС? Я бегло просматривал документацию на SAM7X, но не нашел там принципиальных отличий, которые могли бы повлиять на работу ОС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 9 января, 2008 Опубликовано 9 января, 2008 · Жалоба А чем SAM7X отличается от SAM7S с точки зрения исходников ОС? Я бегло просматривал документацию на SAM7X, но не нашел там принципиальных отличий, которые могли бы повлиять на работу ОС. Принципиальных различий вроде нет, но возникли некоторые проблемы: 1. Вылазила ошибка Memory access timed out @ 00003F00 -> JTAG speed too high при попытке выполнить Reset. Поправил mac файл, вроде легче стало. Надеюсь тут не ошибся: _InitRSTC() { __writeMemory32(0xA5000001, 0xFFFFFD08,"Memory"); // Allow user reset } _InitPLL() { __message "Set Main Oscillator"; __writeMemory32(0x00004001,0xFFFFFc20,"Memory"); // MOSC while( !(__readMemory32(0xFFFFFc68,"Memory") & 0x1) ); __message "Set PLL to 96MHz"; __writeMemory32(0x10483f0e,0xFFFFFc2c,"Memory"); // LOCK while( !(__readMemory32(0xFFFFFc68,"Memory") & 0x4) ); __message "Set Master Clock to 48MHz"; __writeMemory32(0x00000004,0xFFFFFc30,"Memory"); // MCKRDY while( !(__readMemory32(0xFFFFFc68,"Memory") & 0x8) ); __writeMemory32(0x00000007,0xFFFFFc30,"Memory"); // MCKRDY while( !(__readMemory32(0xFFFFFc68,"Memory") & 0x8) ); } execUserPreload() { Reset(); Remap_RAM(); __writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled _InitRSTC(); } execUserReset() { Reset(); Remap_RAM(); __writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled __writeMemory32(0x00000000,0xB4,"Register"); __emulatorSpeed(0); // Set JTAG speed to full speed } __var tmp; Remap_RAM() { tmp = __readMemory32(0x00200000, "Memory"); // read from RAM area __writeMemory32(~tmp, 0x00200000, "Memory"); // alter RAM area if( ~tmp != __readMemory32(0x00000000, "Memory") ) // check if altering mirrored to remap area { __writeMemory32(0x00000001, 0xFFFFFF00,"Memory"); } __writeMemory32(tmp, 0x00200000 ,"Memory"); // restore RAM data __message " remap "; } Reset() { __message "execUserReset()"; __emulatorSpeed(30000); // Set JTAG speed to 30kHz to make a hardware reset __writeMemory32(0xA5000004, 0xFFFFFD00, "Memory"); // reset the peripherals _InitPLL(); // Allow to debug at JTAG Full Speed __emulatorSpeed(0); } 2. Дописал ещё в device.h #elif defined(AT91SAM7X256) #include <ioAT91SAM7X256.h> и в OS_Target_core.h | defined(AT91SAM7X256) Надеюсь ничего больше не забыл, нето ведь всё равно скомпилится -) -( Сейчас вроде всё работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 9 января, 2008 Опубликовано 9 января, 2008 · Жалоба Принципиальных различий вроде нет, но возникли некоторые проблемы: 1. Вылазила ошибка Memory access timed out @ 00003F00 -> JTAG speed too high при попытке выполнить Reset. Вроде на последних версиях иара с adaptive clocking уже не слетает. Аналогичные вашим действия у меня вроде как делались в Reset(), правда там они были сделаны с проверкой на наличие JLink, если у вас другой отладчик - надо просто выкинуть проверки.Дописал ещё в device.h и в OS_Target_core.h Это тоже уже дописано в той версии, которая лежит в репозитории. Попробуйте ее - там много улучшений, и она же будет включена в ближайший релиз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Это тоже уже дописано в той версии, которая лежит в репозитории. Попробуйте ее - там много улучшений, и она же будет включена в ближайший релиз. Этот репозиторий на ftp электроникса? У меня нет к нему доступа. Может можно ещё откуда-нибудь скачать. Если можно, дайте прямую ссылку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Этот репозиторий на ftp электроникса? У меня нет к нему доступа. Может можно ещё откуда-нибудь скачать. Если можно, дайте прямую ссылку. Нет, имеется в виду репозиторий на sourceforge.net. http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Нет, имеется в виду репозиторий на sourceforge.net. http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/ Спасибо. Скачал. Скомпилил и возникла ошибка. Дописал в Target_AT91SAM7.h #define OS_INTERRUPT __arm __irq и всё скомпилилось, но мой пример перестал работать стабильно(чип почему-то перезагружается). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Спасибо. Скачал. Скомпилил и возникла ошибка. Дописал в Target_AT91SAM7.h #define OS_INTERRUPT __arm __irq и всё скомпилилось, но мой пример перестал работать стабильно(чип почему-то перезагружается). Насчет #define проверю. По поводу перезагрузки - посмотрите, сколько стека выделяется для scmRTOS_IDLE_PROCESS_STACK_SIZE в файле scmRTOS_config.h Раньше там выделялось только то, что хочет пользователь для своих нужд и "в недрах" к этому числу добавлялось 17 * sizeof(TStackItem). Теперь надо полный размер указывать в scmRTOS_config.h, т.е. минимум 17 * sizeof(TStackItem) Дописал в Target_AT91SAM7.h #define OS_INTERRUPT __arm __irq Но оно там есть, в самом начале: #if scmRTOS_CONTEXT_SWITCH_SCHEME == 0 #define OS_INTERRUPT __arm #else #define OS_INTERRUPT __arm __irq #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Насчет #define проверю. По поводу перезагрузки - посмотрите, сколько стека выделяется для scmRTOS_IDLE_PROCESS_STACK_SIZE в файле scmRTOS_config.h Раньше там выделялось только то, что хочет пользователь для своих нужд и "в недрах" к этому числу добавлялось 17 * sizeof(TStackItem). Теперь надо полный размер указывать в scmRTOS_config.h, т.е. минимум 17 * sizeof(TStackItem) Но оно там есть, в самом начале: #if scmRTOS_CONTEXT_SWITCH_SCHEME == 0 #define OS_INTERRUPT __arm #else #define OS_INTERRUPT __arm __irq #endif Да, действительно есть, я просто файл не скопировал (svn воспользовать не получается, перекрыта на работе).Скачивал файлы в ручную по приведенной dxp ссылке Сейчас гоняю приведенный пример 1-EventFlag. Там же не нужно ничего исправлять, кроме пина и порта светодиода? Поведение такое же. Чип перезагружается. Может я что-то недозаменил снова, но что-то сомневаюсь. Для этого примера #define scmRTOS_IDLE_PROCESS_STACK_SIZE 17 * sizeof(TStackItem) Мой пример (всего 1 процесс, ожидающий событие Timer_Ovf ( Timer_Ovf.Wait(); ) и раз в секунду в прерывании от ТС0 сигнализируется событие ( Timer_Ovf.SignalISR(); ) ) отваливался после команды Timer_Ovf.SignalISR(), выполнив ещё что-то. Т.е.: .......... if (TimerCounter0) { TimerCounter0--; if (!TimerCounter0) { TimerCounter0=50000; Timer_Ovf.SignalISR(); // доходит до этой строчки, затем доходит до строки " выход из // прерывания" и где-то там чип перегружается. Если события не происходит, то всё работает. } } AT91C_BASE_AIC->AIC_EOICR = 0; } // выход из прерывания. Что удивительно, примеры с предыдущими исходниками ОС работают стабильно. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Что удивительно, примеры с предыдущими исходниками ОС работают стабильно. :laughing:Буду копать. Я примеры из последней правки проверял, вроде все работали. Попробую еще раз скачать все из репа "на чистый лист". Я писал себе файлик с изменениями, которые вносились в процессе правки, но он, к сожалению, дома. Постараюсь вечерком его найти и запостить сюда. Могу выслать почтой выкачанные из репа примеры. P.S. Проверил первый пример - слил из репа, скомпилил, залил - работает и из ОЗУ и из флеша. Тестировал на SAM7S64. sam7s.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LessNik 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Буду копать. Я примеры из последней правки проверял, вроде все работали. Попробую еще раз скачать все из репа "на чистый лист". Я писал себе файлик с изменениями, которые вносились в процессе правки, но он, к сожалению, дома. Постараюсь вечерком его найти и запостить сюда. Могу выслать почтой выкачанные из репа примеры. P.S. Проверил первый пример - слил из репа, скомпилил, залил - работает и из ОЗУ и из флеша. Тестировал на SAM7S64. :a14: Ну вот теперь совсем другое дело! Работает! Спасибо. Буду дальше разбираться P.S. Видимо нето прикручивал :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Waso 1 18 июня, 2008 Опубликовано 18 июня, 2008 · Жалоба Пересаживаюсь с FreeRTOS на scmRTOS. Проц AT91SAM7X256. Поправил код программы, скомпилил. При загрузке J-link выдал такой перл: Loaded macro file: \scm\config\AT91SAM7_FLASH.mac JTAG speed is set to: 32 kHz Write memory error @ address 0xFFFFFC20, word access: Core error. Error in \scm\config\AT91SAM7_FLASH.mac at line 53, col 20: Operation error. Error while calling macro execUserPreload. Failed to load debugee: \scm\Exe\slon.d79 Подставил загрузочный макрос (.mac - файл) от фри - заработало. В этих макросах я пока не разобрался, такчто в чем конкретно проблема сказать не могу, но она есть. И еще. Как подсчитать необходимый размер стека для процесса? Вроде это суммарный размер всех процовых регистров плюс какоето число байт на каждый уровень вложенности функций? От кол-ва используемых ОЗУ-шных переменных зависеть не должно... Или как? Почему спрашиваю - пока не увеличил размер стека для одного из процессов - прога частенько выскакивала на Data Abort Vector. Теперь работает. Покачто. Хочется быть уверенным что она не слетит. И еще один глюк проявился - перестает срабатывать прерывание. Прерывание от EMAC. Других и нет. На всякий случай приложил исходник. Вообще прога занимается выбросом в порт данных, принятых через изернет. scm.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 июня, 2008 Опубликовано 18 июня, 2008 · Жалоба Loaded macro file: \scm\config Write memory error @ address 0xFFFFFC20, word access: Core error. Ошибка в отладчике? По этому адресу находится CKGR_MOR, который 32-битный и 32 бита в него и пишутся. Или он таким образом сообщает о какой-то другой ошибке, например, с вашим кварцем и указанными в .mac парамертами pll получается слишком высокая частота и ядро сбоит. Проверьте строчку // Assuming 18.432 MHz osc __writeMemory32(0x00190605, 0xFFFFFC2C,"Memory"); // *26/5 set LOCK after 6 SCLK Хотя она находится уже после строки, в которой возникает ошибка. Можете попробовать закомментировать проблемную строку. И еще. Как подсчитать необходимый размер стека для процесса? Вроде это суммарный размер всех процовых регистров плюс какоето число байт на каждый уровень вложенности функций? Да. Контекст занимает 17 слов, ну и сколько еще компилятор использует. Проще всего остановить программу и посмотреть содержимое стека отладчиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Waso 1 19 июня, 2008 Опубликовано 19 июня, 2008 · Жалоба C макросом я пока париться не стал. А со стеком вот что прикрутил: template<TPriority pr, word stack_size> class process : public TBaseProcess { public: INLINE process() : TBaseProcess(&Stack[stack_size/sizeof(TStackItem)], pr, (void (*)())Exec) { } OS_PROCESS static void Exec(); dword Used_Stack_Size() {return (dword)(StackPointer - Stack);}; private: TStackItem Stack[stack_size/sizeof(TStackItem)]; }; Потом в IdleProcessUserHook() использовал: debug_printf("EMAC stack %d ",DataShower_Proc.Used_Stack_Size()); debug_printf("DBG stack %d ",DBG_Output_Proc.Used_Stack_Size()); Как я понимаю, когда выполняется идл-процесс, окружение остальных процессов находится в их стеках и это какраз подходящее время чтобы узнать использованный размер. Поправте если не прав. А вообсче работает. :yeah: Как насчет прикрутить нечто подобное в исходник? :) И еще одно пожелание - ИМХО, удобнее задавать (дефайнить) тип используемого процессора прямо в файле device.h. Или вынести в конфиг.аш А лазить по настройкам проекта для этого - ИМХО неудобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 19 июня, 2008 Опубликовано 19 июня, 2008 · Жалоба Как я понимаю, когда выполняется идл-процесс, окружение остальных процессов находится в их стеках и это какраз подходящее время чтобы узнать использованный размер. Поправте если не прав. А вообсче работает.Да. Но если между переключениями контекста процесс разместил на стеке локальную переменную (пусть будет массив :) ) и успел ее уничтожить до следующего переключения, то занимаемая этой переменной память учтена не будет. Один из возможных вариантов отлова такой ситуации - просматривать стек от вершины и искать первое ненулевое слово. Или в конструкторе процесса заполнить стек какой-то константой и искать первое слово, не равное этой константе.И еще одно пожелание - ИМХО, удобнее задавать (дефайнить) тип используемого процессора прямо в файле device.h. Или вынести в конфиг.аш А лазить по настройкам проекта для этого - ИМХО неудобно.Есть такое. Вот в EWAVR сделано грамотно - выбор типа процессора в настройках проекта заставляет оболочку подставлять соответствующий символ в командную строку компилятора и ассемблера и по этому символу подставляется нужный ioXXX.h в io.h. Здесь было реализовано то же самое, но вручную. При сборке с помощью make или scons это не представляет проблемы. Локализовать это определение в одно место вместо двух (ассемблер, компилятор) - мысль неплохая, надо ее подумать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться