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

Значит, Вы не задали функцию RaiseContextSwitch() в пространстве OS у себя в проекте, в файле scmRTOS_TARGET_CFG.h

Да, не задал.

 

И если исходники были для 3.10, то в них не могло быть функции system_timer_user_hook(), должна была быть SystemTimerUserHook()

Я взял за основу пример для версии 4, но main.cpp ещё не заменил.

 

Пример 3-Channel для порта AVR/GCC специально оставлен в режиме совместимости, т.е. там все исходники примера от 3.10

Только в scmRTOS_CONFIG.h добавлена строка

Код

#include "scmRTOS_310_compat.h"

 

и всё. Этого достаточно — компилируется в режиме совместимости.

В том include-файле кроме

Код

#define scmRTOS_OBSOLETE_NAMES 1

ещё определено несколько нужных для 3.10 типов.

 

Спасибо, посмотрю.

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


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

Зашёл по ссылке:

main.cpp

 

И вижу:

template<> void TProc3::exec()

 

Откуда в версии 3.10 у OS::process метод exec?

Exec есть, а exec - нету.

 

Что не так?

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


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

Exec есть, а exec - нету.

 

Что не так?

Файл по ссылке из четвёртой версии. Номер версии в комментариях забыли поменять.

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


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

Файл по ссылке из четвёртой версии. Номер версии в комментариях забыли поменять.

?

Простите, не понял...

А из какой версии он должен быть?

 

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


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

Тогда мне не понятна одна из Ваших мыслей.

1. Мы находимся в теме, посвящённой четвёртой версии ОС и Вы дали ссылку на файл из этой версии.

2. Вы задали вопрос:"Откуда в версии 3.10 у OS::process метод exec?"

3. Далее:"Exec есть, а exec - нету."

Я предположил, что Вы обратили внимание на номер версии в шапке файла, на что и дал свой ответ.

 

Добавлю, что при переходе с третьей версии на четвёртую, авторами было принято решение о переименовании методов (это я опять же предполагаю, что Вас именно это интересует).

 

Если мои предположения не верны, то уточните свой вопрос.

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


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

Тогда мне не понятна одна из Ваших мыслей.

1. Мы находимся в теме, посвящённой четвёртой версии ОС и Вы дали ссылку на файл из этой версии.

2. Вы задали вопрос:"Откуда в версии 3.10 у OS::process метод exec?"

3. Далее:"Exec есть, а exec - нету."

 

Мой вопрос: ссылка

Переношу приложение написанное для v310 в 400. В ходе процесса возникают вопросы и тп.

 

2. Вы задали вопрос:"Откуда в версии 3.10 у OS::process метод exec?"

3. Далее:"Exec есть, а exec - нету."

Я предположил, что Вы обратили внимание на номер версии в шапке файла, на что и дал свой ответ.

Я думал, что если использовать режим совместимости с 310 (scmRTOS_OBSOLETE_NAMES 1), то в 4-й версии также должен быть определёны TBaseProcess::Exec, RaiseContextSwitch и тп (появляющиеся если scmRTOS_OBSOLETE_NAMES=1). Но они не определены...

Вот мне и непонятно - это неточности/ошибки/недоделки или что.

 

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


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

Да, я не обратил внимания на предысторию вопроса.

Вот мне и непонятно - это неточности/ошибки/недоделки или что.

Скорее всего - всё вместе.

Когда у меня встала задача переносить проект на четвёртую версию, то я просто сделал рефакторинг имён по всему проекту (благо в Eclipse это просто, заняло несколько минут) и не заморачивался с OBSOLETE_NAMES.

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


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

Скорее всего - всё вместе.

+ещё мое слабое знание scmrtos.

 

Когда у меня встала задача переносить проект на четвёртую версию, то я просто сделал рефакторинг имён по всему проекту (благо в Eclipse это просто, заняло несколько минут) и не заморачивался с OBSOLETE_NAMES.

Рефакторинг - тоже вариант. Но я лучше с OBSOLETE_NAMES помучаюсь.

 

Спасибо.

 

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


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

Вот мне и непонятно - это неточности/ошибки/недоделки или что.
Это так и задумано. Там, где возможно - старые места определены. К сожалению, определение имен Exec потребовало бы щедро усыпать код различными #ifdef. Поэтому было принято решение возложить на пользователя обязанность переименовать в своем коде Exec в exec.

 

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


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

Это так и задумано. Там, где возможно - старые места определены. К сожалению, определение имен Exec потребовало бы щедро усыпать код различными #ifdef.

 

Ясно. Спасибо.

Буду менять E на е.

 

Поэтому было принято решение возложить на пользователя обязанность переименовать в своем коде Exec в exec.

 

А об этом где-то написано?

Может есть кaкой-то Migration tutorial?

 

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


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

Пока полз до компьютера, объяснение уже дал Сергей. Более развёрнуто:

Режим совместимости включает генерацию inline-функций-переходников в две стороны:

Со старых имён функций классов ОС на новые — чтобы пользовательский код мог продолжать вызывать, например, .Wait()

С новых имён задаваемых пользователем функций (хуки, тот же raise_context_switch()) на старые — чтобы ОС увидела эти функции в старых текстах.

 

Благодаря переходникам работают и старые, и новые имена, можно потихоньку редактироввть текст и после каждого изменения все будет собираться.

 

В случае с exec() добавлением inline-переходника не обойтись, нужно «честное имя» (адрес).

В итоге два варианта - ifdef-ить эти места в ОС либо пользователю отредактировать эти имена.

Решили остановиться на втором — этих Exec() немного в каждом проекте и автору точно известно где их искать.

 

Где почитать — ну можно там же, в main.cpp, ссылку Вы тут сами дали:

55 //---------------------------------------------------------------------------

56 // Sample target

57 // The sample is intended for following AVR microcontrollers:

58 // atmega48..atmega328

59 // atmega64, atmega128

60 // atmega640..atmega2561

61 // Some changes in register names may be needed for other AVRs.

62 //

63 // The sample is also intended to show how to use scmRTOS v3.xx oriented

64 // sources with scmRTOS v4.00

65 // 1. Add

66 // #include "scmRTOS_310_compat.h"

67 // into scmRTOS_CONFIG.h

68 // 2. Rename process functions from Exec() to exec()

69 //

Конечно, какой-нибуть мигратинг-гад.pdf не помешал бы...

Ну вот если бы к проекту присоединился кто-то, кто сам ничего в оси и не берется менять, но разбирается в ней (в том числе отслеживает обсуждения в рассылке) и выполняет функции «технического писателя» по таким вот пунктам... :rolleyes:

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


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

p.s. примеры AVR переехали каталогом ниже

http://scmrtos.svn.sourceforge.net/viewvc/...s/AVR/GCC/MEGA/

 

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


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

Пока полз до компьютера, объяснение уже дал Сергей. Более развёрнуто:

Режим совместимости включает генерацию inline-функций-переходников в две стороны:

Со старых имён функций классов ОС на новые — чтобы пользовательский код мог продолжать вызывать, например, .Wait()

С новых имён задаваемых пользователем функций (хуки, тот же raise_context_switch()) на старые — чтобы ОС увидела эти функции в старых текстах.

 

Благодаря переходникам работают и старые, и новые имена, можно потихоньку редактироввть текст и после каждого изменения все будет собираться.

 

В случае с exec() добавлением inline-переходника не обойтись, нужно «честное имя» (адрес).

В итоге два варианта - ifdef-ить эти места в ОС либо пользователю отредактировать эти имена.

Решили остановиться на втором — этих Exec() немного в каждом проекте и автору точно известно где их искать.

Понятно. Спасибо.

 

 

P.S. Примеры для Мега АВР переехали в папку ../MEGA и в описании примеров появился комментарий: "samples for all non-xmega". К чему бы это? Скоро появится папка /xmega. Или нет?

 

 

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


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

Добрый день!

Осваиваю потихоньку scmRTOS порт для М3, одолевает праздное любопытство: почему класс TCritSect вынесен из пространства имен OS?

Вроде бы как единообразие нарушается при его использовании, всегда хочется по аналогии с

OS::TEventFlag ef;

написать

OS::TCritSect cs;

 

или тут была какая-то задумка изначально?

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


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

или тут была какая-то задумка изначально?

Хороший вопрос. :) Наверное потому, что он сам по себе несёт самостоятельную нагрузку, не "завязываясь" на потроха ОС. Такую штуку можно (и полезно) использовать и без всяких вытесняющих осей в случаях, когда возможен асинхронный доступ к глобальным объектам (например, из основной программы и из прерывания).

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


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

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

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

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

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

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

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

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

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

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