Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 03.04.2009, 10:49   #26
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Разработал первую программу (MPLAB 8.30 , HT-PICC STD 9.60 PL3, PIC16F676)
и при компиляции получаю сообщение:
Error [269] C:\OSA\OSA.h; 343.18 inconsistent type
и указывает на
typedef unsigned char __osa_uint8;
typedef unsigned int __osa_uint16;
typedef unsigned long __osa_uint32;
(osa.h 02.04.2009)
И еще не нашел где задается размер OS_Delay();

По умолчанию все таймеры 2 байта, но при задании OS_Delay(2500) выдается:
Warning [361] D:\TeplOSA\TeplOSA.c; 191.3 function declared implicit int
Заменил статическим таймером все нормально.
Picvan вне форума   Ответить с цитированием
Старый 03.04.2009, 10:54   #27
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Там очень много написано, но у меня-то как раз в прерывании.
Picvan вне форума   Ответить с цитированием
Старый 03.04.2009, 11:32   #28
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Разработал первую программу (MPLAB 8.30 , HT-PICC STD 9.60 PL3, PIC16F676)
и при компиляции получаю сообщение:
Error [269] C:\OSA\OSA.h; 343.18 inconsistent type
Такое ощущение, что у тебя в osacfg.h где-то не хватает ';'.

Цитата:
И еще не нашел где задается размер OS_Delay();
Размерность = OS_TTIMER_SIZE, т.к. OS_Delay оперирует с таймерми задач.

Цитата:
По умолчанию все таймеры 2 байта, но при задании OS_Delay(2500) выдается:
Warning [361] D:\TeplOSA\TeplOSA.c; 191.3 function declared implicit int
Для того, чтобы пользоваться сервисом OS_Delay, нужно определить в файле конфигурации константу OS_ENABLE_TTIMERS (это включит возможность использования таймеров задач). А чтобы не париться с определениями вручную, пользуйся утилитой OSAcfg_Tool.


Цитата:
Там очень много написано, но у меня-то как раз в прерывании.
Дело не в прерывании, а в том, что WDT нельзя сбрасывать втупую, без проверок (толк-то от него тогда какой?). По ссылке это и написано.
tester вне форума   Ответить с цитированием
Старый 03.04.2009, 17:10   #29
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от tester Посмотреть сообщение
Такое ощущение, что у тебя в osacfg.h где-то не хватает ';'.
Спасибо, нашел.


Размерность = OS_TTIMER_SIZE, т.к. OS_Delay оперирует с таймерми задач.

Буду знать.

Для того, чтобы пользоваться сервисом OS_Delay, нужно определить в файле конфигурации константу OS_ENABLE_TTIMERS (это включит возможность использования таймеров задач). А чтобы не париться с определениями вручную, пользуйся утилитой OSAcfg_Tool.

Пытался, но с первого раза не разобрался.

Дело не в прерывании, а в том, что WDT нельзя сбрасывать втупую, без проверок (толк-то от него тогда какой?). По ссылке это и написано.
Постараюсь понять. В моей простой программе и с ограниченными ресурсами PICa это оказалось единственным местом где можно сбросить
WDT.
Picvan вне форума   Ответить с цитированием
Старый 03.04.2009, 17:16   #30
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Постараюсь понять. В моей простой программе и с ограниченными ресурсами PICa это оказалось единственным местом где можно сбросить
WDT.
Если сброс WDT не был предусмотрен на этапе проектирования, то добавить его в готовую программу по-умному будет очень сложно. Сделай хотя бы по минимуму: в критических местах программы устанавливай биты (типа, все в порядке), а в прерывании сбрасывай WDT если все нужные биты установлены (после сброса WDT все биты опять обнуляются). Но повторюсь: на готовую программу вешать даже такой простой механизм будет довольно трудно.
tester вне форума   Ответить с цитированием
Старый 03.04.2009, 18:33   #31
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Взялся за третьй пример с задержками.
Не понял на сколько эта задержка OS_Delay(100); 100 тактов ? В симуляторе попробывал у меня первое окончание задержки через 20 мс,мож где то что то пропустил в описании.Выше был код где OS_Timer(); вызывался в прерывании,может так можно точно задать тик OS_Timer(); .
Код:
//#include <pic.h>
#include <OSA.h>

unsigned char counter=0;

//------------------------------------------------------------------------------
void Task_T1 (void)
{
    for (;;)
    {
        OS_Delay(100);
        OS_Bsem_Set(0);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait(2);
    }
}


//------------------------------------------------------------------------------
void Task_T2 (void)
{
    for (;;)
    {
        OS_Delay(100);
        OS_Bsem_Set(1);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait_TO(0, 100);
    }
}


//------------------------------------------------------------------------------
void Task_T3 (void)
{
    for (;;)
    {

        OS_Delay(100);
        OS_Bsem_Set(2);
        counter++;
        OS_Yield();
        counter++;
        OS_Bsem_Wait_TO(1, 100);

    }
}


//------------------------------------------------------------------------------
void main (void)
{
    OS_Init();
    OS_Task_Create(1, Task_T1);
    OS_Task_Create(1, Task_T2);
    OS_Task_Create(1, Task_T3);


    for (;;)
    {
        //asm(" CLRWDT ");
        OS_Timer();
        OS_Sched();
    }
}
Миниатюры
32455.JPG  

Последний раз редактировалось CERGEI1982; 03.04.2009 в 18:53.
CERGEI1982 вне форума   Ответить с цитированием
Старый 03.04.2009, 18:48   #32
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Взялся за третьй пример с задержками.
Не понял на сколько эта задержка OS_Delay(100); 100 тактов ? В симуляторе попробывал у меня первое окончание задержки через 20 мс,мож где то что то пропустил в описании.
http://wiki.pic24.ru/doku.php/osa/re...vices/os_delay

OS_Timer() для простоты вызывается в одном цикле с OS_Sched(), т.е. не привязан к конкретномум времени. В рейльных программах такое вряд ли может встретиться.

Сделай так:
Код:
    OPTION = 0x01;    // prs = 4,  TMR0 period = 1024 cycles ~ 1ms для 4MHz
    for (;;)
    {
        OS_Sched();
        if (T0IF)
        {
            T0IF = 0;
            OS_Timer();
        }
    }
И будет задержка задаваться в миллисекундах.
tester вне форума   Ответить с цитированием
Старый 04.04.2009, 09:19   #33
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

У меня TMR0 на системных тиках 1мсек и у WDT период 18мсек. А в программе есть задержки в 750мсек. Обычно я задаю WDT максимальный период. По моему мнению
WDT это самый крайний случай, а все проверки программы на устойчивость должны проводиться в критических местах без оглядки на WDT. Для устойчиво работающей системы WDT не существует.
Picvan вне форума   Ответить с цитированием
Старый 04.04.2009, 11:41   #34
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Для устойчиво работающей системы WDT не существует.
нет устойчиво работающих систем
есть системы, работа которых удовлетворительна при определенных условиях
если условия меняются (а они редко меняются в лучшую сторону), тогда WDT может и поможет, как последнее средство
vitalka вне форума   Ответить с цитированием
Старый 04.04.2009, 11:56   #35
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
У меня TMR0 на системных тиках 1мсек и у WDT период 18мсек. А в программе есть задержки в 750мсек.
Надо вводить дополнительную логику. Но сбрасывать WDT безусловно нет смысла. Представь, что какий-то бит в TRIS-регистре изменил свое состояние.

