реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Зависает контроллер при работе с Ethernet
ZAA
сообщение Nov 13 2008, 04:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Проблема в следующем. В основе - FreeRTOS 5.0.2. Контроллер AT91SAM7x256. В программе 2 задачи - Modbus (написана собственноручно), в которой идет опрос датчиков. и UIP (за основу взят стандартный сервер FreeRTOS). Есть флэш-ролик, который запускается из стандартного браузера или Flash-playerа. Ролик по ethernet посылает запросы (аналогичные стандартным фриртосовским - только вместо страниц index.shtml, io.shtml, tcp.shtml и т д - приходит запросы 172.210.10.25/123.txt?0*, 172.210.10.25/123.txt?1*, 172.210.10.25/123.txt?2* и т д, где ?0*, ?1*, ?2*). В ответ (после сравнения полученного s->filename) контроллер посылает строку s->file.data с длиной s->file.len. В стандартном сервере строки s->file.data константы, а в моей программе длина строки каждый раз разная в зависимости от пришедшего запроса. Пытаюсь выделять память для строки pvPortMalloc'ом, а потом удалять указатель, но контроллер после нескольких десятков-сотен запросов зависает.

понимаю. что на первый взгляд сложно определить причину проблемы, но все же жду от вас советов и помощи. Спасибо.
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 13 2008, 07:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Удалять указатель - через pvPortFree или delete()/free() ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 13 2008, 07:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ Nov 13 2008, 07:54) *
Пытаюсь выделять память для строки pvPortMalloc'ом, а потом удалять указатель, но контроллер после нескольких десятков-сотен запросов зависает.

Зависает, или падает в Abort? Во втором случае найти причину будет гораздо проще.
Начните с проверки выделения памяти, проверьте, нет ли утечки.
Go to the top of the page
 
+Quote Post
KonstantinT
сообщение Nov 13 2008, 08:32
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 29
Регистрация: 3-11-04
Пользователь №: 1 027



Если уходит в аборт , по по lr узнайте из какой точки программы вылетает, по состоянию регистров можно понять (неправильный указатель чаще всего).
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 13 2008, 09:37
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(KonstantinT @ Nov 13 2008, 11:32) *
Если уходит в аборт , по по lr узнайте из какой точки программы вылетает, по состоянию регистров можно понять (неправильный указатель чаще всего).

К сожалению работаю без отладчика, поэтому никак не могу посмотреть состояние регистров...
Еще добавлю - подозреваю, что проблема может быть и в этом. У меня осуществляется обмен данными между потоками. Для этого я использую Mutex. Для доступа к общим данным использую следующую структуру:
Например в потоке modbus
if (xSemaphore != NULL)
{
if (xSemaphoreTake(.....) != NULL)
{
buffer1 = vTableSensorConfigure.xSensorConfigureStruct[index1]->Sensor_Value_Float;
buffer2 = vTableSensorConfigure.xSensorConfigureStruct[index1]->Sensor_Error;
xSemaphoreGive(xSemaphore);
}
} //Далее оперирую с локальными переменными buffer1 и buffer2
В потоке uip
if (xSemaphore != NULL)
{
if (xSemaphoreTake(.....) != NULL)
{
var1 = vTableSensorConfigure.xSensorConfigureStruct[index1]->Sensor_Value_Float;
var2 = vTableSensorConfigure.xSensorConfigureStruct[index1]->Sensor_Error;
xSemaphoreGive(xSemaphore);
}
}

Приоритеты и величины стеков у обоих потоков одинаковые...

Цитата(aaarrr @ Nov 13 2008, 10:39) *
Зависает, или падает в Abort? Во втором случае найти причину будет гораздо проще.
Начните с проверки выделения памяти, проверьте, нет ли утечки.

Подскажите плз несведующему, как можно эту самую утечку проверить...или ссылочку на тему в форуме, где есть unsure.gif Спасибо
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 13 2008, 09:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ Nov 13 2008, 12:37) *
К сожалению работаю без отладчика, поэтому никак не могу посмотреть состояние регистров...

Для этого не обязательно пользоваться отладчиком. Разместите переходы на asm-обертки на векторах DataAbort и PrefetchAbort, а содержимое регистров выведите через UART, например.

Цитата(ZAA @ Nov 13 2008, 12:37) *
Подскажите плз несведующему, как можно эту самую утечку проверить...или ссылочку на тему в форуме, где есть unsure.gif Спасибо

Просто проверьте, не сползает ли постепенно адрес при вызове malloc.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 13 2008, 10:03
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



А еще во FreeRTOS'е существует три метода работы с heap'ом. Один из них не подразумевает освобождение памяти.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 13 2008, 11:06
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



При выводе страниц делайте на странице что-то в стиле

void * test = pvPortMalloc(16);
вывод значения (int)test ..
pvPortFree(16);

Если при нескольких обращения этот адрес будет изменяться - где-то утечка.
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 13 2008, 17:39
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(_dem @ Nov 13 2008, 14:06) *
Если при нескольких обращения этот адрес будет изменяться - где-то утечка.

Благодарю))) Завтра поэкспериментирую!!
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 27 2008, 18:45
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(aaarrr @ Nov 13 2008, 12:52) *
Для этого не обязательно пользоваться отладчиком. Разместите переходы на asm-обертки на векторах DataAbort и PrefetchAbort, а содержимое регистров выведите через UART, например.
Просто проверьте, не сползает ли постепенно адрес при вызове malloc.

