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

STM32407 IAR 8.50.6 разместить байты по адресу во FLASH

Всем здоровья.

При прошивке hex из IAR(или другой прогой) необходимо по адресу во FLASH разместить uint32_t.

Пробовал всякие варианты:

1.

#define zDATA_addr 0x080E0000 
static const uint8_t zDATA[] __attribute__((at(zDATA_addr)))= {
0x03, 0x02, 0x01, 0x00};  

2.

volatile const uint32_t key_appl @ 0x080E0000 = 0x03020100;

3.

icf-файл:

place at address mem:0x080E0000 {readonly section area_key};

c-файл:

#pragma location="area_key"

volatile const uint32_t key_appl @ "area_key" = 0x03020100;

volatile const uint32_t key_appl @ 0x080E0000 = 0x03020100;

 

static подсовывал, volatile убирал/добавлял - при старте из flash читается 0xFFFFFFFF.

Функцию чтения проверял - работает.

Что делаю не так?

p.s. в поиске нашел только вышеназванные варианты.

 

 


 


 


 

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


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

1 час назад, Pasa сказал:

static подсовывал, volatile убирал/добавлял - при старте из flash читается 0xFFFFFFFF.

Функцию чтения проверял - работает.

Что делаю не так?

Не отделяете мух от котлет.

Первым делом следует проверить, что компилируется/компонуется правильно. А для этой цели служит .map-файл. Открывали его? Подозреваю что нет.

Только после того как убедились, что в .map-файле всё правильно, нужно разбираться с прошивальщиком.

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


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

1 hour ago, Pasa said:

#define zDATA_addr 0x080E0000 

А столько памяти есть в вашем МК ?

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


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

9 minutes ago, jcxz said:

Не отделяете мух от котлет.

Первым делом следует проверить, что компилируется/компонуется правильно. А для этой цели служит .map-файл. Открывали его? Подозреваю что нет.

Только после того как убедились, что в .map-файле всё правильно, нужно разбираться с прошивальщиком.

Открывал. На секцию area_key пишет:  "No sections  matched the following patterns"

И на такой вариант пишет это же:

define region PDATA_region  = mem:[from 0x080E0000 size 0x400 ];
place in PDATA_region { readwrite section "MYDATA" };
 

6 minutes ago, dimka76 said:

А столько памяти есть в вашем МК ?

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/

define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/* define symbol __ICFEDIT_intvec_start__ = 0x08040000; */

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__    = 0x08000000;
/* define symbol __ICFEDIT_region_ROM_start__    = 0x08040000; */

/* define symbol __ICFEDIT_region_ROM_end__      = 0x080DFFFF; */
define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__    = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0xc000;
/*define symbol __ICFEDIT_size_heap__   = 0x400; */
define symbol __ICFEDIT_size_heap__   = 0x40000;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];
define region RAM1_region     = mem:[from 0x60000000 to 0x6007ffff];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
/*define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };*/
define block HEAP with size = 0x40000, alignment = 8{ };
place in RAM1_region {block HEAP};

/* "ROM": */
/* place at address mem:0x080E0000 { readonly section area_key}; */
/* const float32_t firCoeffs32[1] @ "area_key" = {0x03,0x02,0x01,0x00}; */

define region PDATA_region  = mem:[from 0x080E0000 size 0x400 ];
place in PDATA_region { readwrite section "MYDATA" };

initialize by copy { readwrite };
do not initialize  { section .noinit };
/* do not initialize  { section .area_key };  */


place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK/*, block HEAP*/ };

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


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

33 минуты назад, Pasa сказал:

Открывал. На секцию area_key пишет:  "No sections  matched the following patterns"

Кто пишет? .map-файл сам пишет?  :shok:

.c/.h-файлы:

__no_init struct CfgMfr cfgMfr @ ".cfgmfr";

.icf-файл:

define region FLASHC_regionB = mem:[from 0x08002000 to 0x08003FFF]; //PMU/FLASH (cached)
...
do not initialize  {section .cfgmfr};
...
place in FLASHC_regionB {section .cfgmfr};

Если нужно разместить константу - нужно слегка модифицировать:

char const __codeSignature[] @ ".codeSignature" = "...";
define region FLASHC_regionB = mem:[from 0x08002000 to 0x08003FFF]; //PMU/FLASH (cached)
...
place in FLASHC_regionB {section .codeSignature};

 

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


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

2 hours ago, jcxz said:

Кто пишет? .map-файл сам пишет?  :shok:

.c/.h-файлы:


__no_init struct CfgMfr cfgMfr @ ".cfgmfr";

.icf-файл:


define region FLASHC_regionB = mem:[from 0x08002000 to 0x08003FFF]; //PMU/FLASH (cached)
...
do not initialize  {section .cfgmfr};
...
place in FLASHC_regionB {section .cfgmfr};

Если нужно разместить константу - нужно слегка модифицировать:


char const __codeSignature[] @ ".codeSignature" = "...";

define region FLASHC_regionB = mem:[from 0x08002000 to 0x08003FFF]; //PMU/FLASH (cached)
...
place in FLASHC_regionB {section .codeSignature};

 

No sections matched the following patterns:

  section .cfgmfr  in "P1"

 

No sections matched the following patterns:

  section .codeSignature  in "P1"

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


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

Когда работал в IAR, то для подобных целей использовал директиву #pragma location = addr

И обязательно указывал директиву __root при объявлении переменной чтобы линкер гарантированно её не выбросил.

Попробуйте такой вариант:

#pragma location = 0x080E0000
__root const uint32_t key_appl = 0x03020100;

 

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


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

5 минут назад, Sergey_Aleksandrovi4 сказал:

И обязательно указывал директиву __root при объявлении переменной чтобы линкер гарантированно её не выбросил.

__root - это если эта переменная нигде в коде не используется. О чём ТС не упоминал. И это сразу видно по .map-файлу.

Также до сих пор не ясно - как обстоит дело с .map-файлом у ТС? внятно он ничего так и не ответил.

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


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

27 minutes ago, Sergey_Aleksandrovi4 said:

Когда работал в IAR, то для подобных целей использовал директиву #pragma location = addr

И обязательно указывал директиву __root при объявлении переменной чтобы линкер гарантированно её не выбросил.

Попробуйте такой вариант:


#pragma location = 0x080E0000
__root const uint32_t key_appl = 0x03020100;

 

Спасибо огромное!!! Сразу нашел переменную и в hex-файле и map-файле. Завтра еще протестирую на железе, но думаю что все решилось.

Дополню, что специально делал вспомогательные функции, работающие с этой переменной(были мысли что компилятор/линкер ее выбрасывал).

В функциях многократно ее читал в другие переменные , всячески пробовал изобразить компилятору , что эта переменная участвует во многих вычислениях.

Безрезультатно.

__root  без всякой дополнительной байды сразу поместил константу в hex-файл:

:02000004080EE4
:0400000000010203F6

И в map-файл:

isr_datas                      0x2000'1244   0x100  Data  Gb  fx_serial.o [1]
isspace                         0x800'ba01    0x14  Code  Gb  isspace.o [2]
key_appl                       0x80e'0000     0x4  Data  Lc  main.o [1]
koeff_NoiseL_Edit43     0x2000'0520    0x28  Data  Gb  main.o [1]
koeff_Noise_Edit3        0x2000'03b8    0x28  Data  Gb  main.o [1]

p.s.

в icf-файл ничего дополнительно не вносил...вот как-то так....

p.s.

Еще раз Спасибо!

 

 

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


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

41 минуту назад, Pasa сказал:

В функциях многократно ее читал в другие переменные , всячески пробовал изобразить компилятору , что эта переменная участвует во многих вычислениях.

Потому что это не переменная. А значит оптимизатор может в конкретном месте, где к ней идёт обращение, создать её копию и использовать копию. И получится, что обращений к данному адресу не будет и оригинал можно удалить.

И из этого следует, что даже если укажете константу с __root, то это просто скажет компоновщику не выкидывать её из образа прошивки. Но не заставит в местах, где она используется реально обращаться к ней, а не к её копии например.

А значит это:

1 час назад, Sergey_Aleksandrovi4 сказал:

#pragma location = 0x080E0000
__root const uint32_t key_appl = 0x03020100;

 

может у Вас и не работать на каких-то уровнях оптимизации и в зависимости от того - как именно используете её в коде.

Для чего оно вам нужно? Если собираетесь изменять её значение отдельно от компилятора (своей программой например), то так описывать неправильно. Потому как компилятор на этапе компиляции знает значение key_appl и запросто создаст её копию в любом другом месте, где ему удобно. И в точке обращения будете получать старое значение. Тогда нужно добавлять ещё volatile:

__root u32 volatile const key_appl @ 0x080E0000 = ...;

 

Пример (.lst):

                              In section .rodata, at 0x80e0000, root           
00000000   0x00000001         DC32 1                                           
          __root u32 const key_appl @ 0x080E0000 = 1;  ///                     
                                                                               
                                                                               
                              In section .text, align 2, keep-with-next        
          __noreturn int main()                                                
          {                                                                    
            ToutMs2Tick(key_appl);  ///                                        
                  main: (+1)                                                   
00000000   0x2001             MOVS     R0,#+1                                  
00000002   0x.... 0x....      BL       _Z11ToutMs2Tickm                        

как видно - толку от __root никакого. Хотя по желаемому адресу key_app и присутствует.

 

А то же самое, но с volatile:

                              In section .data, at 0x80e0000, root             
          __root u32 volatile const key_appl @ 0x080E0000 = 1;  ///            
                  key_appl:                                                    
00000000   0x00000001         DC32 1                                           
                                                                               
                                                                               
                              In section .text, align 2, keep-with-next        
          __noreturn int main()                                                
          {                                                                    
            ToutMs2Tick(key_appl);  ///                                        
                  main: (+1)                                                   
00000000   0x....             LDR.N    R0,??DataTable20_16  ;; 0x80e0000       
00000002   0x....             LDR.N    R5,??DataTable20_17  ;; 0x40023800      
00000004   0x6800             LDR      R0,[R0, #+0]                            
00000006   0x....             LDR.N    R4,??DataTable20                        
00000008   0x....             LDR.N    R7,??DataTable20_18                     
0000000A   0x.... 0x....      BL       _Z11ToutMs2Tickm                        

как видно - всё ok.

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


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

42 minutes ago, jcxz said:

А то же самое, но с volatile:

как видно - всё ok.

А если с volatile, но без __root ?

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


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

6 минут назад, dimka76 сказал:

А если с volatile, но без __root ?

Имеет право выкинуть, если не используется явно.

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


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

8 minutes ago, dimka76 said:

А если с volatile, но без __root ?

О volatile  я писал в первом топике.

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


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

1 hour ago, jcxz said:

Потому что это не переменная

Мне не нужна переменная. В первом сообщении я задал простой вопрос:  "необходимо по адресу во FLASH разместить uint32_t".

const  надеюсь была видна.

И попросил совета как это правильно сделать.

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


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

Предположим, что во FLASH храним некоторую настройку.

Объявляем ее так

const volatile uint32_t setting <какие-то атрибуты размещения в памяти>;

И тем самым говорит компилятору, что данная переменна доступна только для чтения, но средствами каких-то внешних сил,

эта переменная может измениться из вне. Поэтому при чтении всегда бери ее из памяти.

Почему это не должно работать ?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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