Заметил при использовании channel непонятный момент(в порте под AVR этого не наблюдаю).
У меня есть следующий код
Код
OS::channel<char,200> bufCam;
template<>
OS_PROCESS void TProc2::Exec()
{
while(1)
{
Sleep(100); //Если слип убрать, то система вешается. Но у этого процесса приоритет ниже. Почему первый
процесс не может забрать управление??
}
}
template<>
OS_PROCESS void TProc1::Exec()
{
MyUart.setChanel(3);
char buf;
while(1)
{
MyUart.sendByte(bufCam.get_count());
Sleep(500);
}
}
extern "C" void IRQ_Switch()
{
char b;
dword irq = IRQSIG;
irq &= IRQSTA;
if(irq & RTOS_TIMER_BIT)
{
OS::SystemTimer_ISR();
}
else if (irq & UART_BIT)
{
b=COMRX;
bufCam.push(b);
}
}
Отсылаю разные по длине посылки. Размер их отображается верно.
Вопрос 1: Почему если из TProc2 убрать слип система зависает? У TProc1 приоритет выше и он должен забирать управление в любом случае. Ведь в процессе заглушка нет слипа и система работает.
Меняю код в TProc1
Код
template<>
OS_PROCESS void TProc1::Exec()
{
MyUart.setChanel(3);
char buf;
while(1)
{
bufCam.pop(buf);
MyUart.sendByte(buf);
}
}
Если отправляю по одному байту, то отклика нет.
Если отправляю посылку, то возвращается только последний байт. Т.е. отправил "123" вернется "3".
Меня код снова
Код
template<>
OS_PROCESS void TProc1::Exec()
{
MyUart.setChanel(3);
char buf;
while(1)
{
bufCam.pop(buf,100);
MyUart.sendByte(buf);
}
}
На выходе вижу равномерно идущие нули. Отправляю один байт, система подвисает и дальше снова начинают идти нули.
Иду дальше
Код
template<>
OS_PROCESS void TProc1::Exec()
{
MyUart.setChanel(3);
char buf;
while(1)
{
bufCam.pop(buf,100);
MyUart.sendByte(bufCam.get_count());
}
}
Отправляю посылку. В теории я должен видеть число которое постоянно уменьшается на единицу. В реальности вижу только 0.
Пробовал сделать так
struct TData
{
char a;
};
OS::channel<TData,200> bufCam;
Результат такой же.
ЗЫ:
Так же нужно подредактировать файл pin_macros.h . В нем есть опечатка. Он выглядит так.
Код
#define PM_PINL(port,bit,dummy) (!(GP##port##DAT & (1 << (bit))))
#define PM_PINH(port,bit,dummy) (!PM_PINH(port,bit,dummy))
Но должно быть так?
Код
#define PM_PINL(port,bit,dummy) (!(GP##port##DAT & (1 << (bit))))
#define PM_PINH(port,bit,dummy) (!PM_PINL(port,bit,dummy))
Иначе не компилится.