У меня к вам вопрос возник другого плана. Может ли такая ситуация складываться (зависание) из-за того, что я не пользуюсь очередями??? Расставив кучу точек в программе, я увидела, что контроллер "умирает" неизменно в одном месте - после вызова функции Poll. В ней программа крутится в цикле, пока не сброшен глобальный флаг (он сбрасывается при истекании таймера на ожидание ответа от опрашиваемого, либо при приеме корректного ответа)
Код
char Poll(void)
{
   //В КАКОЙ_ТО МОМЕНТ ПРОГРАММА ПОПАДАЕТ СЮДА И ЗАВИСАЕТ (не заходя в while)
   while ( MYFLAG !=0 )
   {
      switch (MYF)
      {
    case EV_FRAME_RECEIVED:
    Poll1_status = RECEIVE_FRAME (&aa, &number);
    if (Poll1_status == ERR_OK)
    {
        if (byte_regs_received == 0x04)
        {
             *((char*)(&float_value))  =aa[6];     //собираем float из 4-х char
             *((char*)(&float_value)+1)=aa[5];
             *((char*)(&float_value)+2)=aa[4];
             *((char*)(&float_value)+3)=aa[3];
        }
        else if (byte_regs_received == 0x06)
        {
             for (i = 0; i < byte_regs_received; i++)
             {
             key_mass[i] = aa[i+3];
              }
              int_value1 = (unsigned short)(key_mass[0] << 8 | key_mass[1]);
              int_value2 = (unsigned short)(key_mass[2] << 8 | key_mass[3]);
              int_value3 = (unsigned short)(key_mass[4] << 8 | key_mass[5]);
         }
     }
     MYF=EV_EXECUTE;
    break;
    
            case EV_NO_REPLY:
    Poll1_status = ERR_NO_REPLY;
    MYF=EV_EXECUTE;
     break;
    
             case EV_FRAME_SENT:
     MYF=EV_EXECUTE;
     break;
                     
     case EV_EXECUTE:
    break;
    }
     }
        
     return Poll1_status;
}

Без взаимодействия с uipTask, т е без постоянных опросов с сервера modbus работает нормально. Обязательно ли использовать очереди при работе 2-х задач и прерываний или же можно обойтись другим способом? И еще - attribute ("ISR") служит для обозначения обработчика прерывания, которое возвращается после прерывания именно в ту задачу, в которой оно произошло?? Или я неправильно понимаю???
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 27 2008, 20:15
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ Nov 27 2008, 21:45) *
Обязательно ли использовать очереди при работе 2-х задач и прерываний или же можно обойтись другим способом?

Не обязательно, но все от конкретных задач зависит.

Цитата(ZAA @ Nov 27 2008, 21:45) *
И еще - attribute ("ISR") служит для обозначения обработчика прерывания, которое возвращается после прерывания именно в ту задачу, в которой оно произошло?? Или я неправильно понимаю???

Если прерывание не вызывает переключение контекста и оформлено без portSAVE_CONTEXT/portRESTORE_CONTEXT, то его обработчик должен иметь этот атрибут.

Цитата(ZAA @ Nov 27 2008, 21:45) *
В КАКОЙ_ТО МОМЕНТ ПРОГРАММА ПОПАДАЕТ СЮДА И ЗАВИСАЕТ (не заходя в while)

Так все уже в Ваших руках - неужели не получается найти непосредственную причину зависания?
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 28 2008, 07:58
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(aaarrr @ Nov 27 2008, 23:15) *
Так все уже в Ваших руках - неужели не получается найти непосредственную причину зависания?

Я похоже опять возвращаюсь к тому, с чего все начиналось((( Последней точкой где контроллер выводит в DBGU, является запрет прерываний по Tx и разрешение по Rx(c portENTER_Critical и PortEXIT_CRITICAL).
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 30 2008, 15:40
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(aaarrr @ Nov 27 2008, 23:15) *
Не обязательно, но все от конкретных задач зависит.
Так все уже в Ваших руках - неужели не получается найти непосредственную причину зависания?

А можно ли объединить 2 задачи в одну - опрос датчиков + вебсервер? чтобы не использовать общие данные и семафоры для доступа к ним...Корректно ли так делать?
И еще вывалился глюк (когда 2 задачи объединили) - спустя небольшое время (после пары десятков-сотен запросов, приходящих на контроллер) контроллер сам сбрасывается (не виснет) и начинает работать заново... Вроде Watchdog с самого начала в LowLewelInit функции отключен 05.gif
И еще, мне не очень понятен смысл vSemaphoreGiveFromISR, которая вызывается в обработчике прерывания по EMAC... unsure.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 30 2008, 16:45
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я бы всё-таки посоветовал наладить внутрисхемную отладку. Трудно переоценить возможность ставить точки останова и просматривать содержимое переменных.
Пока Вы не сузите круг поиска, маловероятно, что Вам форум поможет. Это всё равно, что пытаться поставить больному диагноз по телефону. Надо точно установить причину проблемы, а через интернет это сложно сделать.
Go to the top of the page
 
+Quote Post
ZAA
сообщение Nov 30 2008, 17:14
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(scifi @ Nov 30 2008, 19:45) *
Я бы всё-таки посоветовал наладить внутрисхемную отладку. Трудно переоценить возможность ставить точки останова и просматривать содержимое переменных.

К сожалению, отладчика нет и не предвидится crying.gif Да и с ассемблером я не очень дружу и времени разбираться с ним тоже нет 05.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 07:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016