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

 
 
> Загрузчик + основная программа, IAP over Ethernet в MCU
_Макс
сообщение Apr 7 2013, 18:38
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Стоит задача организовать перепрошивку удаленно, через Ethernet, посредством загрузчика с TFTP сервером и UDP/IP стеком. Если запрос на перепрошивку не был получен в течении ограниченного промежутка времени, необходимо каким-то образом передать DHCP настройки через RAM и перейти на исполнение main() основной программы.
Как выделить место под структуру данных в одинаковых областях RAM для обоих проектов Keil?.
Какие еще выгодные реализации IAP over Ethernet вы можете посоветовать?
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 44)
aaarrr
сообщение Apr 7 2013, 21:00
Сообщение #2


Гуру
******

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



Цитата(_Макс @ Apr 7 2013, 22:38) *
Как выделить место под структуру данных в одинаковых областях RAM для обоих проектов Keil?.

Через UNINIT-секцию в скрипте линкера.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 8 2013, 08:08
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Где этот скрипт лежит? Что это за секция такая?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2013, 08:37
Сообщение #4


Гуру
******

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



Лежит в составе проекта (.scat), по умолчанию генерируется средой. Нужно будет написать свой.

UNINIT - секция, которая не инициализируется при старте приложения. Вам же не нужно, чтобы данные, переданные загрузчиком, были затерты?
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 10 2013, 14:09
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(aaarrr @ Apr 8 2013, 11:37) *
Лежит в составе проекта (.scat), по умолчанию генерируется средой. Нужно будет написать свой.

Вы уверены? Я не могу найти ни одного фала scat, ни в одном своем проекте.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Apr 10 2013, 15:09
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(_Макс @ Apr 10 2013, 18:09) *
не могу найти ни одного фала scat, ни в одном своем проекте.

Плохо ищите значит. Смотрите в опциях проекта, где Ваш scatter файл живет по умолчанию.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 10 2013, 16:23
Сообщение #7


Гуру
******

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



Его может не быть, только если выбрана опция "Simple" в настройках линкера. Соответственно, нужно поменять на "Scattered".
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 11 2013, 14:04
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Если у меня основная программа иницирует программный сброс (для того, чтобы передать управление загрузчику), будет ли содержимое оперативки в STM32 обнуляться? Нигде не могу найти это в документации.
Чему равно значение битов в оперативке по умолчанию после подачи питания?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 11 2013, 14:25
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(_Макс @ Apr 11 2013, 17:04) *
будет ли содержимое оперативки в STM32 обнуляться?

Врядли. Скорее останется таким же как до сброса, но расчитывать на жто нельзя.
Цитата(_Макс @ Apr 11 2013, 17:04) *
Чему равно значение битов в оперативке по умолчанию после подачи питания?

Скорее всего будет в неопределённом состоянии.

Вы сэкономить на обнулении ОЗУ хотите?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 11 2013, 14:27
Сообщение #10


Гуру
******

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



Цитата(_Макс @ Apr 11 2013, 18:04) *
Если у меня основная программа иницирует программный сброс (для того, чтобы передать управление загрузчику), будет ли содержимое оперативки в STM32 обнуляться?

Нет, не будет.

Цитата(_Макс @ Apr 11 2013, 18:04) *
Нигде не могу найти это в документации.

Это как бы подразумевается. Если бы обнулялось, у компиляторов была бы опция "не обнулять программно".

Цитата(_Макс @ Apr 11 2013, 18:04) *
Чему равно значение битов в оперативке по умолчанию после подачи питания?

Мусор.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 11 2013, 16:13
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(_Макс @ Apr 11 2013, 18:04) *
Если у меня основная программа иницирует программный сброс (для того, чтобы передать управление загрузчику), будет ли содержимое оперативки в STM32 обнуляться? Нигде не могу найти это в документации.
Чему равно значение битов в оперативке по умолчанию после подачи питания?

ОЗУ процессор не трогает. Периферийные регистры будут в значении "после сброса" (описаны в документации).
Странный вопрос, поскольку до вызова main() состояние ОЗУ должно измениться для инициализированных данных и обнулиться для неинициализированных. Все остальное мусор. Может затереться стеком в любой момент.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 12 2013, 14:21
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Судя по тому, что здесь написано, переменная в секции UNINIT будет инициализирована при переходе к main() или основной программе. А мне нужно, чтобы через переменную (структуру) можно было передать данные наверх: от загрузчика к оснвоной программе и обратно, когда программа инициирует программный сброс.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 12 2013, 14:42
Сообщение #13


Гуру
******

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



Цитата(_Макс @ Apr 12 2013, 18:21) *
Судя по тому, что здесь написано, переменная в секции UNINIT будет инициализирована при переходе к main() или основной программе. А мне нужно, чтобы через переменную (структуру) можно было передать данные наверх: от загрузчика к оснвоной программе и обратно, когда программа инициирует программный сброс.

http://www.keil.com/support/man/docs/ca/ca_noinit.htm

проверять некое значение в структуре на валидность данных в ней (например, 0x55555555), в зависимости от этого либо инициализировать, либо использовать данные в ней

И еще тут

http://www.keil.com/support/docs/3480.htm
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2013, 16:05
Сообщение #14


Гуру
******

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



Цитата(_Макс @ Apr 12 2013, 18:21) *
Судя по тому, что здесь написано, переменная в секции UNINIT будет инициализирована при переходе к main() или основной программе.

Во-первых, не всегда, а во-вторых, там же написано, как этого избежать.

Цитата(toweroff @ Apr 12 2013, 18:42) *

Так CARM давно кончился.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 12 2013, 16:13
Сообщение #15


Гуру
******

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



Цитата(aaarrr @ Apr 12 2013, 20:05) *
Так CARM давно кончился.

точно, discontinued sm.gif
я как-то не обратил внимание, там CA
но директивы-то наследственность не сохранили?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2013, 16:50
Сообщение #16


Гуру
******

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



Цитата(toweroff @ Apr 12 2013, 20:13) *
но директивы-то наследственность не сохранили?

Не сохранили по причине отсутствия родства между CARM и RVCT.
Go to the top of the page
 
+Quote Post
PoReX
сообщение Apr 18 2013, 12:58
Сообщение #17


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

