Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выпущена scmRTOS 4.0.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Страницы: 1, 2, 3, 4, 5, 6
AHTOXA
Собственно, субж.
Ссылки:

Кроме того, незадолго до этого была выпущена версия 3.11. Это завершающая, багофиксная версия 3.x. Ссылки:
haker_fox
Искренние поздравления!
Использовал несколько раз третью ветку. Доволен! Самое то для маленьких МК)
Быть может в будущем четверку возьму в проекты.
Fat Robot
Молодцы!

Aprox
Уважаемые авторы новой 4-ой версии!

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

1. Вы ввели новое обзначение для типов переменных. Вопрос- чем не устраивают классические имена типов из С++? Зачем изобретать u32_t вместо всем знакомого из классики unsigned long?

2. В STM32 применен новый контроллер прерываний, отличный от старого VIC тем, что грамотно и надежно исполняет nested прерывания. Это nested каким-то образом нашло отражение в вашем порте на STM32? Или все по-старому, никаких nested ?
_Артём_
Цитата(Aprox @ Apr 9 2012, 21:32) *
Или все по-старому, никаких nested ?

А что по вашему раньше нельзя было?
Код из примера v3
Код
#define ENABLE_NESTED_INTERRUPTS() __enable_interrupt()


#pragma vector=TIMER1_COMPA_vect
OS_INTERRUPT void Timer1_period_ISR()
{
    OS::TISRW_SS ISRW;

    ENABLE_NESTED_INTERRUPTS();
    Timer1_Ovf.SignalISR();
}
bookevg
Цитата(Aprox @ Apr 9 2012, 22:32) *
1. Вы ввели новое обзначение для типов переменных. Вопрос- чем не устраивают классические имена типов из С++? Зачем изобретать u32_t вместо всем знакомого из классики unsigned long?

Для embedded привычно указание в типе его разрядность.
Сергей Борщ
QUOTE (Aprox @ Apr 9 2012, 21:32) *
1. Вы ввели новое обзначение для типов переменных. Вопрос- чем не устраивают классические имена типов из С++? Зачем изобретать u32_t вместо всем знакомого из классики unsigned long?
Во-первых все уже придумано до нас. эти типы являются частью стандарта C-99 (см. описание stdint.h) . Их вводили потому, что разрядность char, short, int, long, long long стандартом не определена. И еще для того, чтобы код без переписывания компилился максимально оптимально под любую платформу. И если нам нужно целое для хранения значения то 0 до 255, то на 8-битном AVR или 16-битном MSP430 для этого оптимально подходит байт (т.е. тип unsigned char на этих платформах), а для ARM более эффективен будет 32-битный unsigned int, ибо процессор не имеет 8-битной арифметики и вынужден будет постоянно преобразовывать 8 бит в 32 и обратно. Стандарт гарантирует, что тип uint_fast8_t будет удовлетворять нашим требованиям. Если копнуть глубже, то обнаружится, что для AVR этот тип будет компилиться в unsigned char а для ARM - в unsigned int. Не трогая исходников, что очень важно для многоплатформенного кода. Если пример с арифметикой вас не убеждает - подумайте о типе uintptr_t, т.е. целое, в котором умещается указатель. Размеры указателя на разных платформах отличаются.

А во-вторых писать unsigned long слишком длинно.
Aprox
Цитата(_Артём_ @ Apr 9 2012, 23:00) *
А что по вашему раньше нельзя было?

Наверное можно. Но при этом нельзя было размещать внутри ISR длительных операций которые блокировали бы работу OS и всей системы в целом. Теперь, с появлением nested контроллера прерываний в ISR можно размещать практически целые статические task( за исключением инициализации задачи) и не боятся блокировки всей системы. Такой прием особенно хорош еще и тем, что в STM32 периферия взаимодействует с памятью по DMA, поэтому нагрузка на систему по прерываниям резко ниже. Вот, я и спрашиваю - учтены ли эти новации периферии в новой версии scmRTOS?

Цитата(Сергей Борщ @ Apr 10 2012, 00:53) *
Во-первых все уже придумано до нас. эти типы являются частью стандарта C-99 (см. описание stdint.h) . Их вводили потому, что разрядность char, short, int, long, long long стандартом не определена. И еще для того, чтобы код без переписывания компилился максимально оптимально под любую платформу.

Мне представляется, заботу об оптимальности использования памяти или скорости выполнения кода берет на себя компилятор C++. По крайней мере, в IAR это именно так. Пользователю знать, в какой размер битов упакована его переменная, как правило не обязательно. По делу, ему важно знать только пределы изменения переменной. А эта информация представлена в мануалах на любой компилятор, например там пишут :

unsigned char 0 .. 255
signed char -128 .. +127
.... и т.д.


Цитата
А во-вторых писать unsigned long слишком длинно.

Зато кросплатформенность соблюдается. Причем в мощных системах проектирования (Visual Studio), реализован умный редактор текстов, который подсказывает тип переменной и даже сам его вписывает.

demiurg_spb
Цитата(Aprox @ Apr 10 2012, 13:02) *
Зато кросплатформенность соблюдается.
Какраз наоборотsad.gif

Я бы поменял местами встречающуюся в коде последовательнсть:
Код
INLINE static
на
Код
static INLINE

Ибо попадались Си-шные компиляторы дающие предупреждение на то что сначала должен идти storage квалификатор.
Хотя тут С++, может и не быть никаких предупреждений, но у меня в голове это засело крепко и я уже как бык на красную тряпку реагирую...
Сергей Борщ
QUOTE (Aprox @ Apr 10 2012, 12:02) *
Мне представляется, заботу об оптимальности использования памяти или скорости выполнения кода берет на себя компилятор C++. По крайней мере, в IAR это именно так. Пользователю знать, в какой размер битов упакована его переменная, как правило не обязательно.
Никакой заботы компилятор предоставить не может . Вот укажете вы какой-нибудь переменной unsigned int чтобы было быстро на ARM, и компилятор будет вынужден использовать 2 байта на AVR, хотя может быть и достаточно одного. А укажете unsigned char - и компилятор для ARM будет вынужден после каждой арифметической операции обрезать 24 старших бита, ибо делать арифметику с байтами ядро делать не умеет. А укажете uint_fast8_t и все будут довольны. Чем плохо?
QUOTE (Aprox @ Apr 10 2012, 12:02) *
По делу, ему важно знать только пределы изменения переменной. А эта информация представлена в мануалах на любой компилятор
То есть для каждой переменной мы должны просматривать мануалы на все компиляторы всех процессоров, под которые портирована ОС и искать тот тип, который удовлетворит нас для этой переменной на всех платформах/компиляторах? Но зачем, если специально для такого случая придуман stdint.h? И во многих случаях один стандартный тип не будет одинаково хорош на всех платформах, пример выше.
QUOTE (Aprox @ Apr 10 2012, 12:02) *
Зато кросплатформенность соблюдается. Причем в мощных системах проектирования (Visual Studio), реализован умный редактор текстов, который подсказывает тип переменной и даже сам его вписывает.
Кроссплатформенность еще лучше соблюдается с типами из stdint.h. И с этими типами прекрасно себя чувствует умный редактор типа Eclipse. Если Студия спотыкется на стандартных заголовочных файлах - увы. Как же она тогда работает с остальными typedef, в том числе и пользовательскими?
dxp
QUOTE (demiurg_spb @ Apr 10 2012, 17:12) *
Я бы поменял местами встречающуюся в коде последовательнсть:
CODE
INLINE static
на
CODE
static INLINE

Причина?
demiurg_spb
ответил в предыдущем посте.
_pv
Цитата(Aprox @ Apr 10 2012, 16:02) *
Зато кросплатформенность соблюдается.

помимо приведённого примера с uint_fast8_t, который хоть и медленее, но работать будет,
могут быть еще замечательные грабли вида
for (int i = 0; i < 100000; i++){...}
если тип int вдруг внезапно окажется 16 разрядов вместо 32 и 100000 в него уже не влезет.

AHTOXA
Цитата(Aprox @ Apr 10 2012, 15:02) *
Вот, я и спрашиваю - учтены ли эти новации периферии в новой версии scmRTOS?

Вложенные прерывания у Cortex-M3 порта можно использовать, как в новой, так и в старой версии scmRTOS.
dxp
QUOTE (demiurg_spb @ Apr 10 2012, 17:12) *
Я бы поменял местами встречающуюся в коде последовательнсть:
CODE
INLINE static
на
CODE
static INLINE

Ибо попадались Си-шные компиляторы дающие предупреждение на то что сначала должен идти storage квалификатор.
Хотя тут С++, может и не быть никаких предупреждений, но у меня в голове это засело крепко и я уже как бык на красную тряпку реагирую...

Ну, как только (если) возникнет такой вопрос, так сразу и будем решать. Пока, вродь, не было прецедентов.
_Артём_
Цитата(AHTOXA @ Apr 10 2012, 15:31) *
Вложенные прерывания у Cortex-M3 порта можно использовать, как в новой, так и в старой версии scmRTOS.


Может Aprox под поддержкой вложенных прерываний имел в виду что-то навроде такого:
Код
#define configKERNEL_INTERRUPT_PRIORITY n // максимальный уровень приоритета прерываний в которых могут использоваться сервисы ОС


Все прерывания с приоритетом выше configKERNEL_INTERRUPT_PRIORITY не запрещаются никогда, но работают без использования ОСи.
NVIC CM3 позволяет сделать подобное.
Но есть ли в этом смысл? Или оно не надо никому?
AHTOXA
Цитата(_Артём_ @ Apr 10 2012, 20:11) *
Может Aprox под поддержкой вложенных прерываний имел в виду что-то навроде такого:

Нет, судя по тому, что он пишет, что "в ISR можно размещать практически целые статические task", речь как раз идёт о низкоприоритетных прерываниях. В принципе, нужды в этом при использовании оси нет никакой, ибо для этого есть процессы оси. Что же касаемо
Цитата
Все прерывания с приоритетом выше configKERNEL_INTERRUPT_PRIORITY не запрещаются никогда, но работают без использования ОСи.
, то этого сейчас нет. Возможно, существуют задачи, для которых это бы могло пригодиться, но их весьма немного. Ибо выигрыш будет буквально мизерным (в scmRTOS прерывания запрещаются буквально на несколько тактов), зато:
- время переключения контекста возрастёт;
- время отклика оси ухудшится;
- добавится проблем по синхронизации безосёвого обработчика прерываний с осью.
_Артём_
Цитата(AHTOXA @ Apr 10 2012, 19:56) *
в scmRTOS прерывания запрещаются буквально на несколько тактов



Ну для авр запрет - несколько сотен тактов. Или я не прав? Ну да что от авр ждать-то.
Для Cortex-m3 во время выполнения PendSV прерывания где-то разрешены? И как можно посмотреть время выполнения PendSV?
Aprox
Цитата(Сергей Борщ @ Apr 10 2012, 14:13) *
Никакой заботы компилятор предоставить не может . Вот укажете вы какой-нибудь переменной unsigned int чтобы было быстро на ARM, и компилятор будет вынужден использовать 2 байта на AVR, хотя может быть и достаточно одного. А укажете unsigned char - и компилятор для ARM будет вынужден после каждой арифметической операции обрезать 24 старших бита, ибо делать арифметику с байтами ядро делать не умеет. А укажете uint_fast8_t и все будут довольны. Чем плохо?

Видите-ли, я тупой юзер, и лишние заморочки мне совсем не нужны. Извините, но совершенно фиолетово, как и что будет "обрезать" компилятор, главное- чтобы результат вычислений был правильным. И если мне на входе сказали, что переменная типа unsigned char может хранить значения от -128 до +127, а перменная типа int значения в пределах от - 2147483648 lдо + 2147483647, то этого вполне достаточно, чтобы приступить писать конкретное приложение особо ничем не заморачиваясь .
Цитата
То есть для каждой переменной мы должны просматривать мануалы на все компиляторы всех процессоров, под которые портирована ОС и искать тот тип, который удовлетворит нас для этой переменной на всех платформах/компиляторах? Но зачем, если специально для такого случая придуман stdint.h? И во многих случаях один стандартный тип не будет одинаково хорош на всех платформах, пример выше.

Я посмотрел на текст файла stdint.h в составе IAR 6.0. Увидел by options, т.е. никакой это не стандарт. Но заморочит голову прикладнику по-крупному. Вам, как авторам, это надо? К тому-же, принцип "одинаково хорошо" очень неубедителен, когда видишь сколь велик в ресурсах разброс предлагаемых микроконтроллеров. По-моему, все окучить "одинаково хорошо" никак невозможно.
Цитата
Кроссплатформенность еще лучше соблюдается с типами из stdint.h. И с этими типами прекрасно себя чувствует умный редактор типа Eclipse. Если Студия спотыкется на стандартных заголовочных файлах - увы. Как же она тогда работает с остальными typedef, в том числе и пользовательскими?

"Студия" не спотыкается, она просто не знает ничего про разрядность типов данных. Но зато прекрасно выделяет стандартные ключевые слова: signed, long, void, double .. и т.д. Точно также IAR выделяет эти ключевые слова. А вот vu16_t, извините, не выделяет. Потому, что не стандарт ни С, ни С++. Стоит ли овчинка выделки?

aaarrr
Цитата(Aprox @ Apr 10 2012, 23:47) *
Я посмотрел на текст файла stdint.h в составе IAR 6.0. Увидел by options, т.е. никакой это не стандарт.

Лучше посмотрите в стандарте stdint.h
Он там очень даже есть, более того, является его неотъемлемой частью.
Aprox
Цитата(AHTOXA @ Apr 10 2012, 20:56) *
Нет, судя по тому, что он пишет, что "в ISR можно размещать практически целые статические task", речь как раз идёт о низкоприоритетных прерываниях. В принципе, нужды в этом при использовании оси нет никакой, ибо для этого есть процессы оси.

Не совсем так, рассмотрим для примера стек TCP/IP как task. При передаче по протоколу TCP существуют ряд коротких пакетов синхронизации и подтврждения, которые нет смысла отправлять на обработку фоновой задаче. Уже не говоря про поступающий "мусор", который надо просто игнорировать. Много проще короткие операции делать прямо в ISR, а уже пакеты с данными отправлять как message в ожидающую задачу OS. Приоритет такой ISR отнюдь не низкий, а наоборот- высокий, чтобы избежать ошибки overflow поступающих пакетов.
Цитата
Что же касаемо, то этого сейчас нет. Возможно, существуют задачи, для которых это бы могло пригодиться, но их весьма немного. Ибо выигрыш будет буквально мизерным

Выигрыш в наглядности и простоте будет колосальный. Каждая задача синхронизирована за прерывание от периферии, - это и нужно прикладнику в первую очередь.
Цитата
- время переключения контекста возрастёт;

Не знаю, как в других, но в ARM9/11 и Cortex контекст на прерываниях переключается практически мгновенно.
Цитата
- время отклика оси ухудшится;
- добавится проблем по синхронизации безосёвого обработчика прерываний с осью.

Привычная нам OS при таком подходе становится сама весьма сомнительной вещью. Надо-ли идти у нее на поводу?




Цитата(aaarrr @ Apr 11 2012, 00:12) *
Лучше посмотрите в стандарте stdint.h
Он там очень даже есть, более того, является его неотъемлемой частью.

Тогда обьясните мне, почему, если я напишу в обявлениях переменной якобы станартное слово uint8_t, компилятор сразу начнет ругаться? Со стандартными ключевыми словами такой заморочки не происходит.
aaarrr
Цитата(Aprox @ Apr 11 2012, 00:30) *
Тогда обьясните мне, почему, если я напишу в обявлениях переменной якобы станартное слово uint8_t, компилятор сразу начнет ругаться? Со стандартными ключевыми словами такой заморочки не происходит.

Если <stdint.h> подключен, то ругнуться на uint8_t компилятор может только в том случае, если целевая платформа в принципе не имеет подобного типа данных (например, TI's C2000, C5500).
demiurg_spb
Цитата(Aprox @ Apr 10 2012, 23:47) *
"Студия" не спотыкается, она просто не знает ничего про разрядность типов данных. Но зато прекрасно выделяет стандартные ключевые слова: signed, long, void, double .. и т.д.
В настройках практически любой современной IDE всегда есть возможность пополнить список ключевых слов чтобы и они тоже подсвечивались. Посмотрите в хелпе.


Цитата(dxp @ Apr 10 2012, 17:33) *
Ну, как только (если) возникнет такой вопрос, так сразу и будем решать. Пока, вродь, не было прецедентов.
Вольному - воля.
Сергей Борщ
QUOTE (Aprox @ Apr 10 2012, 22:47) *
Видите-ли, я тупой юзер, и лишние заморочки мне совсем не нужны. Извините, но совершенно фиолетово, как и что будет "обрезать" компилятор, главное- чтобы результат вычислений был правильным.
Потом вы будете ныть, что программа медленная, а компилятор плохой и делает кучу ненужных действий.
QUOTE (Aprox @ Apr 10 2012, 22:47) *
И если мне на входе сказали, что переменная типа unsigned char может хранить значения от -128 до +127, а перменная типа int значения в пределах от - 2147483648 lдо + 2147483647,
Переменная типа unsigned char может хранить значения от 0 до 65535 (на TI's C2000, C5500) а int от -32768 до +32767 (AVR). И что нам с этим делать?
QUOTE (Aprox @ Apr 10 2012, 22:47) *
то этого вполне достаточно, чтобы приступить писать конкретное приложение особо ничем не заморачиваясь .
Вам никто не запрещает в своем приложении использовать те типы, которые вам больше нравятся.
QUOTE (Aprox @ Apr 10 2012, 22:47) *
Но заморочит голову прикладнику по-крупному.
Странно. Сколько человек узнавали о stdint.h - все находили его удобным. Вы первый прикладник, которого ставят в тупик (морочат голову) выражения типа typedef unsigned char uint_fast8_t; Видимо ваш прикладник переписывает код под каждую платформу заново, а пользователи stdint.h просто используют один и тот же код на PC, Blackfin, ARM, MSP430, AVR и прочих без ненужных затрат на этапе выполнения.
QUOTE (Aprox @ Apr 10 2012, 22:47) *
К тому-же, принцип "одинаково хорошо" очень неубедителен, когда видишь сколь велик в ресурсах разброс предлагаемых микроконтроллеров. По-моему, все окучить "одинаково хорошо" никак невозможно.
Поэтому давайте сделаем для всех платформ хуже чем возможно только потому, что Aprox имеет аллергическую неприязнь к stdint.h?
QUOTE (Aprox @ Apr 10 2012, 22:47) *
Но зато прекрасно выделяет стандартные ключевые слова: signed, long, void, double .. и т.д. Точно также IAR выделяет эти ключевые слова. А вот vu16_t, извините, не выделяет.
Значит надо взять хороший редактор. Eclipse выделяет. Не таким же цветом, как встроенный тип, но отдельным цветом - как определенный пользователем тип.

Под сколькими платформами вы используете одни и те же исходники?
AHTOXA
Цитата(_Артём_ @ Apr 11 2012, 00:08) *
Ну для авр запрет - несколько сотен тактов. Или я не прав? Ну да что от авр ждать-то.

Ну, у АВР всё подольше будет, да. Я говорил про M3. У него обработчик PendSV выполняется ~70 тактов (менее микросекунды на 72 МГц).
Цитата(_Артём_ @ Apr 11 2012, 00:08) *
Для Cortex-m3 во время выполнения PendSV прерывания где-то разрешены? И как можно посмотреть время выполнения PendSV?

Прерывания во время выполнения PendSV запрещены. Посмотреть время выполнения - например махать ножкой и смотреть скопом. У кортексов я засекал при помощи DWT. (Обнаружил при этом способ сократить PendSV до 60 тактовsm.gif )
Anatoly74
Найдена опечатка в порте AVR, Common/OS_Kernel.h
В исходниках:
Код
public:
    INLINE TKernel() : CurProcPriority(pr0)
                     , ReadyProcessMap( (1ul << (PROCESS_COUNT)) - 1)  // set all processes ready
                     , ISR_NestCount(0)
    {
    }


Должно быть:
Код
public:
    INLINE TKernel() : CurProcPriority(pr0)
                     , ReadyProcessMap( (1 << (PROCESS_COUNT)) - 1)  // set all processes ready
                     , ISR_NestCount(0)
    {
    }

Кстати, в версии 3.11 такая же фигня.
_pv
Цитата(Anatoly74 @ Apr 11 2012, 14:34) *
Найдена опечатка в порте AVR, Common/OS_Kernel.h
В исходниках:
Код
ReadyProcessMap( (1ul << (PROCESS_COUNT)) - 1)  // set all processes ready

Должно быть:
Код
ReadyProcessMap( (1 << (PROCESS_COUNT)) - 1)  // set all processes ready

а будет нормально работать если процессов больше 7?
demiurg_spb
Цитата(_pv @ Apr 11 2012, 12:05) *
а будет нормально работать если процессов больше 7?
скорее 15 или 31. (все цифири по умолчанию имеют тип int)
Сергей Борщ
QUOTE (Anatoly74 @ Apr 11 2012, 10:34) *
Должно быть:
CODE
public:
    INLINE TKernel() : CurProcPriority(pr0)
                     , ReadyProcessMap( (1 << (PROCESS_COUNT)) - 1)  // set all processes ready
                     , ISR_NestCount(0)
    {
    }

А почему должно быть так? В чем ошибка? Будет неявное приведение unsigned long к TProcessMap.
наверное правильнее (красивее) будет
CODE
                     , ReadyProcessMap( ((TProcessMap)1 << (PROCESS_COUNT)) - 1)  // set all processes ready
Но и в таком виде ошибки я тут не вижу.
Aprox
Цитата(Сергей Борщ @ Apr 11 2012, 09:48) *
Потом вы будете ныть, что программа медленная, а компилятор плохой и делает кучу ненужных действий.

Нет, не буду. Наоброт, сейчаc порой страдаю из-за слишком быстрого процессора, котрый забегает вперед по кэшу уже после прерываний от периферии.
Цитата
Переменная типа unsigned char может хранить значения от 0 до 65535 (на TI's C2000, C5500) а int от -32768 до +32767 (AVR). И что нам с этим делать?

Авторам универсальной OS ? - Не знаю. А юзеру -просто почитать мануал на компилятор для своей платформы. В целом, задача сделать универсальную OS на все случаи жизни мне представляется нерешаемой.
Цитата
Вам никто не запрещает в своем приложении использовать те типы, которые вам больше нравятся.

Я этим постоянно занимаюсь, когда определяю классы в C++. Но ни разу в голову не пришло подменять стандартные ключевые слова языка C++ на какие-то свои обозначения.
Цитата
Значит надо взять хороший редактор. Eclipse выделяет. Не таким же цветом, как встроенный тип, но отдельным цветом - как определенный пользователем тип.

Вот видите, сколько ненужных заморчек вы навешиваете на юзера вашей OS? И stdint.h подключи, и вызубри его обозначения, и нужный редактор текста найди...
Цитата
Под сколькими платформами вы используете одни и те же исходники?
Всегда под одной единственной платформой- ARM9 и Cortex M3. Прикладнику и производственнику скакать по платформам - не имеет никакого смысла. И совсем не из-за stdint.h



Цитата(AHTOXA @ Apr 11 2012, 11:26) *
Я говорил про M3. У него обработчик PendSV выполняется ~70 тактов (менее микросекунды на 72 МГц).

Уточните пожалуйста, имеется в виду "обработчик" от scmRTOS со всеми его полингами или чистую реакцию процессора на прерывание по вектору SW?
ReAl
Цитата(Anatoly74 @ Apr 11 2012, 10:34) *
Найдена опечатка в порте AVR, Common/OS_Kernel.h
Раз в Common/ , то это не в порте, а в ОС, в ее общей части. Только это не опечатка, а багфикс.
Цитата(svn)
------------------------------------------------------------------------
r396 | avreal | 2011-04-27 20:09:07 +0300 (ср, 27 кві 2011) | 2 lines

v3.10: Common: fixed bug at ReadyProcessMap initializing.
------------------------------------------------------------------------
r389 | harry_zhurov | 2011-04-19 06:01:20 +0300 (вт, 19 кві 2011) | 1 line

Common: fixed bug at ReadyProcessMap initializing.


Когда-то было как раз так, как Вы предлагаете.

Цитата
Должно быть:
Код
public:
    INLINE TKernel() : CurProcPriority(pr0)
                     , ReadyProcessMap( (1 << (PROCESS_COUNT)) - 1)  // set all processes ready
                     , ISR_NestCount(0)
    {
    }
Теперь берём процесор с 16-битным int (MSP430, AVR, STM8) и берём, например, 17 процессов (вместе с idle).
Сдвигаем 1-ку, которая без суффикосв имеет тип int, на 17 бит. Получаем 0. Вычитаем 1, получаем -1 (типа int).
Как оно теперь приведётся к 32-битному TProcessMap, как 0xFFFFFFFF или как 0x0000FFFF — не важно, ведь нужно было 0x0001FFFF
mdmitry
Цитата(Aprox @ Apr 11 2012, 16:50) *
А юзеру -просто почитать мануал на компилятор для своей платформы. В целом, задача сделать универсальную OS на все случаи жизни мне представляется нерешаемой.
Вот видите, сколько ненужных заморчек вы навешиваете на юзера вашей OS? И stdint.h подключи, и вызубри его обозначения, и нужный редактор текста найди...


Пользователь сам выбирает, то что ему нужно и должен понимать последствия выбора.

При портировании по Вашему сценарию авторам придет портировать не только аппаратно-зависимую часть, но и программно-зависимую от int, char и т.д.
Аппаратно-зависимая часть сейчас в соответвтующем порте для процессора (Ports: OS_Target.h OS_Target_asm.S OS_Target_cpp.cpp) уже сделана.
Осталась программная часть: (Common ) OS_Kernel.cpp OS_Kernel.h OS_Services.cpp OS_Services.h scmRTOS.h scmRTOS_310_compat.h scmRTOS_defs.h usrlib.cpp usrlib.h и (Extensions ) profiler.h . Вроде ничего не забыл.
То есть ВСЕ и с учетом компилятора! Все надо отдельно отладить и поддерживать.

Код непереносимый получится. Пожалейте авторов! Они сделали большую работу очень качественно и бесплатно для пользователей.

P.S. Всегда считал, что писать переносимый код это хороший тон rolleyes.gif .
ReAl
Цитата(Aprox @ Apr 11 2012, 15:50) *
Но ни разу в голову не пришло подменять стандартные ключевые слова языка C++ на какие-то свои обозначения.
(выделение моё)
Это Вы о stdint.h ? Ну тогда, к примеру, #include <stdio.h> — это "подключать какие-то свои функции"
Кстати, если я не ошибаюсь, stdint.h, существующий в С начиная с C99, наконец-то вошёл в C++11


Цитата(Сергей Борщ @ Apr 11 2012, 13:23) *
наверное правильнее (красивее) будет
Код
                     , ReadyProcessMap( ((TProcessMap)1 << (PROCESS_COUNT)) - 1)  // set all processes ready
Я не помню, почему сделали не приведение к TProcessMap, а просто 1ul. Тогда в рассылке проскочило, быстренько обсудили, было исправлено в pre-v400. А я как раз в те дни что-то у себя менял, ну заодно и это исправил в 3.10.

Добавлено:
Ха! Так я сначала и хотел (TProcessMap)1
Смотрим рассылку (там, правда, часть покоцана в кодировках), ближе к концу — обсуждаемое.
Почему не (TProcessMap)1:
Надо было вообще ULL с запсом, чтобы позже нарваться на ненужное предупреждение.
Пусть 7 процессов и IDLE, итого 8. TProcessMap 8-битный. Сдвигаем (TProcessMap)1 на 8 и выходим за границы типа TProcessMap.
Результат будет всё равно правильный, но компилятор ворчит, лишние предупреждения в выдаче маскируют нелишние и вообще подстрекают снизить уровень ворчливости компилятора.
Сергей Борщ
QUOTE (ReAl @ Apr 11 2012, 16:48) *
Сдвигаем (TProcessMap)1 на 8 и выходим за границы типа TProcessMap
Да, теперь все ясно.
mdmitry
Получается, что в текущем варианте можно использовать не более 31 задачи, включая Idle (т.к. 1UL) для платформ разрядностью 32 включительно.
AHTOXA
Цитата(Aprox @ Apr 11 2012, 18:50) *
Уточните пожалуйста, имеется в виду "обработчик" от scmRTOS со всеми его полингами или чистую реакцию процессора на прерывание по вектору SW?

Обработчик прерывания PendSV порта scmRTOS для Cortex-M3.
Сергей Борщ
QUOTE (mdmitry @ Apr 11 2012, 17:35) *
Получается, что в текущем варианте можно использовать не более 31 задачи, включая Idle (т.к. 1UL) для платформ разрядностью 32 включительно.
Да. Об этом написано в документации в самом начале главы 2.1. "Общие сведения":
QUOTE
ОС поддерживает до 32 процессов (включая системный процесс IdleProc, т.е. до 31 пользовательского процесса),
и в комментариях исходников рядом со строкой задания количества процессов:
CODE
//------------------------------------------------------------------------------
//
//    Specify scmRTOS Process Count. Must be less than 31
//
//
#define  scmRTOS_PROCESS_COUNT              3

mdmitry
Зануда:
А в документации страницы с 115 по 118, 120, 122, 124, 126, 128, 130 и 132 не нумерованы (версия 29.03.2003 – 29.12.2011) laughing.gif
_Артём_
Цитата(AHTOXA @ Apr 11 2012, 10:26) *
Ну, у АВР всё подольше будет, да. У него обработчик PendSV выполняется ~70 тактов (менее микросекунды на 72 МГц).

Тактов 300 с чем-то, но при полном запрете прерываний.
70 гораздо лучше.

Цитата(AHTOXA @ Apr 11 2012, 10:26) *
У кортексов я засекал при помощи DWT. (Обнаружил при этом способ сократить PendSV до 60 тактовsm.gif )

Удобная штука. DWT только у M3 есть или у всех?

Получилось ~200 тактов от засыпания одной задачи до запуска другой.
AHTOXA
Цитата(_Артём_ @ Apr 11 2012, 23:09) *
70 гораздо лучше.

Теперь уже 60 08.gif
Цитата
Удобная штука. DWT только у M3 есть или у всех?

Насколько я смог понять, у M3 и M4(F). У остальных что-то не видно.
Цитата
Получилось ~200 тактов от засыпания одной задачи до запуска другой.

Да, это хорошо согласуется с моими измерениями (2.7мкс / 2.55 мкс).
Aprox
Цитата(AHTOXA @ Apr 11 2012, 18:44) *
Обработчик прерывания PendSV порта scmRTOS для Cortex-M3.

Спасибо. Теперь сравните со времнем реакции задачи, если бы она синхронизировалась напрямую от прерываний периферии и ее exec() находился бы внутри ISR. По моему, небо и земля. А если учесть, что в современных МК периферия работает с памятью по DMA, то вообще- OS по старинке отдыхает.

Цитата(mdmitry @ Apr 11 2012, 17:43) *
.. Пожалейте авторов! Они сделали большую работу очень качественно и бесплатно для пользователей.
P.S. Всегда считал, что писать переносимый код это хороший тон rolleyes.gif .

Я испытываю глубочайшее и искреннее уважение к авторам scmRTOS. И прежде всего потому, что сваяли вещь на С++, в то время как остальные тянут С. Как прикладник, я очень понимаю, сколь хорошо и надежно один раз создать и отладить класс, а потом наплодить на его основе много однотипных обьектов. Только поэтому и обратил внимание на scmRTOS, думал- вот оно! Но оказалось, что авторы, сделав грандиозный скачок в программировании, одновременно сделали и два, не менее грандиозных шага назад, в прошлый век,- по хардверу. Работая на передовом C++, они ориентируются на мелкие, примитивные микроконтроллеры, которые сейчас и найти-то стало трудно на рынке. Используют темплейты языка C++ для отживших свой век АVR! Честно скажу - уму нерастяжимо. Давно прошло то время, когда надо было влезать в узкие ворота ограниченных ресурсов процессора. Сейчас за те же деньги и при тех же габаритах юзер имеет возможность использовать чипы, сравнимые с ПК. Но авторы по-прежнему считают доблестью сохранить совместимость с устаревшими моделями. Причем, в ущерб своему же творению, его тянет назад груз прошлого, тормозит развитие. Извините, я этого понять не в состоянии.
AHTOXA
Цитата(Aprox @ Apr 12 2012, 00:24) *
OS по старинке отдыхает.

У меня сложилось впечатление, что вы влезли в эту радостную тему с единственной целью - попонтоваться. К сожалению, получилось не очень, уровень не тот. Претензии к stdint.h выглядят просто жалко, а остальное - вообще какой-то поток сознания. Вы уж извините меня за прямоту.
Я думаю, что вам придётся писать свою ось. С unsigned int вместо uint32_t, и чтоб "задачи синхронизировались напрямую от прерываний периферии". Потому что scmRTOS - не такая, и такой не будет.
Чтож, желаю вам успехов в этом деле.
Сергей Борщ
QUOTE (Aprox @ Apr 11 2012, 22:11) *
Работая на передовом C++, они ориентируются на мелкие, примитивные микроконтроллеры, которые сейчас и найти-то стало трудно на рынке. Используют темплейты языка C++ для отживших свой век АVR!
Ну извините, не угодили использующим исключительно "профессинальные контроллеры" с переднего края полета мысли контроллеростроителей. Когда будем делать следующую ОСь, мы вас спросим, для каких контроллеров ее делать и главное, для каких ее делать не нужно.
mdmitry
Aprox, Вас ни кто не заставляет использовать эту ОС.
Если Вас не устраивает сделанное кем-то, то сделайте свое и выложите для всех. Можно будет сравнить результаты.
ОС имеется множество, как и задач. Авторы scmRTOS позиционировали сферу применения (см. документацию).

Цитата
Сейчас за те же деньги и при тех же габаритах юзер имеет возможность использовать чипы, сравнимые с ПК. Но авторы по-прежнему считают доблестью сохранить совместимость с устаревшими моделями. Причем, в ущерб своему же творению, его тянет назад груз прошлого, тормозит развитие. Извините, я этого понять не в состоянии.

Просветите, пожалуйста, какие это чипы. Возможно, я отстал от жизни. crying.gif
dxp
QUOTE (mdmitry @ Apr 11 2012, 21:56) *
Зануда:
А в документации страницы с 115 по 118, 120, 122, 124, 126, 128, 130 и 132 не нумерованы (версия 29.03.2003 – 29.12.2011) laughing.gif

Спасибо за замечание! Слетел стиль страницы в конце раздела. Поправлено.


QUOTE (Aprox @ Apr 12 2012, 02:11) *
Работая на передовом C++, они ориентируются на мелкие, примитивные микроконтроллеры, которые сейчас и найти-то стало трудно на рынке. Используют темплейты языка C++ для отживших свой век АVR! Честно скажу - уму нерастяжимо. Давно прошло то время, когда надо было влезать в узкие ворота ограниченных ресурсов процессора. Сейчас за те же деньги и при тех же габаритах юзер имеет возможность использовать чипы, сравнимые с ПК. Но авторы по-прежнему считают доблестью сохранить совместимость с устаревшими моделями. Причем, в ущерб своему же творению, его тянет назад груз прошлого, тормозит развитие. Извините, я этого понять не в состоянии.

Этта пять! biggrin.gif a14.gif


QUOTE (AHTOXA @ Apr 12 2012, 02:12) *
Я думаю, что вам придётся писать свою ось. С unsigned int вместо uint32_t, и чтоб "задачи синхронизировались напрямую от прерываний периферии". Потому что scmRTOS - не такая, и такой не будет.
Чтож, желаю вам успехов в этом деле.

+1.
Aprox
Цитата(AHTOXA @ Apr 11 2012, 23:12) *
У меня сложилось впечатление, что вы влезли в эту радостную тему с единственной целью - попонтоваться. К сожалению, получилось не очень, уровень не тот. Претензии к stdint.h выглядят просто жалко, а остальное - вообще какой-то поток сознания. Вы уж извините меня за прямоту.
Я думаю, что вам придётся писать свою ось. С unsigned int вместо uint32_t, и чтоб "задачи синхронизировались напрямую от прерываний периферии". Потому что scmRTOS - не такая, и такой не будет.
Чтож, желаю вам успехов в этом деле.

Дело закончилось обидами. А ведь я хотел как лучше! Чтобы отличная задумка авторов не отставала бы от времени, от прогресса в хардвере микроконтроллеров. Но раз обиделись, зачит чувствуете свою неправоту. Что же касается "придется писать собственную OS"- нет не придется. Ибо не вижу жгучей необходимости.
Lotor
Цитата(Aprox @ Apr 12 2012, 11:57) *
Чтобы отличная задумка авторов не отставала бы от времени, от прогресса в хардвере микроконтроллеров.

Остается искренне порадоваться, что вы идете в ногу "с прогрессом в хардвере микроконтроллеров". %)
MrYuran
Цитата(Aprox @ Apr 12 2012, 11:57) *
Дело закончилось обидами. А ведь я хотел как лучше! Чтобы отличная задумка авторов не отставала бы от времени, от прогресса в хардвере микроконтроллеров.

ScmRTOS изначально задумывалась как легковесная ось для "тонких" контроллеров с 512Б ОЗУ.
Для "переднего края хардверного фронта" есть другие.
А авторы, прежде всего, разрушили два расхожих мифа: что операционкам, и тем более на с++, в мелкоте типа AVR и MSP430 не место.
За что им заслуженный респект.
viterra
Дело в том, что с типами данных действительно БЕДА.. Нестандартные размерности char, int как правило, действительно бесят, вынуждая программистов вытворять финты ушами. С этим ничего не сделаешь. Обижаться или придираться по этому поводу - бессмысленно. Приходится приспосабливаться к тому что есть.
Aprox
Цитата(MrYuran @ Apr 12 2012, 11:43) *
ScmRTOS изначально задумывалась как легковесная ось для "тонких" контроллеров с 512Б ОЗУ.
Для "переднего края хардверного фронта" есть другие.

Да, наверное есть, но программирование в системе реального времени на С++ я лично не встречал.
Цитата
А авторы, прежде всего, разрушили два расхожих мифа: что операционкам, и тем более на с++, в мелкоте типа AVR и MSP430 не место. За что им заслуженный респект.

Разрушение давно умерших за ненадобностью мифов - очень сомнительный результат. Поезд ушел. Впрочем, я извиняюсь перед уважаемыми авторами и всеми заинтересованными лицами за доставленные огорчения, если такие вдруг возникли.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.