|
Загрузчик + основная программа, IAP over Ethernet в MCU |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 44)
|
Apr 10 2013, 15:09
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(_Макс @ Apr 10 2013, 18:09)  не могу найти ни одного фала scat, ни в одном своем проекте. Плохо ищите значит. Смотрите в опциях проекта, где Ваш scatter файл живет по умолчанию.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 11 2013, 14:25
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(_Макс @ Apr 11 2013, 17:04)  будет ли содержимое оперативки в STM32 обнуляться? Врядли. Скорее останется таким же как до сброса, но расчитывать на жто нельзя. Цитата(_Макс @ Apr 11 2013, 17:04)  Чему равно значение битов в оперативке по умолчанию после подачи питания? Скорее всего будет в неопределённом состоянии. Вы сэкономить на обнулении ОЗУ хотите?
|
|
|
|
|
Apr 11 2013, 14:27
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(_Макс @ Apr 11 2013, 18:04)  Если у меня основная программа иницирует программный сброс (для того, чтобы передать управление загрузчику), будет ли содержимое оперативки в STM32 обнуляться? Нет, не будет. Цитата(_Макс @ Apr 11 2013, 18:04)  Нигде не могу найти это в документации. Это как бы подразумевается. Если бы обнулялось, у компиляторов была бы опция "не обнулять программно". Цитата(_Макс @ Apr 11 2013, 18:04)  Чему равно значение битов в оперативке по умолчанию после подачи питания? Мусор.
|
|
|
|
|
Apr 12 2013, 16:05
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Макс @ Apr 12 2013, 18:21)  Судя по тому, что здесь написано, переменная в секции UNINIT будет инициализирована при переходе к main() или основной программе. Во-первых, не всегда, а во-вторых, там же написано, как этого избежать. Цитата(toweroff @ Apr 12 2013, 18:42)  Так CARM давно кончился.
|
|
|
|
|
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)  о чем многие забывают. Я так первый раз об этом слышу, если честно.
|
|
|
|
|
May 5 2013, 15:42
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Макс @ May 5 2013, 19:35)  В моем букваре таких конструкций нету, а в гугле, что не напишешь, так он про С++ только и говорит. Что посоветуете? Конструкция более чем стандартная: Код *(uint32_t*)&g_ip
&g_ip - берем адрес g_ip (uint32_t*) - преобразуем к указателю на uint32_t * - обращаемся к значению по новому указателю Все эти части в букваре точно должны быть.
|
|
|
|
|
May 5 2013, 21:22
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
Цитата(aaarrr @ May 5 2013, 18:42)  Конструкция более чем стандартная: Код *(uint32_t*)&g_ip
&g_ip - берем адрес g_ip (uint32_t*) - преобразуем к указателю на uint32_t * - обращаемся к значению по новому указателю Почему делается через указатель, а не напрямую?
|
|
|
|
|
May 5 2013, 21:31
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Макс @ May 6 2013, 01:22)  Почему делается через указатель, а не напрямую? На этот вопрос Вам в свое время уже компилятор ответил: Цитата invalid type conversion Нельзя присвоить числу значение структуры. А вот через указатель можно, но при этом ответственность за допустимость и корректность такой операции целиком на программисте.
|
|
|
|
|
May 6 2013, 17:23
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
D имеющемся у меня коде, значение IP адреса присваивается с помощью функции определенной директивой define Код #define IP4_ADDR(ipaddr, a,b,c,d) \ (ipaddr)->addr = htonl(((u32_t)((a) & 0xff) << 24) | \ ((u32_t)((b) & 0xff) << 16) | \ ((u32_t)((c) & 0xff) << 8) | \ (u32_t)((d) & 0xff)) Присвоение статического адреса: Код IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); Почему? Могу ли я просто написать вот так, когда присваиваю имеющийся динамический адрес в runtime: Код ipaddr.addr = g_ip.addr;
|
|
|
|
|
May 7 2013, 13:09
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
Можно ли написать вот так, чтобы не выдумывать имя для типа, который используется в одном экземпляре: Код static struct { u32_t build; u8_t login[16]; u8_t password[16]; } g_config; Компилятор ошибки не выдает, но я не припомню, чтобы где-то видел такого вида маневры.
Сообщение отредактировал _Макс - May 7 2013, 17:03
|
|
|
|
|
May 7 2013, 21:04
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
В скаттере объявите именованную область и адрес с диапазоном, куда это складывать В тексте можно пользоваться директивой Код __attribute__ ((section("NAMED_AREA"))) перед объявлением например, для складывания в SRAM не только RW данных, но и того, что нужно поместить именно туда (область RAMFUNC), скаттер будет примерно такого вида Код ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************
LR_IROM1 0x20000000 0x00080000 { ; load region size_region ER_IROM1 0x20000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x80000000 0x0000E000 { ; RW data *.o (RAMFUNC) .ANY (+RW +ZI) } }
|
|
|
|
|
May 9 2013, 17:41
|
Знающий
   
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945

|
У меня получился вот такой scetter file: Код LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 {; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ER_IROM2 0x803F800 { *(G_CONFIG +RO) } RW_IRAM1 0x20000000 0x00010000 {; RW data .ANY (+RW +ZI) } RW_IRAM2 0x2000FFF4 {; IP Data *(G_IP) } } Данные с атрибутом G_CONFIG после компиляции, в map файле отображаются с типом RW, несмотря на то, что размещены во флеше и RO указано явно. Что неправильно?
Сообщение отредактировал _Макс - May 9 2013, 17:41
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|