|
|
  |
scmRTOS. Вопросы и ответы. |
|
|
|
Oct 9 2007, 04:41
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Сергей Борщ @ Oct 8 2007, 17:27)  Какой камень? Что-то я сегодня туго соображаю. Ну допустим //------------------------------------------------- class TTimer : public OS::TEventFlag { int Delay; int Setting; public: TTimer(x) { Setting=x;Delay=x;}; void Run(void) { if(--!Delay) {Delay=Setting; FL.Signal();};}; }; TTimer Tim100(100); Все нормально, но мы откажемся от возможности начальной инициализации TEventFlag (только по умолчанию). Но это не страшно. Цитата(Сергей Борщ @ Oct 8 2007, 17:27)  Это только кусочек функции, которая возвращает количество принятых байт в пакете или 0 если прием не сложился. Этим куском я хотел продемонстрировать вычисление оставшегося тайм-аута и обход упомянутых в предыдущем сообщении "граблей" Понятно. Я почему-то подумал про for процесса. PS. Я вчера тоже под конец дня зациклился.
|
|
|
|
|
Oct 9 2007, 10:24
|

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

|
Цитата(alexander55 @ Oct 9 2007, 07:41)  class TTimer : public OS::TEventFlag Вчера был явно день торможения, хотя у меня, например, выходные прошли без возлияний  : Код class TTimer { int Delay; int Setting; OS::TEventFlag Flag; public: TTimer(x) : Flag(OS::TEventFlag::efOff) { Setting=x;Delay=x;} void Run(void) { if(--!Delay) {Delay=Setting; Flag.Signal();}} bool Wait() { return Flag.Wait(); } };
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 9 2007, 12:47
|

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

|
Цитата(Сергей Борщ @ Oct 9 2007, 17:24)  Вчера был явно день торможения, хотя у меня, например, выходные прошли без возлияний  : Код class TTimer { int Delay; int Setting; OS::TEventFlag Flag; public: TTimer(x) : Flag(OS::TEventFlag::efOff) { Setting=x;Delay=x;} void Run(void) { if(--!Delay) {Delay=Setting; Flag.Signal();}} bool Wait() { return Flag.Wait(); } }; Мущщины, я в упор не понимаю, почему вы используете для генерации задержек флаг события, а не специально существующую для этого функцию Sleep. Ведь она легче и быстрее, а флаг тянет за собой дополнительную функциональность, которая здесь не используется. Оверхед и загромождение кода.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 9 2007, 13:05
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(dxp @ Oct 9 2007, 16:47)  Мущщины, я в упор не понимаю, почему вы используете для генерации задержек флаг события, а не специально существующую для этого функцию Sleep. Ведь она легче и быстрее, а флаг тянет за собой дополнительную функциональность, которая здесь не используется. Оверхед и загромождение кода. Вопрос стал о точном среднем выдерживании по времени процессных задач (ради чистого искусства). PS. Предложение. Давайте обсудим какую-нибудь полезную тему типа "Обмен ModBus пакетами средствами scmRTOS". Я знаю, у Сергея есть наработки, у меня тоже кое-что есть.
|
|
|
|
|
Oct 9 2007, 14:24
|

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

|
Цитата(alexander55 @ Oct 9 2007, 16:05)  Я знаю, у Сергея есть наработки, у меня тоже кое-что есть. Нету. С MODBUS никогда не работал. Цитата(dxp @ Oct 9 2007, 15:47)  Мущщины, я в упор не понимаю, почему вы используете для генерации задержек флаг события, а не специально существующую для этого функцию Sleep. Мы всех окончательно запутали  Я в последних сообщениях обсуждал возможность использовать какой-либо сервис как члена какого-либо объекта. А против Sleep() не возражал, только отметил, что для периодического выполнения какого-либо куска время задержки надо бы рассчитывать, чтобы вычесть из него собственно время выполнения самого полезного кода.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 10 2007, 04:27
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Сергей Борщ @ Oct 9 2007, 18:24)  Нету. С MODBUS никогда не работал. Хорошо, тогда предлагаемая тема для обсуждения "Обмен пакетами по RS485 с помощью средств scmRTOS". Цитата(dxp @ Oct 10 2007, 07:57)  Ну, и пожалуйста - заверните Sleep в свой объект TTimer, внутри которого будут вычисляться точные значения аргумента Sleep, и все. Флаг события-то тут зачем? Идея ясна.
|
|
|
|
|
Oct 11 2007, 05:52
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(alexander55 @ Oct 10 2007, 08:27)  Хорошо, тогда предлагаемая тема для обсуждения "Обмен пакетами по RS485 с помощью средств scmRTOS". Я так понял, что молчание - знак согласия. Ну тогда поехали. Вопросы для обсуждения (хочется применительно к LPC). Выскажу свое видение вопроса. 1. Приоритет прерывания по приему символов . Для определенности. Выше системного таймера, но ниже, чем готовность данных ADC. 2. Для обработки принятого пакета - формирования пакета ответа - передачи подготовленного пакета организуется свой процесс (назовем процессом на передачу). 2.1. Запуск процесса на передачу для master. - запуск процесса осуществляется по таймеру временных интервалов (пакет запроса с передачей); - запуск процесса от органов управления (с передачей); - обработка принятых данных от slave (без передачи). 2.2. Запуск процесса на передачу для slave. - по истечению таймаута на отсутствие принятых символов (с передачей или без нее); - по каким-то явным признакам прошедшего или сбойного пакета запроса (с передачей или без нее). 3. Прерывание по приему символов осуществляет запись в приемный буфер, с которым и производится работа в процессе на передачу. Думаю, вопросов для начала обсуждения пока достаточно.
|
|
|
|
|
Nov 9 2007, 16:15
|

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

|
"UP" Цитата(dxp @ Oct 10 2007, 05:57)  Ну, и пожалуйста - заверните Sleep в свой объект TTimer, внутри которого будут вычисляться точные значения аргумента Sleep, и все. Флаг события-то тут зачем? +1 Более того - если от момента, когда время Sleep для данного процесса истекло (его занесли в готовые), до того, как он реально получит управление, проходит меньше времени одного системного тика - то вообще ничего не надо. В среднем будет всё нормально. Конечно - если процесс по приоритету где-то внизу и старшие вечно толпятся - то будет проскакивать. Тогда действительно обернуть в класс с поведением "типа OCR += PERIOD". А если задержки до "всплытия" процесса могут быть такими большими, что оставшееся время может оказаться равно 0 - то оно и "отрицательным" может оказаться, тут уж переход к TEventFlag тоже ничего не даст.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 8 2007, 14:37
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Привет всем! решил поиграться с scmRTOS. Скачал исходники версии 3.0. Скомпилил - НО то ли день не мой, то ли дело не в бобине... Компилятор IAR 4.30A/W32 [Evaluation] (4.30.1.3). Попробовал поэмулировать ОС с примером из папки [3-Channel] в AVRStudio 4.12 SP2. В конфиге scmRTOS_config.h установил Код #define scmRTOS_CONTEXT_SWITCH_SCHEME 0 После запуска симулятор выдает предупреждение Цитата AVR Simulator: Invalid opcode 0xffff at address 0x00ffff Это возникает после выхода из процедуры OS_Start(sp) Где грабли, не пойму. Просвятите, плиз. Сенькс.
--------------------
|
|
|
|
|
Dec 8 2007, 15:44
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(dxp @ Dec 8 2007, 22:29)  А разве оно должно выходить из этой функции? Оно в нее заходит и далее запускаются все процессы, никакого выхода быть не должно. Посмотрите код этой функции, он очень простой и короткий. Расскажу по порядку, что у меня происходит: 1. выполняется конструктор OS::Kernel 2. выполянется конструктор OS::PrioMaskTable 3. выполняются последовательно кострукторы 3-х процессов 4. вызывается OS::Run() 5. в OS::Run() вызывается OS_Start(sp) 6. Попадаем в OS_Target_asm.s90 на метку OS_Start: 7. Далее переход на метку L_RestoreContext: 8. После команды RET симулятор вываливает Код AVR Simulator: Invalid opcode 0xffff at address 0x00ffff
--------------------
|
|
|
|
|
Dec 8 2007, 20:12
|

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

|
Цитата(prottoss @ Dec 9 2007, 00:06)  В файле OS_Target_asm.s90 есть макросы #if HAS_RAMPZ == 1 ... #endif - так вот, они почемуто не хотятЪ работать:-( Сделал в данном файле принудительно #define HAS_RAMPZ 1 - все заработало... Я в тонкостях компиляторов не сильно силен, как победить баг? Макрос HAS_RAMPZ генерируется компилятором из заданного процессора. Но это компилятором. А ассемблер, насколько помню, не поддерживает задание конкретного типа процессора, там все опции целевого процессора надо задавать через -v и -m опции. Соответственно, означенный макрос ассемблер не генерирует, поэтому его надо задавать руками. Удобно сделать это через опции проекта, а не править исходник. Если сборка идет из командной строки (makefile etc), то задать макрос через ключ командной строки -D, если из оболочки, что в опциях проекта, в разделе асма, во вкладке define указать макрос.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|