Группа: Свой
Сообщений: 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-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 4 2013, 17:07
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 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`ом?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 4 2013, 18:48
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 5 2013, 09:06
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 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 битного числа? Что теперь нужно делать объединения. Можно как-то без них обойтись используя существующее объявление структуры?
Go to the top of the page
 
+Quote Post
alexandermas
сообщение May 5 2013, 10:00
Сообщение #21


Участник
*

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



потому что кроме ipv4 ,бывает ipv6. а там не 4 байта на адрес, и при подключении другого хедера там будет совершенно другая тема.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 10:33
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(_Макс @ May 5 2013, 12:06) *
Можно как-то без них обойтись используя существующее объявление структуры?

Если очень хочется, то можно:
Код
if(
    (((*(uint32_t*)&g_ip) ^
    (*(uint32_t *)&g_gw)^
    (*(uint32_t *)&g_mask)))==
    (*(uint32_t *)&g_checksum)
  )
{
        // Action
  }
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 5 2013, 13:33
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 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 одновременно, как я понял там это статически задается.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 13:47
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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)
{
}
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 13:53
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(aaarrr @ May 5 2013, 16:47) *
Так не стоит делать - структура упакована.

И? Это чем-то чревато?

Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 14:13
Сообщение #26


Гуру
******

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



Цитата(_Артём_ @ May 5 2013, 17:53) *
И? Это чем-то чревато?

В данном конкретном случае - едва ли. Но вообще чревато, конечно.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 14:16
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(aaarrr @ May 5 2013, 17:13) *
Но вообще чревато, конечно.

Чтение по невыровненному адресу с последующим исключением? В Cortex-ах с этим проблем нет (навроди).
Или какие-то другие проблемы могут возникнуть?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 14:24
Сообщение #28


Гуру
******

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



Цитата(_Артём_ @ May 5 2013, 18:16) *
Чтение по невыровненному адресу с последующим исключением?

Оно.

Цитата(_Артём_ @ May 5 2013, 18:16) *
В Cortex-ах с этим проблем нет (навроди).

В том-то и дело, что не совсем. Для M3 это справедливо только для одиночных операций, о чем многие забывают.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 14:44
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 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) *
о чем многие забывают.

Я так первый раз об этом слышу, если честно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 15:28
Сообщение #30


Гуру
******

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



Цитата(_Артём_ @ May 5 2013, 18:44) *
Не погли вы бы привести пример или дать ссылку где такое можно увидеть.

Например, DDI0337E_cortex_m3_r1p1_trm.pdf 8-35 (стр. 179):
Цитата
Unaligned LDM/STM/LDRD/STRD instructions always fault irrespective of the setting of UNALIGN_TRP.
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 5 2013, 15:35
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(aaarrr @ May 5 2013, 16:47) *
Тут к букварю надо обратиться.

В моем букваре таких конструкций нету, а в гугле, что не напишешь, так он про С++ только и говорит. Что посоветуете?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 15:42
Сообщение #32


Гуру
******

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



Цитата(_Макс @ May 5 2013, 19:35) *
В моем букваре таких конструкций нету, а в гугле, что не напишешь, так он про С++ только и говорит. Что посоветуете?

Конструкция более чем стандартная:
Код
*(uint32_t*)&g_ip

      &g_ip - берем адрес g_ip
(uint32_t*) - преобразуем к указателю на uint32_t
          * - обращаемся к значению по новому указателю

Все эти части в букваре точно должны быть.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 5 2013, 15:45
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(aaarrr @ May 5 2013, 18:28) *
Например, DDI0337E_cortex_m3_r1p1_trm.pdf 8-35 (стр. 179):

Спасибо.
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 5 2013, 21:22
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Цитата(aaarrr @ May 5 2013, 18:42) *
Конструкция более чем стандартная:
Код
*(uint32_t*)&g_ip

      &g_ip - берем адрес g_ip
(uint32_t*) - преобразуем к указателю на uint32_t
          * - обращаемся к значению по новому указателю

Почему делается через указатель, а не напрямую?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2013, 21:31
Сообщение #35


Гуру
******

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



Цитата(_Макс @ May 6 2013, 01:22) *
Почему делается через указатель, а не напрямую?

На этот вопрос Вам в свое время уже компилятор ответил:
Цитата
invalid type conversion

Нельзя присвоить числу значение структуры. А вот через указатель можно, но при этом ответственность
за допустимость и корректность такой операции целиком на программисте.
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 6 2013, 17:23
Сообщение #36


Знающий
****

Группа: Участник
Сообщений: 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;

Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 6 2013, 17:29
Сообщение #37


Гуру
******

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



1. Из-за эндианизма
2. Можете
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 7 2013, 13:09
Сообщение #38


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 7 2013, 14:16
Сообщение #39


Гуру
******

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



Нехилый парольчег sm.gif
На почти 80 мегов
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 7 2013, 17:22
Сообщение #40


Гуру
******

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



Цитата(_Макс @ May 7 2013, 17:09) *
Можно ли написать вот так, чтобы не выдумывать имя для типа...

Можно.
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 7 2013, 20:53
Сообщение #41


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Как я понимаю, в scatter файле можно только для .o файлов задать место расположение. Я объявил и определил структуры в файле .h потому-что у меня там только данные. Каким изящным способом мне превратить его в индивидуальный .o файл для линкера?

Сообщение отредактировал _Макс - May 7 2013, 20:54
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 7 2013, 21:04
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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)
  }
}
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 7 2013, 22:11
Сообщение #43


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Почему LR_IROM1, содержит вложенные ER_IROM1 и RW_IRAM1? Будто область оперативки является вложенной по отношению ко флешу.

Сообщение отредактировал _Макс - May 7 2013, 22:11
Go to the top of the page
 
+Quote Post
_Макс
сообщение May 9 2013, 17:41
Сообщение #44


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 10 2013, 05:38
Сообщение #45


Гуру
******

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



const в описании не забыли?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:42
Рейтинг@Mail.ru


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