Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вышел порт scmRTOS для Cortex-M3.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
shreck
Порт доступен на SourceForge scmRTOS в ветке trunk.

Прошу писать о багах/замечаниях/пожеланиях.
spf
scmrtos-cortexm3-snapshot.rar

PS: Был неприятно удивлен, что страничка про снапшоты на гугловском ресурсе группы стала пустая, как и все остальные. sad.gif
IgorKossak
Цитата(spf @ Dec 9 2008, 18:44) *
scmrtos-cortexm3-snapshot.rar

PS: Был неприятно удивлен, что страничка про снапшоты на гугловском ресурсе группы стала пустая, как и все остальные. sad.gif

Зато Jessica Simpson Boots появилась. Некому грохнуть?
Ivan A-R
Кстати, а есть ли точно такие но с перламутровыми пуговицами? Другими словами портом Cortex-M3 под GCC кто нибудь озабочен?
shreck
Цитата(Ivan A-R @ Dec 10 2008, 05:45) *
Кстати, а есть ли точно такие но с перламутровыми пуговицами? Другими словами портом Cortex-M3 под GCC кто нибудь озабочен?

Боюсь, что на данный момент нет. Я юзаю только IAR.
Sergey_K
А для какой цели приоритет прерываний от системного таймера выставляется минимальным?
Ivan A-R
Цитата(shreck @ Dec 10 2008, 07:21) *
Боюсь, что на данный момент нет. Я юзаю только IAR.

Ок. Значит есть смысл протянуть свои шаловливые ручёнки в этом направлении. %)
Сергей Борщ
Цитата(Sergey_K @ Dec 10 2008, 08:38) *
А для какой цели приоритет прерываний от системного таймера выставляется минимальным?
Вот, нашел. На этом форуме уже было обсуждение этого вопроса, но его я что-то не могу так сразу найти.
shreck
Цитата(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 режим). И все.
Ivan A-R
Цитата(shreck @ Dec 10 2008, 12:17) *
Думаю перейти на GCC будет достаточно легко. Порт содержит только один, специфический для компилятора момент - используется директива принудительного встраивания функции (_Pragma("inline=forced")). Думаю у GCC есть что-то подобное. Да в ассеблерном файле пара директив (выравнивание, да thumb режим). И все.


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

Плюс как минимум описания прерываний
shreck
Цитата(MrYuran @ Dec 10 2008, 17:50) *
Плюс как минимум описания прерываний

Для кортекса обработчик прерывания - это самая обычная функция без каких-либо #pragma vector=... , __interrupt и тому подобного.
Ivan A-R
Цитата(shreck @ Dec 10 2008, 14:59) *
Для кортекса обработчик прерывания - это самая обычная функция без каких-либо #pragma vector=... , __interrupt и тому подобного.

Угу.. Я эту фичу тоже заценил =) Правда ещё не разобрался, как оно именно работает. Касательно приоритетов.
spf
Цитата(IgorKossak @ Dec 10 2008, 00:06) *
Зато Jessica Simpson Boots появилась. Некому грохнуть?


Вроде все подчистил и вернул странички на место.
Ivan A-R
Кстати, а какой ассемблер в IAR генерят __set_interrupt_state(), __get_interrupt_state() ? А то я вроде как замену написал, но не уверен что правильно.
Ivan A-R
В общем и целом 1-EventFlag уже через GCC компилится. Но блох пока не ловил.

http://mercurial.intuxication.org/hg/scmrtos-cm3-gcc
shreck
Цитата(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
Ivan A-R
Цитата(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.
Ivan A-R
Наконец добился нормальной сборки через 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-gcc

P.S. по оригинальному коду для IAR никаких замечаний нет =)))
IgorKossak
Цитата(Ivan A-R @ Dec 22 2008, 02:51) *
Собирал с помощью codesourcery-вского тулчейна arm-none-eabi (http://www.codesourcery.com/gnu_toolchains/arm/portal/release642).

По ссылке на datasheet с указанной Вами страницы выходим на таблицу Run-Time Libraries, где говорится, что для версии Lite библиотеки для ARMv7 Thumb-2, т. е. для cortex, не предусмотрены. Что у Вас за версия?
Ivan A-R
IgorKossak, так Run-Time Libraries не используются. Мы же компилим ось без сторонних библиотек.

А так я не вдавался, что у них входит в понятие Run-Time Libraries.

А версия ровно эта.
IgorKossak
Цитата(Ivan A-R @ Dec 22 2008, 23:11) *
IgorKossak, так Run-Time Libraries не используются. Мы же компилим ось без сторонних библиотек.

В этом то и проблема. ОС ведь не самоцель. Помимо неё есть ещё и приложение, которое использует библиотеки. Думал, что на codesourcery будет нормальный тулчейн для cortex, а он оказался кастрированный.
Ivan A-R
Ну тут ещё вопрос, что они подразумевают под Run-Time Libraries... Я вот сейчас смотрю - newlib имеется.
AHTOXA
Если что, сборка от Клёна вроде бы умеет компилить под Кортексы. По крайней мере светодиодом я замигалsmile.gif
А при помощи arm-none-eabi от codesourcery собрался развесистый пример от FreeRtos.
AHTOXA
Цитата(Ivan A-R @ Dec 22 2008, 06:51) *
Все мои терзания здесь: http://mercurial.intuxication.org/hg/scmrtos-cm3-gcc

Пробую пример 4-BlinkLeds.
Компилится (выдаёт изрядно ворнингов). Но полноценно работает только с оптимизацией -O0.


С оптимизацией -O1, -O2 и -Os - работает (дрыгает ногами) только до вызова OS::Run(). Потом, похоже, висит. Где висит, сказать не могу, отладчик пока не запустилsmile.gif

Компилю Codesourcery 2009q1-161. Пробовал 2008q3-66, то же самое.


Просто тут наклёвывается интересный проект, хотел наконец-таки начать использовать scmRTOS. Но пока страшновато:-)
AHTOXA
Уф, вроде заработалоsmile.gif
заменил в 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")

Пример в аттаче.Нажмите для просмотра прикрепленного файла
AHTOXA
Выловил ещё один коварный багsmile.gif
При определённых условиях портился 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)
    );
}

, и мои волосы стали мягкими и шелковистымиsmile.gif
Кстати, предыдущий глюк, по всей видимости, был из той же оперы.

ЗЫ. А так - всё вроде вполне работает, делаю два больших проекта. Может, залить уже порт в репозиторий?
Ivan A-R
AHTOXA, Круто =) Надо тоже пофиксить-пощупать пока в отпуске время есть %)
AHTOXA
Залил таки порт под gcc в репозиторий. Все примеры работают.
IgorKossak
Цитата(AHTOXA @ Sep 14 2009, 19:28) *
Залил таки порт под gcc в репозиторий. Все примеры работают.

В примерах не следовало саму ОС с портом дублировать.
AHTOXA
Упс laughing.gif
Спасибо, исправил.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.