Цитата:
По моему мнению WDT это самый крайний случай, а все проверки программы на устойчивость должны проводиться в критических местах без оглядки на WDT.
Для PIC16 это звучит немного странно. Ты пишешь "проверки на устойчивость ... без оглядки на WDT". А что будет результатом проверки? Вернее, что должна будет предпринять программа, если проверка показала, что есть сбой? Если сбой неустранимый (ты оказался в каком-то месте программы тогда, когда не должен был), то WDT позволит произвести сброс. А как программа поведет себя без WDT?
tester вне форума   Ответить с цитированием
Старый 04.04.2009, 18:06   #36
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

При любой нештатной ситуации программа должна адекватно отреагировать:что-то
выключить, куда-то сообщить и если она не в состоянии это выполнить то вот тут и появляется WDT. У меня нет ни одной программы без WDT.
Извините, но я пока мыслю категориями суперцикла, где сброс WDT всегда будет происходить там где сказано. В РТОС, как я начинаю понимать, все не так однозначно и найти место сброса сложнее.
Picvan вне форума   Ответить с цитированием
Старый 04.04.2009, 18:26   #37
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/99
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Извините, но я пока мыслю категориями суперцикла, где сброс WDT всегда будет происходить там где сказано. В РТОС, как я начинаю понимать, все не так однозначно и найти место сброса сложнее.
Не более чем, надо просто их уметь готовить.
DL36 вне форума   Ответить с цитированием
Старый 04.04.2009, 18:35   #38
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
При любой нештатной ситуации программа должна адекватно отреагировать:что-то
выключить, куда-то сообщить и если она не в состоянии это выполнить то вот тут и появляется WDT. У меня нет ни одной программы без WDT.
Извините, но я пока мыслю категориями суперцикла, где сброс WDT всегда будет происходить там где сказано. В РТОС, как я начинаю понимать, все не так однозначно и найти место сброса сложнее.
Да нет, все не так страшно с RTOS. Если у тебя есть своя методика сброса WDT, то ты и ее можешь применить. Вовсе не обязательно WDT оформлять как задачу. При использовании RTOS надо помнить, что она призвана упростить процесс проектирования и написанаия программы, а не заменить собой (или усложнить своим присутствием) какие-то аппаратные модули (в частности WDT).

А все, что я перечислял до этого - это общие рекомендации, им можно и не следовать, если есть какие-то свои убеждения. Просто надо всегда:
1. Задаваться вопросом: как поведет себя программа, если ...?
2. Предполагать, что даже отлаженная и переотлаженная программа может содержать ошибки.
3. Помнить, что любой бит в любом регистре (в том числе и программный счетчик) может изменить свое состояние без ведома CPU (ситуация редкая, но возможная).
4. Сопоставлять затраты от последствий возможного сбоя с затратами на его предотвращение.

Так что, собственно, RTOS тут не при чем.
tester вне форума   Ответить с цитированием
Старый 05.04.2009, 08:04   #39
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Спасибо за рекомендации.
Мне не все ясно с флагами:
1. Из всех примеров я понял, что явного окончания перечисления флагов нет и их обычно ставят перед описаниями функций.
2. У меня в задаче вызывается внешняя функция, внутри которой три более мелких функции. В одной из них происходит установка флагов. Я объявил флаги в основной программе и в заголовочном файле внешней функции ввел
extern OST_FLAG8 T_Flags; (не знаю насколько правильно).
Если я устанавливаю флаг OS_Flag_Set_1 (T_Flags, 0x02); , то компилируется
нормально.
Если же я пытаюсь установить флаг по имени OS_Flag_Set_1 (T_Flags, Flag_1);
то компилятор возмущается:
Error [192] D:\TeplOSA\m_1wireOSA.c; 111.12 undefined identifier "Flag_1"
может где-то еще нужно объявить эти флаги?
В суперцикле я создавал структуру с флагами в отдельном заголовочном файле,
объявлял ее в основной программе и включал этот заголовочный файл в файл внешней функции. Может и здесь нужно поступить также?
3.В каком месте программы можно объявить банк:
bank1 OST_FLAG T_Flags;
Я пробовал в основной программе и получил:
Error [985] D:\TeplOSA\TeplOSA.c; 45.26 qualifiers redeclared
при этом указатель встает на несколько строчек выше строчки с банком.
Picvan вне форума   Ответить с цитированием
Старый 05.04.2009, 11:50   #40
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от Picvan Посмотреть сообщение
Мне не все ясно с флагами:
1. Из всех примеров я понял, что явного окончания перечисления флагов нет и их обычно ставят перед описаниями функций.
Не совсем понял, что такое "явное окончание перечисления"...

Цитата:
2. У меня в задаче вызывается внешняя функция, внутри которой три более мелких функции. В одной из них происходит установка флагов. Я объявил флаги в основной программе и в заголовочном файле внешней функции ввел
extern OST_FLAG8 T_Flags; (не знаю насколько правильно).
Это правильно. А как иначе?

Цитата:
Если я устанавливаю флаг OS_Flag_Set_1 (T_Flags, 0x02); , то компилируется
нормально.
Если же я пытаюсь установить флаг по имени OS_Flag_Set_1 (T_Flags, Flag_1);
то компилятор возмущается:
Error [192] D:\TeplOSA\m_1wireOSA.c; 111.12 undefined identifier "Flag_1"
может где-то еще нужно объявить эти флаги?
Так ругается-то на Flag_1, что идентификатор не объявлен. Он вообще описан? ОБрати внимание на описание сервисов с флагами: там вторым параметром идет маска (не номер флага, а именно маска всех флагов); в качестве маски может выступать переменная, константа, выражение перечислимого типа. Если Flag_1 - это битовое поле в какой-то структуре, то таким способом, как ты написал, обратиться к флагам не получится.

Для справки: OST_FLAG8 = unsigned char

Цитата:
3.В каком месте программы можно объявить банк:
bank1 OST_FLAG T_Flags;
Я пробовал в основной программе и получил:
Error [985] D:\TeplOSA\TeplOSA.c; 45.26 qualifiers redeclared
при этом указатель встает на несколько строчек выше строчки с банком.
Компилятор ругается на то, что переменная в разных местах объявлена по-разному. Поэтому везде, где она описана (и явно и с квалификатором extern) нужно указывать bank1.

А то, что компилятор показыват не в том место - бывает. Я пока точно не уловил, отчего такое происходит. Возможно из-за макросов.
tester вне форума   Ответить с цитированием
Старый 05.04.2009, 13:42   #41
Picvan
Senior Member
 
Регистрация: 21.03.2007
Сообщений: 320
Вес репутации: 186/47
Picvan has a spectacular aura aboutPicvan has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Спасибо прояснилось.
У меня в программе были объявлены три флага и затем шли другие похожие дефайны. Как указать, что это уже не флаги. Семафоры, например, ограничены скобками.
Флаги описаны согласно мануалу Сервисы - Флаги
OST_FLAG8 T_Flags; // 8-разрядные флаги
#define Flag_0 0x01
#define Flag_1 0x02
и я пытался обращаться к ним согласно описания:
OS_Flag_Set_0(F_Sensors, TEMPERATURE_MEASURED ...);
Почему я и описал подробно где находится место установки флагов, потому что во всех примерах работа с флагами ведется в основной программе. В суперцикле мне
пришлось долго провозиться, учитывая что я далеко не "гуру", пока нашел рабочий вариант.
Picvan вне форума   Ответить с цитированием
Старый 12.04.2009, 18:07   #42
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Сел за очередь сообщений,МСС18+Симуляции МПлаб и появилось куча вопросов:
1)как я понял в задаче Task_T1 msg1 это указатель на какое то сообщение и что это сообщение передать его надо создать и сделать присваивание к указателю msg1,чтоб что то передать?
2)В задаче Task_T1 не увидел переключения контекста при выполнении OS_Queue_Send(queue, msg1); ,хотя по описанию OSA должно быть.
3)Посмотрел что очередь задач работает в переменой queue, функция OS_Queue_Send(queue, msg1); туда ложит,но дело в том что от туда никто их не выбирает,даж при выполнении OS_Queue_Wait(queue, msg2); в задаче Task_T1.
4)Как я понял в Task_T2 также принимается указатель на это сообщение и надо создать переменую и разменовать?
Код:
unsigned char data;
data=*msg2;
Вот весь код мой
Код:
#include <p18f242.h>
#include <OSA.h>

unsigned char counter=0;

OST_QUEUE    queue;

OST_MSG buf[5];

void Init(void);
void timer(void);

#pragma code high_vector=0x08
void interrupt (void)
{
  /*
   * Inline assembly that will jump to the ISR.
   */
  _asm GOTO timer _endasm
}

/*
 * Returns the compiler to the default code section.
 */
#pragma code

/*
 * Specifies the function timer_isr as a priority interrupt service
 * routine. This is required in order for the compiler to generate a
 * RETFIE instruction instead of a RETURN instruction for the timer_isr
 * function.
 */
#pragma interrupt timer
void timer(void)
{
    OS_EnterInt();
    if(PIR1bits.TMR1IF)
    {
        TMR1H=0x3C;
        TMR1L=0xb0;
        PIR1bits.TMR1IF=0;
        OS_Timer();
    }
    OS_LeaveInt();
}
//------------------------------------------------------------------------------
void Task_T1 (void)
{
    OST_MSG     msg1;
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Send(queue, msg1);
    }
}


//------------------------------------------------------------------------------
void Task_T2 (void)
{
    OST_MSG     msg2;
    unsigned char data;
    //unsigned short int* pData=&data;
    //data=*msg2;
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Wait(queue, msg2);
    }
}


//------------------------------------------------------------------------------
void Task_T3 (void)
{
    OST_MSG     msg3;
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Wait_TO(queue, msg3, 100);
    }
}


//------------------------------------------------------------------------------
void main (void)
{
    Init();
    OS_Init();
    OS_Task_Create(1, Task_T1);
    OS_Task_Create(1, Task_T2);
    OS_Task_Create(1, Task_T3);

    OS_Queue_Create(queue, buf, 5);

    for (;;)
    {
        //OS_Timer();
        OS_Sched();
    }
}

void Init()
{
    //настройка таймера на прерывание 100 мс
    //
    TMR1H=0x3C;
    TMR1L=0xB0;
    PIR1bits.TMR1IF=0;
    PIE1bits.TMR1IE=1;
    INTCON=0xC0;
    T1CON=0x91;
}
Да и хотел узнать,а будет ли эта ось в будущем под компилятор CCS ? Хотя там есть и своя RTOS

Последний раз редактировалось CERGEI1982; 12.04.2009 в 18:22.
CERGEI1982 вне форума   Ответить с цитированием
Старый 12.04.2009, 18:40   #43
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Вот сам проектик.Находится в архиве rar.
Вложения
Тип файла: pdf TEST4.pdf (26.9 Кб, 17 просмотров)
CERGEI1982 вне форума   Ответить с цитированием
Старый 12.04.2009, 19:35   #44
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Сел за очередь сообщений,МСС18+Симуляции МПлаб и появилось куча вопросов:
1)как я понял в задаче Task_T1 msg1 это указатель на какое то сообщение и что это сообщение передать его надо создать и сделать присваивание к указателю msg1,чтоб что то передать?
Да, именно так. В msg1 должен будет содержаться адрес тела сообщения. Можно передавать и без переменной msg1. Например:
Код:
    char c;
    char p[10];
    OS_Queue_Send(queue, &c);   // Передаем указатель на переменную c
    OS_Queue_Send(queue, p);    // Передаем указатель на массив
Цитата:
2)В задаче Task_T1 не увидел переключения контекста при выполнении OS_Queue_Send(queue, msg1); ,хотя по описанию OSA должно быть.
Переключение контекста произойдет только в том случае, если в очереди нет места.
Цитата:
3)Посмотрел что очередь задач работает в переменой queue, функция OS_Queue_Send(queue, msg1); туда ложит,но дело в том что от туда никто их не выбирает,даж при выполнении OS_Queue_Wait(queue, msg2); в задаче Task_T1.
Чуть позже запущу твой прект, посмотрю, что там не выбирается... OS_Queue_Wait должна доставать сообщение из очереди.
Цитата:
4)Как я понял в Task_T2 также принимается указатель на это сообщение и надо создать переменую и разменовать?
Код:
unsigned char data;
data=*msg2;
Правильно. В некоторых случаях можно работать напрямую через указатель, а в некоторых (когда нет уверенности в том, что во время обработки сообщения обасть памяти, где оно находится, не будет модифицированно).
Цитата:
Да и хотел узнать,а будет ли эта ось в будущем под компилятор CCS ? Хотя там есть и своя RTOS
Будет. Уже долго над этим работаю, меня сильно тормозит мое незнание этого компилятора.
tester вне форума   Ответить с цитированием
Старый 12.04.2009, 19:43   #45
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Проверил по 3-му вопросу: сообщение изымается как положено. Указатель из буфера копируется в переменную msg2 (в задаче Task2). Переменая queue.Q.cBegin увеличивается на 1, а queue.Q.cFilled уменьшается на 1. Сам массив buf при этом остается неизменным.
tester вне форума   Ответить с цитированием
Старый 12.04.2009, 20:50   #46
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от tester Посмотреть сообщение
Проверил по 3-му вопросу: сообщение изымается как положено. Указатель из буфера копируется в переменную msg2 (в задаче Task2). Переменая queue.Q.cBegin увеличивается на 1, а queue.Q.cFilled уменьшается на 1. Сам массив buf при этом остается неизменным.
Спасиб,позже сам покапаюсь мож сам что напутал.
Да ище немножко заметил что msg1,msg2,msg3 имеют один и тот же адрес в памяти,это наверно верх стека сообщений,завтра проверю все свои предположения.
CERGEI1982 вне форума   Ответить с цитированием
Старый 14.04.2009, 15:41   #47
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

Добавил строчку для извлечения из под указателя data=*msg2; чтоб посмотреть что получила задача,да и вбудущем хочу посмотреть что и как приходит реально,меняя сообщения из Task_T1,но вот не задача указатель раизменовать таким способом не могу,пишет:
C:\MOI PROEKT\PIC18FXXX\test_OSA\TEST4\test4_osa.c:75:Err or [1201] cannot dereference a pointer to 'void' type
C:\MOI PROEKT\PIC18FXXX\test_OSA\TEST4\test4_osa.c:75:Err or [1131] type mismatch in assignment

Что то с типом указатель который имеет тип void
Вот сам код второй задачи:
Код:
void Task_T2 (void)
{
    OST_MSG     msg2;
    unsigned char data;
    //unsigned short int* pData=&data;
    
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Wait(queue, msg2);
        data=*msg2;
    }
}
CERGEI1982 вне форума   Ответить с цитированием
Старый 14.04.2009, 16:02   #48
CERGEI1982
Senior Member
 
Регистрация: 02.03.2007
Возраст: 36
Сообщений: 345
Вес репутации: 151/48
CERGEI1982 has a spectacular aura aboutCERGEI1982 has a spectacular aura about
По умолчанию Re: Вопросы по OSA

С указателем разобрался,добавил строчку #define OS_MSG_TYPE const char * в файл OSAcfg.h.
Решил сделать такой ход для проверки работы сообщений,сделал глобальный массив unsigned char mas[5]; и модифицировал первую и вторую задачу:
Код:
void Task_T1 (void)
{
    OST_MSG     msg1;
    char c=40;
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Send(queue,&c);
        c++;
    }
}


//------------------------------------------------------------------------------
void Task_T2 (void)
{
    OST_MSG     msg2;
    unsigned char data;
    static unsigned char count=0;
    //unsigned short int* pData=&data;
    for (;;)
    {
        counter++;
        OS_Yield();
        counter++;
        OS_Queue_Wait(queue, msg2);
        data=*msg2;
        mas[count++]=data;
    }
}
Почему когда первый раз попадаю на строчку mas[count++]=data; то в data=0x9d с не с того ни с чего(где то в задачи №3 обновляется то что лежит по адресу 0х203)
Миниатюры
osa1.JPG  

Последний раз редактировалось CERGEI1982; 14.04.2009 в 16:12.
CERGEI1982 вне форума   Ответить с цитированием
Старый 14.04.2009, 16:10   #49
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
Добавил строчку для извлечения из под указателя data=*msg2; чтоб посмотреть что получила задача,да и вбудущем хочу посмотреть что и как приходит реально,меняя сообщения из Task_T1,но вот не задача указатель раизменовать таким способом не могу,пишет:
C:\MOI PROEKT\PIC18FXXX\test_OSA\TEST4\test4_osa.c:75:Err or [1201] cannot dereference a pointer to 'void' type
C:\MOI PROEKT\PIC18FXXX\test_OSA\TEST4\test4_osa.c:75:Err or [1131] type mismatch in assignment

Что то с типом указатель который имеет тип void
Вот сам код второй задачи:
Код:
    unsigned char data;
    ...
        OS_Queue_Wait(queue, msg2);
        data=*msg2;
А ты посмотри, что ты делаешь: ты в переменную char пытаешься записать значение типа void, расположенное по адресу, указанному в msg2 (а при отправке в msg1). Кроме того, посмотри, что отправляется задачей Task1: неинициализированный указатель.

Да, и на всякий случай: все, что находится в папке OSA\TEST - это не примеры и не туториал. Это всего лишь тестовые программы для оценки параметров системы: размер кода, скорость работы, сравнение с другими ОСРВ и пр. Это не рабочие примеры. Примеры даны отдельно в разделе примеры: http://wiki.pic24.ru/doku.php/osa/ref/intro
tester вне форума   Ответить с цитированием
Старый 14.04.2009, 16:12   #50
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 41
Сообщений: 3,577
Вес репутации: 4386/122
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Вопросы по OSA

Цитата:
Сообщение от CERGEI1982 Посмотреть сообщение
С указателем разобрался,добавил строчку #define OS_MSG_TYPE const char * в файл OSAcfg.h.
Это правильно.

По твоему примеру:
Сразу бросилась в глаза ошибка: переменная c из задачи Task1 не объявлена как static. А через очередь передается указатель на нее. Переменные, значения которых должно быть сохранено после передачи управления планировщику должны быть объявлены как static, иначе их значение затрется локальными переменными других задач (обрати внимание, что msg1, msg2 и msg3 располагаются по одному адресу, потому что они локальные). Похоже, что по адресу 203 расположена как раз переменная c, запись в нее перетирает локальную переменную data.

Последний раз редактировалось tester; 14.04.2009 в 16:20.
tester вне форума   Ответить с цитированием
Ответ

Метки
osa, rtos, сторожевой таймер


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Все вопросы по MikroC shnitz Инструментарий 971 23.09.2016 13:22
Статья по RTOS OSA tester Продукция MICROCHIP 12 24.02.2009 12:04
16F690, вопросы по timer1 и встроенному 32кГц-генератору e_glu Продукция MICROCHIP 3 29.01.2009 17:14
Есть вопросы по алгоритму работы устройства на пике. 40grad Продукция MICROCHIP 9 27.10.2007 15:55
Пишу руководство по RS485 и есть вопросы pvl2000 Cетевые протоколы и технологии 2 16.04.2007 00:57


Часовой пояс GMT +3, время: 21:42.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot