|
Вышел порт scmRTOS для Cortex-M3., Желающих прошу тестировать. |
|
|
|
Dec 8 2008, 10:13
|

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

|
Порт доступен на SourceForge scmRTOS в ветке trunk. Прошу писать о багах/замечаниях/пожеланиях.
|
|
|
|
|
Dec 10 2008, 06:38
|
Группа: Участник
Сообщений: 6
Регистрация: 11-11-08
Пользователь №: 41 537

|
А для какой цели приоритет прерываний от системного таймера выставляется минимальным?
|
|
|
|
|
Dec 10 2008, 07:21
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
Цитата(shreck @ Dec 10 2008, 07:21)  Боюсь, что на данный момент нет. Я юзаю только IAR. Ок. Значит есть смысл протянуть свои шаловливые ручёнки в этом направлении. %)
|
|
|
|
|
Dec 10 2008, 07:26
|

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

|
Цитата(Sergey_K @ Dec 10 2008, 08:38)  А для какой цели приоритет прерываний от системного таймера выставляется минимальным? Вот, нашел. На этом форуме уже было обсуждение этого вопроса, но его я что-то не могу так сразу найти.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 10 2008, 09:17
|

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

|
Цитата(Sergey_K @ Dec 10 2008, 13:38)  А для какой цели приоритет прерываний от системного таймера выставляется минимальным? По-моему мнению, приоритет системного таймера должен быть самым низким, но выше чем у программнго прерывания. Это логично, но... Ядро дает возможность назначать уровнеь приоритета прерываниям от 0 до 255 (т.е. используется 8 бит). При этом производитель конкретного кристалла может уменьшить количество бит приоритета, например, STM32 использует 4 бита. Фишка в том, что, цитирую: Цитата The priority registers are stored with the implemented values first. This means that if there are four bits of priority, the priority value is stored in bits [7:4] of the byte. However, if there are three bits of priority, the priority value is stored in bits [7:5] of the byte. Таким образом, чтобы назначить приоритет системному таймеру чуть выше чем у программного прерывания, необходимо привязаться к конкретному процу, а не к ядру, что, мне лично, очень не хочется (сейчас порт не привязан ни к какому конкретному процу, можно юзать его с любым). Цитата(Ivan A-R @ Dec 10 2008, 14:21)  Ок. Значит есть смысл протянуть свои шаловливые ручёнки в этом направлении. %) Думаю перейти на GCC будет достаточно легко. Порт содержит только один, специфический для компилятора момент - используется директива принудительного встраивания функции (_Pragma("inline=forced")). Думаю у GCC есть что-то подобное. Да в ассеблерном файле пара директив (выравнивание, да thumb режим). И все.
|
|
|
|
|
Dec 10 2008, 10:31
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
Цитата(shreck @ Dec 10 2008, 12:17)  Думаю перейти на GCC будет достаточно легко. Порт содержит только один, специфический для компилятора момент - используется директива принудительного встраивания функции (_Pragma("inline=forced")). Думаю у GCC есть что-то подобное. Да в ассеблерном файле пара директив (выравнивание, да thumb режим). И все. Мерси, буду знать =)
|
|
|
|
|
Dec 10 2008, 12:36
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
Цитата(shreck @ Dec 10 2008, 14:59)  Для кортекса обработчик прерывания - это самая обычная функция без каких-либо #pragma vector=... , __interrupt и тому подобного. Угу.. Я эту фичу тоже заценил =) Правда ещё не разобрался, как оно именно работает. Касательно приоритетов.
|
|
|
|
|
Dec 11 2008, 03:38
|

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

