kostya-m 0 4 февраля, 2017 Опубликовано 4 февраля, 2017 (изменено) · Жалоба Потребовалось использование ITCMRAM для ускорения работы ответственных процедур. Написал такое в ICF и заработало 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 }; А в коде программы применил прагму #pragma default_function_attributes = @ ".itcmram" static void FilterTask( void * Param ) { ..... } И все работает, быстро, хорошо, проблем нет. Но вот захотелось отправить в эту память еще и обработчик прерывания USB FS Host. Написал так же #pragma default_function_attributes = @ ".itcmram" 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]") Прошивка грузится с ошибками и не работает. Смотрю мап: "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 Получается, что код одних функций он кладет в раздел ro code, а других в inited. Пролазил все прагмы по исходниками и заголовкам - не нашел зацепок почему? Пока не попробовал засунуть в itcmram ST-шные библиотек, туда заползали и функции FreeRTOS. Не подскажите где искать? Да, использую IAR 7.5.2 Изменено 4 февраля, 2017 пользователем Мусатов Константин Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться