Столкнулся с проблемой зависания процесса, который занимается аналоговыми измерениями. Всего в системе 4 процесса, приоритеты распределены следующим образом
Код
#define ANMEAS_PRI (OS::pr1) /* Аналоговые измерения */
#define UART0_PRI (OS::pr0) /* Работа с UART */
#define TECHNO_PRI (OS::pr3) /* Технология (логика работы программы) */
#define PERIPH_PRI (OS::pr2) /* Работа с периферийными устройствами */
#define UART0_PRI (OS::pr0) /* Работа с UART */
#define TECHNO_PRI (OS::pr3) /* Технология (логика работы программы) */
#define PERIPH_PRI (OS::pr2) /* Работа с периферийными устройствами */
Если я меняю значение приоритета ANMEAS_PRI на максимальный (с OS::pri1 на OS::pri0) то зависания пропадают. Проблема в том что я не могу разобраться почему в одном случае оно работает, а в другом - нет.
Исходный код доступен здесь.
Для поиска неисправностей, я написал небольшой макрос (SET_INFO(x)), который посылает в UART текущий номер, все вызовы макроса расположены в порядке возрастания порядкового номера. Модифицированный вариант исходника лежит здесь.
Таким образом установил, что после зависания процесса, в UART отправляется число 26
Код
104 }
105 SET_INFO(26);
106
107 Sleep(5,5);// 11 mc
108 SET_INFO(27);
109 LED_Out_Str[24] = GREEN_LAMP;
110 SET_INFO(28);
Т.е. прямо перед вызовом функции Sleep(). Далее я перегрузил функцию Sleep() (чтоб вызывалась конкретная функция только для одного процесса), и модифицировал по описанной выше методике, получилось такое105 SET_INFO(26);
106
107 Sleep(5,5);// 11 mc
108 SET_INFO(27);
109 LED_Out_Str[24] = GREEN_LAMP;
110 SET_INFO(28);
Код
void TBaseProcess::Sleep(TTimeout timeout, uint8_t huita)
{
{
TCritSect cs;
SET_INFO(30);
Kernel.ProcessTable[Kernel.CurProcPriority]->Timeout = timeout;
SET_INFO(31);
Kernel.SetProcessUnready(Kernel.CurProcPriority);
SET_INFO(32);
Kernel.Scheduler();
SET_INFO(33);
}
SET_INFO(34);
}
Теперь последнее отправляемое число в UART 32, т.е. прямо перед вызовом Kernel.Scheduler(). Дальше лезть страшно.{
{
TCritSect cs;
SET_INFO(30);
Kernel.ProcessTable[Kernel.CurProcPriority]->Timeout = timeout;
SET_INFO(31);
Kernel.SetProcessUnready(Kernel.CurProcPriority);
SET_INFO(32);
Kernel.Scheduler();
SET_INFO(33);
}
SET_INFO(34);
}
В чем может возникать проблема что при смене приоритетов процесс наглухо зависает? Может есть какие-то рекомендации, чего делать не стоит или у меня какие-то существенные ошибки в описании процесса?
Заранее Спасибо!:))
P.S. Версия scmRTOS 3.10, компилятор avr-gcc (4.3.3)