|
Цитата(Ivan A-R @ Dec 11 2008, 04:56)  Кстати, а какой ассемблер в IAR генерят __set_interrupt_state(), __get_interrupt_state() ? А то я вроде как замену написал, но не уверен что правильно. Вот такой. Код dword s = __get_interrupt_state(); MRS R0, PRIMASK __set_interrupt_state(s); MSR PRIMASK, R0 __enable_interrupt(); CPSIE I __disable_interrupt(); CPSID I
|
|
|
|
|
Dec 11 2008, 06:56
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
Цитата(shreck @ Dec 11 2008, 06:38)  Вот такой. Код dword s = __get_interrupt_state(); MRS R0, PRIMASK __set_interrupt_state(s); MSR PRIMASK, R0 __enable_interrupt(); CPSIE I __disable_interrupt(); CPSID I Мерси, так и сделал. Только enable/disable тоже через PRIMASK.
|
|
|
|
|
Dec 22 2008, 00:51
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
Наконец добился нормальной сборки через GCC 4.3.2 и работоспособности на реальном железе (STM32F10x). Это пример 4-BlinkLeds построенный на базе 1-EvenFlag. Собирал с помощью codesourcery-вского тулчейна arm-none-eabi (http://www.codesourcery.com/gnu_toolchains/arm/portal/release642). Следует иметь в виду следующий момент (который мне много крови попортил). Если у вас тулчейн собранный для arm-elf то инициализация глобальных объектов происходит через таблицу в секции .ctors. А вот arm-none-eabi использует для этого секцию .init_array (См. файл 4-BlinkLeds/Lib/STM32_SEC_FLASH.ld) Да, и кортексы умеет только 4.3.x... GCC 4.2.x про существование кортексов и Thumb-2 ничего не знает. Все мои терзания здесь: http://mercurial.intuxication.org/hg/scmrtos-cm3-gccP.S. по оригинальному коду для IAR никаких замечаний нет =)))
|
|
|
|
|
Dec 22 2008, 21:11
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 21-06-07
Из: Saint-Petersburg
Пользователь №: 28 607

|
IgorKossak, так Run-Time Libraries не используются. Мы же компилим ось без сторонних библиотек. А так я не вдавался, что у них входит в понятие Run-Time Libraries. А версия ровно эта.
|
|
|
|
|
May 24 2009, 15:38
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Ivan A-R @ Dec 22 2008, 06:51)  Пробую пример 4-BlinkLeds. Компилится (выдаёт изрядно ворнингов). Но полноценно работает только с оптимизацией -O0. С оптимизацией -O1, -O2 и -Os - работает (дрыгает ногами) только до вызова OS::Run(). Потом, похоже, висит. Где висит, сказать не могу, отладчик пока не запустил  Компилю Codesourcery 2009q1-161. Пробовал 2008q3-66, то же самое. Просто тут наклёвывается интересный проект, хотел наконец-таки начать использовать scmRTOS. Но пока страшновато:-)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 20 2009, 19:58
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Уф, вроде заработало заменил в OS_Target.h #define __enable_interrupt() __asm__ __volatile__ ("MOVS r0, #0\nMSR PRIMASK, r0") //#define __disable_interrupt() __asm__ __volatile__ ("MOVS r0, #1\nMSR PRIMASK, r0") на #define __enable_interrupt() __asm__ __volatile__ ("cpsie i") #define __disable_interrupt() __asm__ __volatile__ ("cpsid i") Пример в аттаче.
sample_scmrtos_stm32_gcc.rar ( 84.52 килобайт )
Кол-во скачиваний: 178
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 13 2009, 08:32
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Выловил ещё один коварный баг  При определённых условиях портился R0, и всё падало. Я уже начал думать, что это баг gcc, и даже собирался сделать баг-репорт, но потом заметил, что места порчи R0 подозрительно совпадают с вызовом деструктора TCritSect... Короче, виноват оказался Код INLINE inline void __set_interrupt_state(TStatusReg status) { __asm__ __volatile__ ( "MOVS r0, %0\n" "MSR PRIMASK, r0\n" : : "r"(status) ); } из OS_Target.h, забывший указать R0 в списке clobbered регистров. Исправил на Код INLINE inline void __set_interrupt_state(TStatusReg status) { __asm__ __volatile__ ( "MSR PRIMASK, %0\n" : : "r"(status) ); } , и мои волосы стали мягкими и шелковистыми  Кстати, предыдущий глюк, по всей видимости, был из той же оперы. ЗЫ. А так - всё вроде вполне работает, делаю два больших проекта. Может, залить уже порт в репозиторий?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|