Код
define symbol __ICFEDIT_region_ITCMRAM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ITCMRAM_end__ = 0x00003FFF;
define region ITCMRAM_region = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__];
define block ITCMRAM with alignment = 8 { section .itcmram };
initialize by copy { readwrite, section .itcmram };
place in ITCMRAM_region {block ITCMRAM };
define symbol __ICFEDIT_region_ITCMRAM_end__ = 0x00003FFF;
define region ITCMRAM_region = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__];
define block ITCMRAM with alignment = 8 { section .itcmram };
initialize by copy { readwrite, section .itcmram };
place in ITCMRAM_region {block ITCMRAM };
А в коде программы применил прагму
Код
#pragma default_function_attributes = @ ".itcmram"
static void FilterTask( void * Param )
{
.....
}
static void FilterTask( void * Param )
{
.....
}
И все работает, быстро, хорошо, проблем нет.
Но вот захотелось отправить в эту память еще и обработчик прерывания USB FS Host. Написал так же
Код
#pragma default_function_attributes = @ ".itcmram"
void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
{
....
}
void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
{
....
}
И не тут-то было. Вылезла ошибка линкера
Код
place in ITCMRAM_region {block ITCMRAM };
^
"stm32f745xx_flash_sram.icf",50 Warning[Lp005]:
placement includes a mix of sections with content (example "ro code s
ection .itcmram in stm32f7xx_hal_hcd.o symbols: [HAL_HCD_GetCurrentFr
ame, HAL_HCD_HC_GetURBState, HAL_HCD_ResetPort, HAL_HCD_Stop, HAL_HCD
_Start, HAL_HCD_IRQHandler, HAL_HCD_HC_GetXferCount, HAL_HCD_GetCurre
ntSpeed]") and sections without content (example "rw code section .it
cmram in HalfBandFIR.o symbols: [FBI_Filter2X, FBI_Filter4X, FBI_Filt
er8X]")
Прошивка грузится с ошибками и не работает.^
"stm32f745xx_flash_sram.icf",50 Warning[Lp005]:
placement includes a mix of sections with content (example "ro code s
ection .itcmram in stm32f7xx_hal_hcd.o symbols: [HAL_HCD_GetCurrentFr
ame, HAL_HCD_HC_GetURBState, HAL_HCD_ResetPort, HAL_HCD_Stop, HAL_HCD
_Start, HAL_HCD_IRQHandler, HAL_HCD_HC_GetXferCount, HAL_HCD_GetCurre
ntSpeed]") and sections without content (example "rw code section .it
cmram in HalfBandFIR.o symbols: [FBI_Filter2X, FBI_Filter4X, FBI_Filt
er8X]")
Смотрю мап:
Код
"P4": 0x21a0
ITCMRAM 0x00000000 0x21a0 <Block>
Veneer ro code 0x00000000 0x8 - Linker created -
Veneer ro code 0x00000008 0x8 - Linker created -
Veneer ro code 0x00000010 0x8 - Linker created -
Veneer ro code 0x00000018 0x8 - Linker created -
Veneer ro code 0x00000020 0x8 - Linker created -
Veneer ro code 0x00000028 0x8 - Linker created -
.itcmram ro code 0x00000030 0x71a stm32f7xx_hal_hcd.o [1]
Veneer ro code 0x0000074c 0x8 - Linker created -
.itcmram ro code 0x00000754 0xb38 stm32f7xx_ll_usb.o [1]
ITCMRAM-1 0x0000128c 0xf14 <Init block>
Veneer inited 0x0000128c 0x8 - Linker created -
.itcmram inited 0x00001294 0x50 Filter.o [1]
Veneer inited 0x000012e4 0x8 - Linker created -
.itcmram inited 0x000012ec 0x6f0 HalfBandFIR.o [1]
Veneer inited 0x000019dc 0x8 - Linker created -
Veneer inited 0x000019e4 0x8 - Linker created -
Veneer inited 0x000019ec 0x8 - Linker created -
.itcmram inited 0x000019f4 0x224 heap_4.o [1]
.itcmram inited 0x00001c18 0x4d8 IFirInter.o [1]
Veneer inited 0x000020f0 0x8 - Linker created -
Veneer inited 0x000020f8 0x8 - Linker created -
.itcmram inited 0x00002100 0xa0 tasks.o [1]
- 0x000021a0 0x21a0
ITCMRAM 0x00000000 0x21a0 <Block>
Veneer ro code 0x00000000 0x8 - Linker created -
Veneer ro code 0x00000008 0x8 - Linker created -
Veneer ro code 0x00000010 0x8 - Linker created -
Veneer ro code 0x00000018 0x8 - Linker created -
Veneer ro code 0x00000020 0x8 - Linker created -
Veneer ro code 0x00000028 0x8 - Linker created -
.itcmram ro code 0x00000030 0x71a stm32f7xx_hal_hcd.o [1]
Veneer ro code 0x0000074c 0x8 - Linker created -
.itcmram ro code 0x00000754 0xb38 stm32f7xx_ll_usb.o [1]
ITCMRAM-1 0x0000128c 0xf14 <Init block>
Veneer inited 0x0000128c 0x8 - Linker created -
.itcmram inited 0x00001294 0x50 Filter.o [1]
Veneer inited 0x000012e4 0x8 - Linker created -
.itcmram inited 0x000012ec 0x6f0 HalfBandFIR.o [1]
Veneer inited 0x000019dc 0x8 - Linker created -
Veneer inited 0x000019e4 0x8 - Linker created -
Veneer inited 0x000019ec 0x8 - Linker created -
.itcmram inited 0x000019f4 0x224 heap_4.o [1]
.itcmram inited 0x00001c18 0x4d8 IFirInter.o [1]
Veneer inited 0x000020f0 0x8 - Linker created -
Veneer inited 0x000020f8 0x8 - Linker created -
.itcmram inited 0x00002100 0xa0 tasks.o [1]
- 0x000021a0 0x21a0
Получается, что код одних функций он кладет в раздел ro code, а других в inited. Пролазил все прагмы по исходниками и заголовкам - не нашел зацепок почему?
Пока не попробовал засунуть в itcmram ST-шные библиотек, туда заползали и функции FreeRTOS. Не подскажите где искать?
Да, использую IAR 7.5.2