Перейти к содержанию
    

Загрузчик + основная программа

Тут к букварю надо обратиться.

В моем букваре таких конструкций нету, а в гугле, что не напишешь, так он про С++ только и говорит. Что посоветуете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моем букваре таких конструкций нету, а в гугле, что не напишешь, так он про С++ только и говорит. Что посоветуете?

Конструкция более чем стандартная:

*(uint32_t*)&g_ip

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

Все эти части в букваре точно должны быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструкция более чем стандартная:

*(uint32_t*)&g_ip

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

Почему делается через указатель, а не напрямую?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему делается через указатель, а не напрямую?

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

invalid type conversion

Нельзя присвоить числу значение структуры. А вот через указатель можно, но при этом ответственность

за допустимость и корректность такой операции целиком на программисте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли написать вот так, чтобы не выдумывать имя для типа, который используется в одном экземпляре:

static struct {
    u32_t build;
    u8_t login[16];
    u8_t password[16];
} g_config;

Компилятор ошибки не выдает, но я не припомню, чтобы где-то видел такого вида маневры.

Изменено пользователем _Макс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем _Макс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В скаттере объявите именованную область и адрес с диапазоном, куда это складывать

В тексте можно пользоваться директивой

__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)
  }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем _Макс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня получился вот такой 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 указано явно. Что неправильно?

Изменено пользователем _Макс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...