Jump to content

    
Sign in to follow this  
AHTOXA

Выпущена scmRTOS 4.0.

Recommended Posts

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Залил в репозиторий примеры для 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 побеждает! :)

 

Share this post


Link to post
Share on other sites
для достижения такого результата пришлось задействовать LTO

 

LTO - это плохо?

 

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

 

Share this post


Link to post
Share on other sites

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

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

 

---

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

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

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

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

switch.bat

, или

sh ./switch.sh

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

 

Share this post


Link to post
Share on other sites
svn co http://scmrtos.svn.sourceforge.net/svnroot/scmrtos/trunk/Samples/CortexM3/GCC/STM32F2XX STM32F2XX

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

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

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

Share this post


Link to post
Share on other sites
Я где-то уже спрашивал, но не помню где...

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

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

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

Спасибо.

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites
Да. Он работает исходя из предположения, что он прерывает основной поток выполнения.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this