Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пример http сервера на FreeRTOS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
xelax
контроллер sam7x

Пример компилируется, собирается и работает.
Решил поробовать на его основе сделать что-то своё в итоге программа стала падать (abort and undef).
Сначала решил, что в порыве оптимизации что-то сделал не так кривыми руками. Потратив уйму времени на поиск ошибки обнаружил, что указатели на функции передающиеся в процедуру
Код
struct netif *
netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
  struct ip_addr *gw,
  void *state,
  err_t (* init)(struct netif *netif),
  err_t (* input)(struct pbuf *p, struct netif *netif))

смещаются на 1 и указывают на нечётные адреса.
вот copy past дебаггера
Код
netif      0x00206704  
ipaddr  0x0020176c    
netmask            0x00201768  
gw        0x00201764  
state     0x00000000  
init        0x110129 <ethernetif_init+1>  
input     0x10be41 <tcpip_input+1>    
netifnum            1


и что самое интересное точно такой же эффект наблюдается в самом примере с сайта. Удивительно то, что после исключительной ситуации программа каким-то чудом продолжает работать дальше и это при том что вектора исключительных ситуаций не определенны.

Кто-нибудь запускал этот пример у себя? Эта бага только у меня воспроизводится или это действительно ошибка в проекте?

З.Ы. компилер gcc 4.1.1
Evgeny_CD
Не могу ничего сказать про данный случай, но помню, было обсуждение, что FreeRTOS умудряется даже для malloc выдавать блоки, не выровненные по границе слова. Видимо, это такая багофича создателей этой ну очень free ОСи.
Николай Z
Цитата(xelax @ Nov 14 2007, 11:04) *
контроллер sam7x

Пример компилируется, собирается и работает.
Решил поробовать на его основе сделать что-то своё в итоге программа стала падать (abort and undef).
Сначала решил, что в порыве оптимизации что-то сделал не так кривыми руками. Потратив уйму времени на поиск ошибки обнаружил, что указатели на функции передающиеся в процедуру
Код
struct netif *
netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
  struct ip_addr *gw,
  void *state,
  err_t (* init)(struct netif *netif),
  err_t (* input)(struct pbuf *p, struct netif *netif))

смещаются на 1 и указывают на нечётные адреса.
вот copy past дебаггера
Код
netif      0x00206704  
ipaddr  0x0020176c    
netmask            0x00201768  
gw        0x00201764  
state     0x00000000  
init        0x110129 <ethernetif_init+1>  
input     0x10be41 <tcpip_input+1>    
netifnum            1


и что самое интересное точно такой же эффект наблюдается в самом примере с сайта. Удивительно то, что после исключительной ситуации программа каким-то чудом продолжает работать дальше и это при том что вектора исключительных ситуаций не определенны.

Кто-нибудь запускал этот пример у себя? Эта бага только у меня воспроизводится или это действительно ошибка в проекте?

З.Ы. компилер gcc 4.1.1


Попробуйте собрать в Тумб-моде.... И без оптимизаций...
У меня эта версия собралась и вроде заработала... Как минимум транспорт я проверил...
Но я не менял никаких исходных установок проекта для STR912...

Дальше из-за необходимости идти вперед в работе над изделием я отложил в сторону новую версию стека и работаю пока со старой... Изделие пока не требует новой версии и SNMP, которая реализована в новой версии... Допинфа будет после завершения работы над текущим макетом, когда я вернусь к этой отложенной версии...

Примерно со 2-й половины декабря или сразу после нового года...
xelax
Цитата(Николай Z @ Nov 14 2007, 12:34) *
Попробуйте собрать в Тумб-моде.... И без оптимизаций...
У меня эта версия собралась и вроде заработала... Как минимум транспорт я проверил...
Но я не менял никаких исходных установок проекта для STR912...

Дальше из-за необходимости идти вперед в работе над изделием я отложил в сторону новую версию стека и работаю пока со старой... Изделие пока не требует новой версии и SNMP, которая реализована в новой версии... Допинфа будет после завершения работы над текущим макетом, когда я вернусь к этой отложенной версии...

Примерно со 2-й половины декабря или сразу после нового года...


так я и собираю в thumb и с оптимизацией -O0. Пример и у меня работает, но на мой взгляд работает пример случайно. так как там есть вышеописанная бага.

З.Ы. к стати этот пример примерно за сутки работы виснет. smile.gif
Николай Z
Цитата(xelax @ Nov 14 2007, 13:43) *
так я и собираю в thumb и с оптимизацией -O0. Пример и у меня работает, но на мой взгляд работает пример случайно. так как там есть вышеописанная бага.

З.Ы. к стати этот пример примерно за сутки работы виснет. smile.gif


Я не работал на ARM7 - потому скорее всего это не совсем в тему, но у меня ни одна из ипостасей TCP/IP стека не висла за сутки... Видимо надо исправлять баги и проверять коррекции...

Можно конечно вставлять перезапуск всего по какому-то признаку работы/неработы, например по watch-dog, если в преиодические участки процесс переходил заходить - но такие места и признаки надо искать... При нарушении нормальной работы - перезапуск всего и дело в шляпе, но я бы искал все-таки сперва причину зависаний.
xelax
laughing.gif Прошу прощения, но ошибка из разряда сам дурак.
Сначала вот это условие не выполнял.

// WARNING: This must only be run after the OS has been started.
// Typically this is the case, however, if not, you must place this
// in a post-OS initialization
netifapi_netif_add(&my_netif, ipaddr, netmask, gw, NULL, init, input);


А затем когда-то успел убить строчку подачи тактовой на MAC. 01.gif

Хотя указатели действительно смещаются на 1 smile.gif что меня и смутило.

И ещё в догонку совсем недавно(9 ноября) появился ресурс по lwIP.

http://lwip.scribblewiki.com

Теперь скудость документирования данного стека вроде как начала устранятся.
Сергей Борщ
Цитата(xelax @ Nov 14 2007, 15:31) *
Хотя указатели действительно смещаются на 1 smile.gif что меня и смутило.
При вызове функции через команду BX младший бит указывает, что вызываемая функция должна выполняться в Thumb mode. Поэтому все адреса thumb-функций имеют нечетные адреса. В реальном адресе два младших бита не используются, поэтому и отведены в ядре ARM для служебных целей. Что во втором бите - не помню.
xelax
Цитата(Сергей Борщ @ Nov 14 2007, 18:15) *
При вызове функции через команду BX младший бит указывает, что вызываемая функция должна выполняться в Thumb mode. Поэтому все адреса thumb-функций имеют нечетные адреса. В реальном адресе два младших бита не используются, поэтому и отведены в ядре ARM для служебных целей. Что во втором бите - не помню.


07.gif Спасибо, буду знать...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.