Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Всем здоровья. При прошивке 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. в поиске нашел только вышеназванные варианты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 час назад, Pasa сказал: static подсовывал, volatile убирал/добавлял - при старте из flash читается 0xFFFFFFFF. Функцию чтения проверял - работает. Что делаю не так? Не отделяете мух от котлет. Первым делом следует проверить, что компилируется/компонуется правильно. А для этой цели служит .map-файл. Открывали его? Подозреваю что нет. Только после того как убедились, что в .map-файле всё правильно, нужно разбираться с прошивальщиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 hour ago, Pasa said: #define zDATA_addr 0x080E0000 А столько памяти есть в вашем МК ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 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*/ }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 33 минуты назад, Pasa сказал: Открывал. На секцию area_key пишет: "No sections matched the following patterns" Кто пишет? .map-файл сам пишет? .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}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 2 hours ago, jcxz said: Кто пишет? .map-файл сам пишет? .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" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergey_Aleksandrovi4 1 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Когда работал в IAR, то для подобных целей использовал директиву #pragma location = addr И обязательно указывал директиву __root при объявлении переменной чтобы линкер гарантированно её не выбросил. Попробуйте такой вариант: #pragma location = 0x080E0000 __root const uint32_t key_appl = 0x03020100; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 5 минут назад, Sergey_Aleksandrovi4 сказал: И обязательно указывал директиву __root при объявлении переменной чтобы линкер гарантированно её не выбросил. __root - это если эта переменная нигде в коде не используется. О чём ТС не упоминал. И это сразу видно по .map-файлу. Также до сих пор не ясно - как обстоит дело с .map-файлом у ТС? внятно он ничего так и не ответил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 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. Еще раз Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 42 minutes ago, jcxz said: А то же самое, но с volatile: как видно - всё ok. А если с volatile, но без __root ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 6 минут назад, dimka76 сказал: А если с volatile, но без __root ? Имеет право выкинуть, если не используется явно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 8 minutes ago, dimka76 said: А если с volatile, но без __root ? О volatile я писал в первом топике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба 1 hour ago, jcxz said: Потому что это не переменная Мне не нужна переменная. В первом сообщении я задал простой вопрос: "необходимо по адресу во FLASH разместить uint32_t". const надеюсь была видна. И попросил совета как это правильно сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 22 ноября, 2021 Опубликовано 22 ноября, 2021 · Жалоба Предположим, что во FLASH храним некоторую настройку. Объявляем ее так const volatile uint32_t setting <какие-то атрибуты размещения в памяти>; И тем самым говорит компилятору, что данная переменна доступна только для чтения, но средствами каких-то внешних сил, эта переменная может измениться из вне. Поэтому при чтении всегда бери ее из памяти. Почему это не должно работать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться