реклама на сайте
подробности

 
 
17 страниц V  « < 13 14 15 16 17 >  
Reply to this topicStart new topic
> Выпущена scmRTOS 4.0., Ура, товарищи! :)
AHTOXA
сообщение May 1 2012, 18:33
Сообщение #211


фанат дивана
******

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



Да, это особенность портов для Cortex-M3. Специальный таймер в ядре - грех было не использовать.
Теперь понимаю, что это не всегда удобно. Совсем выносить настройку прерывания на уровень проекта очень неохота - придётся дописывать инициализацию во все имеющиеся проекты.
Идея с WEAK мне кажется более подходящей. Постараюсь на днях опробовать этот вариант.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение May 2 2012, 05:33
Сообщение #212


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (AHTOXA @ May 2 2012, 01:33) *
Да, это особенность портов для Cortex-M3. Специальный таймер в ядре - грех было не использовать.
Теперь понимаю, что это не всегда удобно. Совсем выносить настройку прерывания на уровень проекта очень неохота - придётся дописывать инициализацию во все имеющиеся проекты.
Идея с WEAK мне кажется более подходящей. Постараюсь на днях опробовать этот вариант.

Для того, чтобы подменить таймер, достаточно, как я понимаю, указать другой ISR. Т.е. даже в имеющейся реализации можно написать просто свой обработчик прерываний по образу и подобию в проекте, а ISR таймера ядра залочить. Ничего в сорцах ОС править не надо. Поправь, если ошибаюсь.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 2 2012, 08:40
Сообщение #213


фанат дивана
******

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



Всё ещё проще! sm.gif
Для переопределения источника прерывания надо всего лишь передвинуть обработчик SystemTimer_ISR в таблице векторов и дописать инициализацию.
Это в случае, если устраивает имеющийся обработчик. Если не устраивает (например, надо в обработчике сбрасывать флаг прерывания), то делаем так (пример для TIM2 в STM32):

1. В таблице векторов прерываний переименовываем SystemTimer_ISR во что-то другое (чтобы не вызывался штатный осёвый обработчик);
2. В scmRTOS_TARGET_CFG.h дописываем:
Код
namespace OS
{
    extern "C" void TIM2_IRQHandler();
}


3. Где-то в проекте вписываем новый обработчик:
Код
extern "C" void OS::TIM2_IRQHandler()
{
    if (TIM2->SR & TIM_SR_UIF)
    {
        scmRTOS_ISRW_TYPE ISR;
        TIM2->SR = ~TIM_SR_UIF;

        Kernel.system_timer();

#if scmRTOS_SYSTIMER_HOOK_ENABLE == 1
        system_timer_user_hook();
#endif
    }
}


4. Где-то до запуска run() инициализируем этот таймер (не забываем назначить ему наименьший приоритет!).

Вроде всёsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 3 2012, 12:35
Сообщение #214


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ May 2 2012, 11:40) *
Вроде всёsm.gif
«Та не»™
Надо еще выключить инициализацию SYSTICK (включение таймера и разрешение его прерываний) в os_start, которая в OS_Target_asm.S сидит.

Так что таки надо какой-то #define scmRTOS_CM3_PORT_USER_SYSTICK в scmRTOS_TARGET_CFG.h.
Поскольку это касается исключительно этого порта, стоит ли в scmRTOS_defs.h вносить проверку?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение May 3 2012, 12:49
Сообщение #215


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ReAl @ May 3 2012, 19:35) *
«Та не»™
Надо еще выключить инициализацию SYSTICK (включение таймера и разрешение его прерываний) в os_start, которая в OS_Target_asm.S сидит.

Так что таки надо какой-то #define scmRTOS_CM3_PORT_USER_SYSTICK в scmRTOS_TARGET_CFG.h.
Поскольку это касается исключительно этого порта, стоит ли в scmRTOS_defs.h вносить проверку?

А можно и не выносить, а просто вырубить в main. Пара инструкций никому плохо не сделает. Мне кажется, что нормальное решение - для подавляющего большинства проектов годится вариант, который по умолчанию в порте, а для тех редких случаев, где хочется заменить системный таймер на другой, это решается несколькими командами на уровне проекта.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 3 2012, 13:08
Сообщение #216


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



В том-то и дело, что в main() не получится — инициализация проходит в os_start(), которая вызывается из OS::run().


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение May 3 2012, 13:57
Сообщение #217


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ReAl @ May 3 2012, 20:08) *
В том-то и дело, что в main() не получится — инициализация проходит в os_start(), которая вызывается из OS::run().

Действительно, затупил я. sm.gif Да, тогда без вмешательства в os_start() красиво, по ходу, не сделать.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 3 2012, 17:27
Сообщение #218


Гуру
******

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



QUOTE (ReAl @ May 3 2012, 16:08) *
инициализация проходит в os_start()
Так может быть вынести ее оттуда, как и в остальных портах? Я предпочитаю всю инициализацию делать в одном месте, это имеет свои плюсы - только в это мето нужно "донести" #define с частотами. А с этим обрывком инициализации в os_start() стройная картина рушится. Да и дополнительные определения констант там совсем не красят код, в то время как их же можно красиво написать с символическими именами в любом месте C++ -исходника.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 3 2012, 18:18
Сообщение #219


фанат дивана
******

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



Цитата(ReAl @ May 3 2012, 18:35) *
«Та не»™
Надо еще выключить инициализацию SYSTICK (включение таймера и разрешение его прерываний) в os_start, которая в OS_Target_asm.S сидит.

Да пусть молотит, он нам не мешает, поскольку мы переименовали обработчик его прерывания.
Если не нужен - потом в наиболее приоритетной задаче при старте отрубить, и всё. В общем, корявенько, но возможноsm.gif
Цитата(Сергей Борщ @ May 3 2012, 23:27) *
Так может быть вынести ее оттуда, как и в остальных портах?

Вот этого делать очень неохота - придётся дописывать эту инициализацию в кучу проектов.
Надо как-то придумать, чтоб по умолчанию было поведение как сейчас. Какой-нибудь
WEAK start_systimer(), что ли. Ну или
Цитата(ReAl @ May 3 2012, 18:35) *
какой-то #define scmRTOS_CM3_PORT_USER_SYSTICK в scmRTOS_TARGET_CFG.h.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 3 2012, 19:27
Сообщение #220


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ May 3 2012, 21:18) *
Да пусть молотит, он нам не мешает, поскольку мы переименовали обработчик его прерывания.
Что-то я не понял. Прерывание-то разрешено в регистрах NVIC.
Цитата
1. В таблице векторов прерываний переименовываем SystemTimer_ISR во что-то другое (чтобы не вызывался штатный осёвый обработчик);
Без обработчика влетит в Default_Handler()

Тут разве что это «что-то другое» состоит из функции, запрещающей назад прерывание, сбрасывая NVIC_ST_CTRL_INTEN.

-------------------------------------
Цитата(_Артём_ @ Apr 10 2012, 17:11) *
Все прерывания с приоритетом выше configKERNEL_INTERRUPT_PRIORITY не запрещаются никогда, но работают без использования ОСи. NVIC CM3 позволяет сделать подобное.
Но есть ли в этом смысл? Или оно не надо никому?
https://groups.google.com/group/scmrtos-ru/...c21f94515?hl=ru


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 3 2012, 20:21
Сообщение #221


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ May 3 2012, 15:35) *
Надо еще выключить инициализацию SYSTICK (включение таймера и разрешение его прерываний) в os_start, которая в OS_Target_asm.S сидит.

Во как!
А я его зачем-то в main-е инициализирую до вызова OS::run(). По аналогии с АВР наверное.
А он потом ещё раз инициализируется.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2012, 01:10
Сообщение #222


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ May 3 2012, 22:27) *


Пришла такая мысль:
Код
class TCritSect
{
public:
    TCritSect () {
    // запрет всех прерываний
    }
#if (scmRTOS_USER_DEFINED_CRITSECT_ENABLE==1)
    TCritSect(enum INT_PRIORITY level) {
        // запрет всех кроме указанных
    };
#endif    
    ~TCritSect() {
        // восстановление в изначальное состояние
    }

private:
    enabled_level_t  EnabledLevels;
};
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 4 2012, 02:41
Сообщение #223


фанат дивана
******

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



Цитата(ReAl @ May 4 2012, 01:27) *
Что-то я не понял. Прерывание-то разрешено в регистрах NVIC.
Без обработчика влетит в Default_Handler()

Не без обработчика, а с другим обработчиком sm.gif
То есть, если пользователю нужен SysTick, то он уже есть и инициализирован. А если не нужен - то пустой обработчик. Или
Цитата(ReAl @ May 4 2012, 01:27) *
состоит из функции, запрещающей назад прерывание, сбрасывая NVIC_ST_CTRL_INTEN.



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение May 4 2012, 04:48
Сообщение #224


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (_Артём_ @ May 4 2012, 08:10) *
Пришла такая мысль:
CODE
class TCritSect
{
public:
    TCritSect () {
    // запрет всех прерываний
    }
#if (scmRTOS_USER_DEFINED_CRITSECT_ENABLE==1)
    TCritSect(enum INT_PRIORITY level) {
        // запрет всех кроме указанных
    };
#endif    
    ~TCritSect() {
        // восстановление в изначальное состояние
    }

private:
    enabled_level_t  EnabledLevels;
};

И как это поможет? Этим можно пилотировать в своём коде, который пишется в данный момент. Но критические секции в коде ОС останутся без изменений.

По поводу таймера. Мне казалось, что самым правильным решением было бы не завязываться на аппаратуру таймера в коде ОС и вынести всю инициализацию на уровень проекта. Там реально несколько строчек. Зато никаких вопросов не возникает. Я так и делал в порте для Blackfin'а, хотя там тоже есть специальный таймер в ядре. Как сейчас правильнее поступить, даже не знаю.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 4 2012, 05:53
Сообщение #225


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Артём_ @ May 4 2012, 04:10) *
Код
#if (scmRTOS_USER_DEFINED_CRITSECT_ENABLE==1)
    TCritSect(enum INT_PRIORITY level) {
        // запрет всех кроме указанных
    };
#endif
Во-первых, как уже написал Гарри, запрещающий все конструктор без аргументов ничего не поменяет в работе ОС, а это была цель. Во-вторых, этот enum у всех будет свой (у Cortex оно вообще от проекта к проекту реально плавать будет). Где-то там в обсуждениях в группе я об этом писал — «стандартизовать» можно максимум имя для этого enum. Так что сейчас надо просто в scmRTOS_TARGET_CFG.h написать:
Код
#define scmRTOS_USER_DEFINED_CRITSECT_ENABLE 1
// как нужно автору проекта в данном проекте
enum TIsrPriority {     ipNone = ..., ipXXX = ..., ipYYY = ..., ipAll = ... };

const TIsrPriority  ipOsLevel = ipXXX;

class TCritSect {
public:
    // и TCritSect cs в ОС отработает с этим уровнем.
    TCritSect(TIsrPriority level = ipOsLevel) {
        // запрет всех кроме указанных
    };
...
};

Для STM8, к примеру, можно и сразу в порте так сделать, там число уровней фиксировано. Только
  • enum нужно в OS_Target.h определить выше включения scmRTOS_TARGET_CFG.h
  • Дабы не плодить #define/#ifdef — константу const TIsrPriority ipOsLevel обязать задавать в scmRTOS_TARGET_CFG.h
  • Сам такой «приоритетный» класс задать в OS_Target.h определить ниже включения scmRTOS_TARGET_CFG.h.

Но пока это не сделано, каждый может подсунуть своё (у меня с портом STM8 вообще пауза — и у меня времени нет, и тот, кто попросил порт сделать — свою дискавери-платку забрал назад laughing.gif ).


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

17 страниц V  « < 13 14 15 16 17 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016