|
|
  |
Вышел порт scmRTOS для Cortex-M3., Желающих прошу тестировать. |
|
|
|
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) ); } , и мои волосы стали мягкими и шелковистыми  Кстати, предыдущий глюк, по всей видимости, был из той же оперы. ЗЫ. А так - всё вроде вполне работает, делаю два больших проекта. Может, залить уже порт в репозиторий?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|