Артём__ 1 March 8, 2012 Posted March 8, 2012 · Report post Значит, Вы не задали функцию 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 типов. Спасибо, посмотрю. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 14, 2012 Posted March 14, 2012 · Report post Зашёл по ссылке: main.cpp И вижу: template<> void TProc3::exec() Откуда в версии 3.10 у OS::process метод exec? Exec есть, а exec - нету. Что не так? Quote Share this post Link to post Share on other sites More sharing options...
IgorKossak 1 March 14, 2012 Posted March 14, 2012 · Report post Exec есть, а exec - нету. Что не так? Файл по ссылке из четвёртой версии. Номер версии в комментариях забыли поменять. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 14, 2012 Posted March 14, 2012 · Report post Файл по ссылке из четвёртой версии. Номер версии в комментариях забыли поменять. ? Простите, не понял... А из какой версии он должен быть? Quote Share this post Link to post Share on other sites More sharing options...
IgorKossak 1 March 14, 2012 Posted March 14, 2012 · Report post Тогда мне не понятна одна из Ваших мыслей. 1. Мы находимся в теме, посвящённой четвёртой версии ОС и Вы дали ссылку на файл из этой версии. 2. Вы задали вопрос:"Откуда в версии 3.10 у OS::process метод exec?" 3. Далее:"Exec есть, а exec - нету." Я предположил, что Вы обратили внимание на номер версии в шапке файла, на что и дал свой ответ. Добавлю, что при переходе с третьей версии на четвёртую, авторами было принято решение о переименовании методов (это я опять же предполагаю, что Вас именно это интересует). Если мои предположения не верны, то уточните свой вопрос. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 14, 2012 Posted March 14, 2012 · Report post Тогда мне не понятна одна из Ваших мыслей. 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). Но они не определены... Вот мне и непонятно - это неточности/ошибки/недоделки или что. Quote Share this post Link to post Share on other sites More sharing options...
IgorKossak 1 March 14, 2012 Posted March 14, 2012 · Report post Да, я не обратил внимания на предысторию вопроса. Вот мне и непонятно - это неточности/ошибки/недоделки или что. Скорее всего - всё вместе. Когда у меня встала задача переносить проект на четвёртую версию, то я просто сделал рефакторинг имён по всему проекту (благо в Eclipse это просто, заняло несколько минут) и не заморачивался с OBSOLETE_NAMES. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 14, 2012 Posted March 14, 2012 · Report post Скорее всего - всё вместе. +ещё мое слабое знание scmrtos. Когда у меня встала задача переносить проект на четвёртую версию, то я просто сделал рефакторинг имён по всему проекту (благо в Eclipse это просто, заняло несколько минут) и не заморачивался с OBSOLETE_NAMES. Рефакторинг - тоже вариант. Но я лучше с OBSOLETE_NAMES помучаюсь. Спасибо. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 186 March 14, 2012 Posted March 14, 2012 · Report post Вот мне и непонятно - это неточности/ошибки/недоделки или что.Это так и задумано. Там, где возможно - старые места определены. К сожалению, определение имен Exec потребовало бы щедро усыпать код различными #ifdef. Поэтому было принято решение возложить на пользователя обязанность переименовать в своем коде Exec в exec. Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 14, 2012 Posted March 14, 2012 · Report post Это так и задумано. Там, где возможно - старые места определены. К сожалению, определение имен Exec потребовало бы щедро усыпать код различными #ifdef. Ясно. Спасибо. Буду менять E на е. Поэтому было принято решение возложить на пользователя обязанность переименовать в своем коде Exec в exec. А об этом где-то написано? Может есть кaкой-то Migration tutorial? Quote Share this post Link to post Share on other sites More sharing options...
ReAl 0 March 15, 2012 Posted March 15, 2012 · Report post Пока полз до компьютера, объяснение уже дал Сергей. Более развёрнуто: Режим совместимости включает генерацию 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: Quote Share this post Link to post Share on other sites More sharing options...
ReAl 0 March 15, 2012 Posted March 15, 2012 · Report post p.s. примеры AVR переехали каталогом ниже http://scmrtos.svn.sourceforge.net/viewvc/...s/AVR/GCC/MEGA/ Quote Share this post Link to post Share on other sites More sharing options...
Артём__ 1 March 15, 2012 Posted March 15, 2012 · Report post Пока полз до компьютера, объяснение уже дал Сергей. Более развёрнуто: Режим совместимости включает генерацию inline-функций-переходников в две стороны: Со старых имён функций классов ОС на новые — чтобы пользовательский код мог продолжать вызывать, например, .Wait() С новых имён задаваемых пользователем функций (хуки, тот же raise_context_switch()) на старые — чтобы ОС увидела эти функции в старых текстах. Благодаря переходникам работают и старые, и новые имена, можно потихоньку редактироввть текст и после каждого изменения все будет собираться. В случае с exec() добавлением inline-переходника не обойтись, нужно «честное имя» (адрес). В итоге два варианта - ifdef-ить эти места в ОС либо пользователю отредактировать эти имена. Решили остановиться на втором — этих Exec() немного в каждом проекте и автору точно известно где их искать. Понятно. Спасибо. P.S. Примеры для Мега АВР переехали в папку ../MEGA и в описании примеров появился комментарий: "samples for all non-xmega". К чему бы это? Скоро появится папка /xmega. Или нет? Quote Share this post Link to post Share on other sites More sharing options...
demitar 0 April 3, 2012 Posted April 3, 2012 · Report post Добрый день! Осваиваю потихоньку scmRTOS порт для М3, одолевает праздное любопытство: почему класс TCritSect вынесен из пространства имен OS? Вроде бы как единообразие нарушается при его использовании, всегда хочется по аналогии с OS::TEventFlag ef; написать OS::TCritSect cs; или тут была какая-то задумка изначально? Quote Share this post Link to post Share on other sites More sharing options...
dxp 213 April 3, 2012 Posted April 3, 2012 · Report post или тут была какая-то задумка изначально? Хороший вопрос. :) Наверное потому, что он сам по себе несёт самостоятельную нагрузку, не "завязываясь" на потроха ОС. Такую штуку можно (и полезно) использовать и без всяких вытесняющих осей в случаях, когда возможен асинхронный доступ к глобальным объектам (например, из основной программы и из прерывания). Quote Share this post Link to post Share on other sites More sharing options...