Перейти к содержанию
    

Про пользовательский системный таймер. Сделал так:

Инициализацию таймера вынес в WEAK-функцию init_system_timer().

Переименовал SystemTimer_ISR() в Default_SystemTimer_ISR(), а SystemTimer_ISR() объявил WEAK-алиасом для неё.

То есть, если ничего не трогать, то всё работает как было.

Теперь, чтобы перейти на свой альтернативный системный таймер, надо:

  • написать свою функцию init_system_timer() (extern "C");
  • (опционально) написать свой обработчик прерывания таймера SystemTimer_ISR();
  • перенести в таблице векторов SystemTimer_ISR() на место нужного вектора.

Мне кажется, что это достаточно удобно. Если не будет замечаний, то я запилю это в транк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На мой взгляд — нормально. Лучше очередного #define.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю, отдельный пример не нужен, просто в каком-то из существующих реализовать на другом таймере и описать это в комментариях к примерам. Как прерывание SPM либо компаратора для переключения контекстов в примерах AVR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я так и хотел. Просто как раз сейчас готовлю примеры для F2xx, вот заодно и приурочу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Залил в репозиторий примеры для STM32F2XX (пока три штуки). Пример 2-Message сделан на альтернативном таймере.

(функцию init_system_timer() я, подумав немного, переименовал в __init_system_timer(), ибо она в какой-то мере системная).

 

Заодно замерил скорость.

Наконец запустил свою плату на F207, IAR 6.30 + TNКernel

72МНz, 2WS, IAR6.30 - 2.16 мкс

120МНz, 3WS, IAR6.30 - 1.30 мкс

Платка TE-STM32F217, arm-kgp-eabi-gcc, 120 МГц, 3WS - 1.192 мкс. Правда, для достижения такого результата пришлось задействовать LTO, без него получалось 1.4 мкс. Но всё равно, scmRTOS побеждает! :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для достижения такого результата пришлось задействовать LTO

 

LTO - это плохо?

 

В папке 2-Message\prj ничего нет. Скрипт из 1-EventFlag\prj будет работать с USE_LTO=YES?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LTO - это тяжёлая артиллерия :)

Скрипт везде одинаковый.

 

---

А если использовать svn, то ничего руками копировать не надо:

Заходим в нужную папку, командуем:

svn co http://scmrtos.svn.sourceforge.net/svnroot/scmrtos/trunk/Samples/CortexM3/GCC/STM32F2XX STM32F2XX

Создаётся папка STM32F2XX с примерами. Заходим в неё, командуем:

switch.bat

, или

sh ./switch.sh

, и всё появляется само :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

svn co http://scmrtos.svn.sourceforge.net/svnroot/scmrtos/trunk/Samples/CortexM3/GCC/STM32F2XX STM32F2XX

Я где-то уже спрашивал, но не помню где...

Какой лучше клиент взять под WinXp?

svn ведь не идёт в комплекте к windows.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я где-то уже спрашивал, но не помню где...

Какой лучше клиент взять под WinXp?

svn ведь не идёт в комплекте к windows.

Мне нравится TortoiseSVN - удобно интегрируется прямо в Explorer.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для команд, которые я привёл, достаточно собственно svn. А если нужно что-то графическое - то tortoise svn. Есть ещё RapidSVN, он слабоват, но зато работает и под виндой и под линуксом.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не разъяснит ли кто-нибудь такой момент (интересуюсь для углубления понимания):

В Оси есть функции disable_context_switch/enable_context_switch, которые реализованы через запрет/разрешение прерываний.

А как они должны реализовываться, если делать без запрета прерываний (через маскировку Осевых уровней)?

И как должен быть сконфигурён ContextSwitcher_ISR? Должен "сидеть" один на самом низшем уровне прерываний?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Залил недостающий пример 4-Debug для CortexM3/GCC/STM32F2XX.

 

В Оси есть функции disable_context_switch/enable_context_switch, которые реализованы через запрет/разрешение прерываний.

А как они должны реализовываться, если делать без запрета прерываний (через маскировку Осевых уровней)?

Да. Только там ещё много чего надо будет учесть.

И как должен быть сконфигурён ContextSwitcher_ISR? Должен "сидеть" один на самом низшем уровне прерываний?

Да. Он работает исходя из предположения, что он прерывает основной поток выполнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Он работает исходя из предположения, что он прерывает основной поток выполнения.

Расточительно как-то выглядит, если у проца уровней мало (stm8, xmega): низший исключительно для ContextSwitcher, средний - OS_SystemTimer_ISR и остальные ОСевые прерывания, высший - для вне ОСевых. Тесно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SystemTimer тоже можно на низший. И другие малоприоритетные. Смысл в том, чтобы ContextSwitcher не прерывал какое-либо другое прерывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...