pokk 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 (изменено) · Жалоба Делаю hex для bootloader в stm32f405. В файле линкера создал блок образа IMAGE_HEAD (урезанный там больше указателей) и перенес туда адрес начала таблицы прерываний. и два региона для хранение настроек FlashDefault_region, располагаються в последних двух секторах. /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32f40x_fsmc.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08020000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_FLASH_start__ = 0x08020000; define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_FSMC11_start__ = 0x0; define symbol __ICFEDIT_region_FSMC11_end__ = 0x0; define symbol __ICFEDIT_region_FSMC12_start__ = 0x0; define symbol __ICFEDIT_region_FSMC12_end__ = 0x0; define symbol __ICFEDIT_region_FSMC13_start__ = 0x0; define symbol __ICFEDIT_region_FSMC13_end__ = 0x0; define symbol __ICFEDIT_region_FSMC14_start__ = 0x0; define symbol __ICFEDIT_region_FSMC14_end__ = 0x0; define symbol __ICFEDIT_region_NAND1_start__ = 0x0; define symbol __ICFEDIT_region_NAND1_end__ = 0x0; define symbol __ICFEDIT_region_NAND2_start__ = 0x0; define symbol __ICFEDIT_region_NAND2_end__ = 0x0; define symbol __ICFEDIT_region_PCARD_start__ = 0x0; define symbol __ICFEDIT_region_PCARD_end__ = 0x0; define symbol __ICFEDIT_region_CCRAM_start__ = 0x10000000; define symbol __ICFEDIT_region_CCRAM_end__ = 0x1000FFFF; define symbol __ICFEDIT_region_SRAM1_start__ = 0x20000000; define symbol __ICFEDIT_region_SRAM1_end__ = 0x2001BFFF; define symbol __ICFEDIT_region_SRAM2_start__ = 0x2001C000; define symbol __ICFEDIT_region_SRAM2_end__ = 0x2001FFFF; define symbol __ICFEDIT_region_BKPR_start__ = 0x40024000; define symbol __ICFEDIT_region_BKPR_end__ = 0x40024FFF; /*--------------------Sector0---------------------------------------*/ /*--------------------Sector10---------------------------------------*/ define symbol __ICFEDIT_region_FlashDefault_start__ = 0x080C0000; define symbol __ICFEDIT_region_FlashDefault_end__ = 0x080DFFFF; /*--------------------Sector_11---------------------------------------*/ define symbol __ICFEDIT_region_FlashVar_start__ = 0x080E0000; define symbol __ICFEDIT_region_FlashVar_end__ = 0x080FFFFF; /*--------------------------------------------------------------*/ /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x2000; define symbol __ICFEDIT_size_heap__ = 0x2000; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region FLASH_region = mem:[from __ICFEDIT_region_FLASH_start__ to __ICFEDIT_region_FLASH_end__ ]; define region FSMC_region = mem:[from __ICFEDIT_region_FSMC11_start__ to __ICFEDIT_region_FSMC11_end__] | mem:[from __ICFEDIT_region_FSMC12_start__ to __ICFEDIT_region_FSMC12_end__] | mem:[from __ICFEDIT_region_FSMC13_start__ to __ICFEDIT_region_FSMC13_end__] | mem:[from __ICFEDIT_region_FSMC14_start__ to __ICFEDIT_region_FSMC14_end__]; define region NAND_region = mem:[from __ICFEDIT_region_NAND1_start__ to __ICFEDIT_region_NAND1_end__ ] | mem:[from __ICFEDIT_region_NAND2_start__ to __ICFEDIT_region_NAND2_end__ ]; define region PCARD_region = mem:[from __ICFEDIT_region_PCARD_start__ to __ICFEDIT_region_PCARD_end__ ]; define region CCRAM_region = mem:[from __ICFEDIT_region_CCRAM_start__ to __ICFEDIT_region_CCRAM_end__ ]; define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ]; define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; //initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application do not initialize { section .noinit }; //place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; define block IMAGE_HEAD with fixed order {readonly section .intvec, section .intvecTail}; place in FLASH_region {readonly,first block IMAGE_HEAD}; //place in PCARD_region { readonly section application_specific_ro }; place in CCRAM_region { block CSTACK, section .ccram }; place in SRAM_region { readwrite, block HEAP }; place in BKPR_region { section .backup_sram }; define region FlashDefault_region = mem:[from __ICFEDIT_region_FlashDefault_start__ to __ICFEDIT_region_FlashDefault_end__]; define region FlashVar_region = mem:[from __ICFEDIT_region_FlashVar_start__ to __ICFEDIT_region_FlashVar_end__ ]; place in FlashDefault_region {section .FlashDefault}; place in FlashVar_region {section .FlashVar}; Вот кусок стартапа MODULE ?cstartup ;; Forward declaration of sections. SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN __iar_program_start EXTERN SystemInit EXTERN hard_fault_handler_c PUBLIC __vector_table ;;------------------------------------------------------ PUBLIC __beginCodehead EXTERN __checksum_begin, __checksum_end SECTION .intvec:CONST:ROOT(8) DATA __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler ;;---------------------------------------------------------------------- SECTION .intvecTail:CONST:ROOT(2) DATA ;Продолжение таблицы векторов прерываний __vector_table_tail ;;---------------------------------------------------------------------- ;;DCD 0 ; Зането CRC ;;DCD 0 ; занято __beginCodehead DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler Проблема возникла в том что, таблица прерываний начинает распалагаться, после региона блока настроек FlashDefault_region ******************************************************************************* *** PLACEMENT SUMMARY *** define block IMAGE_HEAD with fixed order { ro section .intvec, section .intvecTail }; "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; define block CSTACK with size = 8K, alignment = 8 { }; "P2": place in [from 0x1000'0000 to 0x1000'ffff] { block CSTACK, section .ccram }; define block HEAP with size = 8K, alignment = 8 { }; "P3": place in [from 0x2000'0000 to 0x2001'bfff] | [from 0x2001'c000 to 0x2001'ffff] { rw, block HEAP }; "P5": place in [from 0x80c'0000 to 0x80d'ffff] { section .FlashDefault }; "P6": place in [from 0x80e'0000 to 0x80f'ffff] { section .FlashVar }; initialize by copy { rw }; No sections matched the following patterns: section .backup_sram in "P4" section .ccram in "P2" Section Kind Address Size Object ------- ---- ------- ---- ------ "P5": 0xe0 P5-1 0x80c'0000 0xe0 <Init block> .FlashDefault inited 0x80c'0000 0xe0 VarFlash.o [1] - 0x80c'00e0 0xe0 "P1": 0xc9fc IMAGE_HEAD 0x80c'0100 0x180 <Block> .intvec ro code 0x80c'0100 0x1c startup_stm32f4xx_Boot.o [1] .intvecTail const 0x80c'011c 0x164 startup_stm32f4xx_Boot.o [1] .checksum const 0x80c'0280 0x4 Place holder __checksum .rodata const 0x80c'0284 0x10 HTTP_v2.o [1] .rodata const 0x80c'0294 0x10 HTTP_v2.o [1] .rodata const 0x80c'02a4 0x8 HTTP_v2.o [1] .rodata const 0x80c'02ac 0x14 HTTP_v2.o [1] .rodata const 0x80c'02c0 0x78 HTTP_v2.o [1] .rodata const 0x80c'0338 0x9c HTTP_v2.o [1] .rodata const 0x80c'03d4 0x18 HTTP_v2.o [1] Почему секция "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; начинаеться после P5 ? и с адресом 0x80c0000 ? Хотя должно с 0x8020000 Изменено 18 ноября, 2019 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба Ну ты же перечислил сначала readonly, а потом IMGE_HEAD. А вообще, place at address использовать как это сделано штатно для .intvec. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба Кстати, глянь приложенный стартап. В IAR можно смело выкидывать Reset_Handler и SystemInit. Код из SystemInit перенести в __low_level_init(), он всё равно в стартовом коде есть. Чутка да экономим. startup_iar_stm32f405xx.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 41 minutes ago, VladislavS said: Ну ты же перечислил сначала readonly, а потом IMGE_HEAD Да я тоже об этом думал пробовал поменять местами все равно так же define block IMAGE_HEAD with fixed order {section .intvec, section .intvecTail}; place in FLASH_region {first block IMAGE_HEAD,readonly}; 46 minutes ago, VladislavS said: place at address использовать как это сделано штатно для .intvec. Да если его использовать то работает как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 4 часа назад, pokk сказал: Почему секция "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; начинаеться после P5 ? и с адресом 0x80c0000 ? Хотя должно с 0x8020000 Видимо потому, что тот пример моего кода, который Вы взяли как образец для этого, очень криво отредактировали, добавив туда совершенно левые строки. Советую внимательнее разобраться в моём примере. Чтобы понимать что там и для чего. Конкретно обратить внимание на объявление секции ".intvec" в asm-файле. 2 часа назад, VladislavS сказал: Ну ты же перечислил сначала readonly, а потом IMGE_HEAD. И что? 2 часа назад, VladislavS сказал: А вообще, place at address использовать как это сделано штатно для .intvec. "place at address" там не нужен. И в таких применениях он вообще не нужен. Проблема в том что автор создал галиматью в своём коде. Внимательнее нужно следить за секциями, которые объявляются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 6 hours ago, jcxz said: Конкретно обратить внимание на объявление секции ".intvec" в asm-файле. Вы про SECTION .intvec:CODE:NOROOT(2) ? Убрал не помогло Вообще я ваш пример успешно применил на stm32f103 кусок стартапа: MODULE ?cstartup ;; Forward declaration of sections. SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN hard_fault_handler_c EXTERN __iar_program_start EXTERN init_rcc PUBLIC __vector_table PUBLIC __beginCodehead EXTERN __checksum_begin, __checksum_end ;;------------------------------------------------------ ;;--------Указатель на адрес основных настроек---------- ;;------------------------------------------------------ PUBLIC __beginFlashVarAddr SECTION .FlashVar:CONST:ROOT(2) __beginFlashVarAddr ;; SettingSignature ;;------------------------------------------------------ ;;--------Указатель на адрес дефолтных настроек---------- ;;------------------------------------------------------ PUBLIC __beginFlashDefaultAddr SECTION .FlashDefault:CONST:ROOT(2) __beginFlashDefaultAddr ;;------------------------------------------------------ ;;----------------Указатель на Header code-------------- ;;------------------------------------------------------ PUBLIC __Codehead SECTION .codehead:CONST:ROOT(2) __Codehead DC32 0xAABBCCDD ;;signatur DC32 __checksum_begin DC32 __checksum_end DC32 __beginFlashDefaultAddr DC32 __beginFlashVarAddr ;;------------------------------------------------------ ;;----------------Указатель на Header code-------------- ;;------------------------------------------------------ PUBLIC __PointCodehead SECTION .PointCodehead:CONST:ROOT(2) __PointCodehead DC32 __beginCodehead ;;------------------------------------------------------ ;;------------------------------------------------------ ;;------------------------------------------------------ SECTION .intvec:CONST:ROOT(8) DATA __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler ;;---------------------------------------------------------------------- SECTION .intvecTail:CONST:ROOT(2) DATA ;Продолжение таблицы векторов прерываний __vector_table_tail ;;---------------------------------------------------------------------- ;;DCD 0 ; Зането CRC ;;DCD 0 ; занято __beginCodehead DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler Файл линкера initialize by copy { readwrite }; do not initialize { section .noinit }; define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .PointCodehead, section .intvecTail, section .codehead}; place in ROM_region {readonly, first block IMAGE_HEAD,section .SoftWare,section .SectSHA1,block WebContent}; place in FlashDefault_region {first section .FlashDefault}; place in FlashVar_region {first section .FlashVar}; place in CrashLog_region {first section .CrashLog}; define block MEM_FIRST with fixed order {section .StartingRam}; place in RAM_region { readwrite, first block MEM_FIRST, last block CSTACK, block HEAP }; И в процессе переноса на stm32f405 возникла ситуация с начальным адресом, по этому начал убирать все лишнее (что сязанно с секцией настройками) по этому и остались хвосты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 43 минуты назад, pokk сказал: Вы про SECTION .intvec:CODE:NOROOT(2) ? Убрал не помогло А почему тогда опять эта строчка фигурирует? И зачем Вы её вообще добавили? Какой смысл? И почему во фрагменте .map у вас значится ".intvec ro code 0x80c'0100 0x1c startup_stm32f4xx_Boot.o [1]" ? Опять не CONST, а CODE. И к тому-же из файла "startup_stm32f4xx_Boot.o". У Вас какая таблица прерываний используется? Из асм-файла (того, что в начале привели) или из startup_stm32f4xx_Boot.o? А зачем тогда прицепили ещё "startup_stm32f4xx_Boot.o" если таблицу прерываний описали в асм-файле? В моём примере у секции .intvec везде атрибут "CONST". И таблица прерываний - из асм-файла. Онли. У Вас там несколько разных намешано. Видно надёргали каких-то кусков из разных мест. Потому и получили кашу. Разберитесь наконец какая директива для чего предназначена и применяйте осмысленно, а не тыкайте наугад. Вот как выглядит у меня: "P1": 0x12d0c IMAGE_HEAD 0x08000000 0x228 <Block> .intvec 0x08000000 0x20 <Block> .intvec const 0x08000000 0x20 misca.o [1] .checksum const 0x08000020 0x4 Place holder __checksum .codehead const 0x08000024 0x8 misca.o [1] .intvecTail const 0x0800002c 0x1d0 misca.o [1] .codeSignature const 0x080001fc 0x2c main.o [1] .text ro code 0x08000228 0x1a30 cedit.o [1] ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Дело бы в этом: 21 hours ago, pokk said: define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF; Изменил диапазон секции FLASH до начала секций с настройками, и поменял .intvec на const стало так: Section Kind Address Size Object ------- ---- ------- ---- ------ "P1": 0xc894 IMAGE_HEAD 0x802'0000 0x19c <Block> .intvec const 0x802'0000 0x1c startup_stm32f4xx_Boot.o [1] .checksum const 0x802'001c 0x4 Place holder __checksum .PointCodehead const 0x802'0020 0x4 startup_stm32f4xx_Boot.o [1] .intvecTail const 0x802'0024 0x164 startup_stm32f4xx_Boot.o [1] .codehead const 0x802'0188 0x14 startup_stm32f4xx_Boot.o [1] .rodata const 0x802'019c 0x10 HTTP_v2.o [1] PS: ещё добавил модификатор first к секции настроек, что бы указатель указывал на начало секций а не конец. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 8 часов назад, pokk сказал: Изменил диапазон секции FLASH до начала секций с настройками, и поменял .intvec на const стало так: А "startup_stm32f4xx_Boot.o" - что у Вас такое? Вы свой асм-файл с таблицей прерываний что-ли назвали "startup_stm32f4xx_Boot.*"? Исходя из названия, я думал - что это стандартный файл для семейства МК STM32F4xx из комплекта компилятора. Цитата PS: ещё добавил модификатор first к секции настроек, что бы указатель указывал на начало секций а не конец. Здесь ничего не понял о чём речь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба On 11/19/2019 at 6:09 PM, jcxz said: Вы свой асм-файл с таблицей прерываний что-ли назвали "startup_stm32f4xx_Boot.*"? Да это стандартный файл, я его изменил в процессе "настройки" секции на нужный адрес, а исходный оставил. У меня в каждом проекте, есть папка chip, в которой находиться startup, файл линкер *.icf, и другие хедеры относившиеся к ядру и серии процессора(stm32f4xx.h). On 11/19/2019 at 6:09 PM, jcxz said: Здесь ничего не понял о чём речь... При таких настройках place in FlashDefault_region {first section .FlashDefault}; place in FlashVar_region {first section .FlashVar}; Получаем то что мне надо "P6": 0xe0 .FlashDefault const 0x80c'0000 0x0 startup_stm32f4xx_Boot.o [1] .FlashDefault const 0x80c'0000 0xe0 VarFlash.o [1] А если не указывать first то получим. "P6": 0xe0 .FlashDefault const 0x80c'0000 0xe0 VarFlash.o [1] .FlashDefault const 0x80c'00e0 0x0 startup_stm32f4xx_Boot.o [1] - 0x80c'00e0 0xe0 В таблицу векторов запишется адрес конца секции настроек, а не начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться