|
|
  |
Загрузчик + основная программа, IAP over Ethernet в MCU |
|
|
|
Apr 18 2013, 12:58
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(_Макс @ Apr 7 2013, 22:38)  .......необходимо каким-то образом передать DHCP настройки через RAM и перейти на исполнение main() основной программы. ........ Какие еще выгодные реализации IAP over Ethernet вы можете посоветовать? Что за контроллер? Например, у STM'ов есть Backup регистры, которые сохраняют свое состояние после перезагрузки контроллера(без отключения питания), а если STM'му подключить батарейку, то состояние этих регистров сохраняется даже после отключения питания(пока не помрет батарейка). Кстати, а зачем передавать настройки DHCP из bootloader'a в основную программу? Все равно в main'е инициализируете стек? У меня, например, в bootloader'e uip стек, а в основной программе lwip, и там, и там есть DHCP клиент, т.е. никакие настройки от botloader'a о DHCP, DNS, IP не передаются.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
May 4 2013, 17:07
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
Цитата(PoReX @ Apr 18 2013, 15:58)  Кстати, а зачем передавать настройки DHCP из bootloader'a в основную программу? Все равно в main'е инициализируете стек? У меня, например, в bootloader'e uip стек, а в основной программе lwip, и там, и там есть DHCP клиент, т.е. никакие настройки от botloader'a о DHCP, DNS, IP не передаются. STM32F1xx, но баттарейку никто не подлючал. DHCP параетры нужно передать, чтобы после перехода от бутлоадера к основной программе стек был инициализирован уже имеющимися параметрами сети, иначе если стек начнет запрашивать новые, то может получить иной IP, а этого быть не должно. Поэтому суть такова, что сетевые параметры сохраняются в области RAM, и если они там присутствуют и валидные, то стек инициализируются ими, а не по DHCP. Оба стека lwIP. Вот так объявлен IP адрес: Код struct ip_addr { PACK_STRUCT_FIELD(u32_t addr); } PACK_STRUCT_STRUCT; PACK_STRUCT_END Вынес значение сетевых параметров в отдельный файл: Код static struct ip_addr g_ip; static struct ip_addr g_gw; static struct ip_addr g_mask; static struct ip_addr g_checksum; Делается проверка, что значения сетевых параметров в памяти не мусор: Код if( (uint32_t) g_ip ^ (uint32_t) g_gw ^ (uint32_t) g_mask == g_checksum) { // Action } Но компилятор отдает: Код src\netconf.c(82): error: #171: invalid type conversion Как правильно преобразовать тип, чтобы проверить валидность XOR`ом?
|
|
|
|
|
May 4 2013, 18:48
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Может так: Код struct ip_t { uint8_t ip[4]; };
union un_ipAddr { struct ip_t IP; uint32_t IP_ul; }; un_ipAddr ip, mask, gate, sum; void main { if ((ip.IP_ul^mask.IP_ul^gate.IP_ul)==sum.IP_ul) { } } Цитата(_Макс @ May 4 2013, 20:07)  Как правильно преобразовать тип, чтобы проверить валидность XOR`ом? CRC бы тут какую, а не xor.
|
|
|
|
|
May 5 2013, 09:06
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
Цитата(_Артём_ @ May 4 2013, 21:48)  Может так: Код struct ip_t { uint8_t ip[4]; };
union un_ipAddr { struct ip_t IP; uint32_t IP_ul; }; un_ipAddr ip, mask, gate, sum; void main { if ((ip.IP_ul^mask.IP_ul^gate.IP_ul)==sum.IP_ul) { } } Почему разработчик стека использовал выделенный тип для IP адреса вместо одного 32 битного числа? Что теперь нужно делать объединения. Можно как-то без них обойтись используя существующее объявление структуры?
|
|
|
|
|
May 5 2013, 10:00
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-07-10
Пользователь №: 58 429

|
потому что кроме ipv4 ,бывает ipv6. а там не 4 байта на адрес, и при подключении другого хедера там будет совершенно другая тема.
|
|
|
|
|
May 5 2013, 13:33
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
Цитата(_Артём_ @ May 5 2013, 13:33)  Если очень хочется, то можно: Код if( (((*(uint32_t*)&g_ip) ^ (*(uint32_t *)&g_gw)^ (*(uint32_t *)&g_mask)))== (*(uint32_t *)&g_checksum) ) { // Action } От чего звезды и амперсанд появился? У меня ведь переменная глобальная (статическая), и не передается в функцию по ссылке. И указатели тут причем не пойму. Цитата(alexandermas @ May 5 2013, 13:00)  потому что кроме ipv4 ,бывает ipv6. а там не 4 байта на адрес, и при подключении другого хедера там будет совершенно другая тема. Меня это тоже заинтересовало. Можно заставить lwIP работать с IPv4 и IPv6 одновременно, как я понял там это статически задается.
|
|
|
|
|
May 5 2013, 13:47
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Артём_ @ May 5 2013, 14:33)  Если очень хочется, то можно: Код if( (((*(uint32_t*)&g_ip) ^ (*(uint32_t *)&g_gw)^ (*(uint32_t *)&g_mask)))== (*(uint32_t *)&g_checksum) ) { // Action } Так не стоит делать - структура упакована. Цитата(_Макс @ May 5 2013, 17:33)  От чего звезды и амперсанд появился? У меня ведь переменная глобальная (статическая), и не передается в функцию по ссылке. И указатели тут причем не пойму. Тут к букварю надо обратиться. И что мешало изначально сделать так: Код if( g_ip.addr ^ g_gw.addr ^ g_mask.addr == g_checksum) { }
|
|
|
|
|
May 5 2013, 14:24
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Артём_ @ May 5 2013, 18:16)  Чтение по невыровненному адресу с последующим исключением? Оно. Цитата(_Артём_ @ May 5 2013, 18:16)  В Cortex-ах с этим проблем нет (навроди). В том-то и дело, что не совсем. Для M3 это справедливо только для одиночных операций, о чем многие забывают.
|
|
|
|
|
May 5 2013, 14:44
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(aaarrr @ May 5 2013, 17:24)  Оно. Ага, понятно. Цитата(aaarrr @ May 5 2013, 17:24)  Для M3 это справедливо только для одиночных операций Не погли вы бы привести пример или дать ссылку где такое можно увидеть. Цитата(aaarrr @ May 5 2013, 17:24)  о чем многие забывают. Я так первый раз об этом слышу, если честно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|