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

    

kostya-m

Участник
  • Публикаций

    188
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о kostya-m

  • Звание
    Частый гость

Посетители профиля

1 528 просмотров профиля
  1. STM32F745 FMC + LCD 16-bit i8080 mode

    Спасибо про ремапинг. Но вот и еще один вариант :)
  2. STM32F745 FMC + LCD 16-bit i8080 mode

    Условия: Плата с STM32F745VET (100 pin) Схема спроектирована с помощью CubeMX и им же сделан базовый код. Проблема: Не работает дисплей Анализ: Исследования с помощью многоканального осциллоскопа показало белиберду в управляющих сигналах. Безуспешные попытки: Пробовал изменять режимы работы FMC, тайминги, настройки. Ничего принципиально не помогает. Если код исполнять пошагово, то работает, если непрерывно - не работает. Промежуточным решением оказалось вставить после каждого обращения к LCD задержку на 400-500 нс. Но скорость записи сильно страдает. Решение: Похоже, в FMC, в отличие от FSMC есть логика кеширования. Запись в дисплей ведется по двум адресам ((__IO uint16_t*)0x60000000) и ((__IO uint16_t*)0x60020000). Данные потоком пишутся по второму адресу и FMC начинает пропускать циклы записи, оставляя последний. Отключение FIFO не помогает. Решением оказалось инкрементирование адреса в рамках до A16, которым проводится разделение команда-данные. void LCD_CMD( uint16_t cmd ) { static volatile uint16_t *Cmd = ((__IO uint16_t*)0x60000000); *(Cmd++) = cmd; if( Cmd >= ((__IO uint16_t*)0x6000FFF) ) Cmd = ((__IO uint16_t*)0x60000000); } void LCD_DATA( uint16_t data ) { static volatile uint16_t *Data = ((__IO uint16_t*)0x60020000); *(Data++) = data; if( Data >= ((__IO uint16_t*)0x6002FFFF)) Data = ((__IO uint16_t*)0x60020000); } Так все заработало
  3. Имя, с которым возникала неоднозначность сборки: .itcmram , а имена без точки дают однозначную сборку
  4. Цитата(jcxz @ Feb 8 2017, 01:38) Можно сделать поиск по map-файлу всех вхождений данного имени. Искал. Кроме нескольких указанных функций никого не было. Но это уже неактуально, перешел на дефолтные название. Там не может какой-либо особенности по использованию точки в начале названия секции? Без точки работает.
  5. Цитата(jcxz @ Feb 8 2017, 00:08) Сомнительно про глюк. Что-то Вы ещё такое в эту .itcmram пихаете о чём не рассказываете. И что не совместимо с остальным содержимым. Кроме функций я туда ничего не пихаю. Однако, пришлось отказаться от этого названия, при дефолтном названии .textrw такого не происходит.
  6. Загрузка функций в RAM

    Разобрался с вопросом. Нужная технология называется static overlay Описана тут и там есть хороший пример в архиве, по которому все становится понятно https://www.iar.com/support/tech-notes/link...-example-v5.50/
  7. Загрузка функций в RAM

    Цитата(jcxz @ Feb 8 2017, 00:11) А Вы чего ожидали? Думал что в сказку попал. Ан нет. Так, все же, какие можете предложить решения?
  8. Загрузка функций в RAM

    Буфер выровненный. Пробовал его делать более широкий, uint16_t - не помогло. 32 бита не стал делать - код в функциях THUMB - 16-и битный. Обратил внимание, что указатель на функцию, смотрит не на ее первый байт с четным номером, а на второй, с нечетным. Сделал копирование с адреса на 1 меньше - теперь буфер точно копирует данные в функции. Пробую запустить так же по нечетному адресу - пока не помогает.
  9. Загрузка функций в RAM

    Есть толпа функций обработки данных, из которых работает только одна, в зависимости от настроек. При этом матобработка критична по скорости, потому им бы лежать в ОЗУ. Но их много и хчется сэкономить место в ОЗУ. У всех функций один и тот же программный интерфейс. Кодtypedef void (*DataTransfer_t)( uint32_t ); После компиляции всех функций я посмотрел в мэп файле наиболее длинную из них и сделал с небольшим запасом буфер Кодchar FuncBuffer[512] @ ".itcmram"; Потом копирую в буфер тело функции Кодmemcpy( FuncBuffer, (char*)DataTransfer1, 512 ); После чего пытаюсь запустить Код((DataTransfer_t)FuncBuffer)( FirAskSlot ); Но не тут то было, вываливаюсь в Hard_fault. Что я сделал неправильно?
  10. Разрешил вопрос. Это все же глюк IAR-а Перестал использовать указание на секцию Код@ ".itcmram" А только префикс __ramfunc И добавил в ICF Кодplace in ITCMRAM_region {section .itcmram, section .textrw }; Теперь все функции залазят в ОЗУ
  11. В том то и дело, что многие функции и у меня нормально залазят туда. Но вот некоторые упираются ногами. И переформатирование Icf файла не помогает. Сообщение как в начале темы сохраняется. В рамках одного исходника на С, могут большинство функций заползать, но некоторые отказываются. Я не смог найти закономерность, что нужно что бы было как надо. Цитата(jcxz @ Feb 7 2017, 15:35) Вот мой icf для STM32F429: CODEdefine memory mem with size = 4G; define region FLASH_regionA = mem:[from 0x00004000 to 0x000FFFFF]; define region RAM_regionA = mem:[from 0x20000000 size 0x3FFE0]; define region RAM_regionB = mem:[from 0x2003FFE0 size 0x00020]; define region ROM_region = mem:[from 0x02000000 to 0x02FFFFFF]; define region EEPROM_region = mem:[from 0x400AF000 size 0x1000]; define block CSTACK with alignment = 8, size = 0x000 {}; define block HEAP with alignment = 8, size = 0x000 {}; initialize by copy {rw}; initialize by copy {section .textRAM}; do not initialize {section .noinit}; do not initialize {section .dma}; do not initialize {section .ethernet}; do not initialize {section .bssStk}; do not initialize {section .bssStkMain}; do not initialize {section .bssMemNoFill}; do not initialize {section .imonSave}; define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .codehead, section .intvecTail, section .codeSignature, section .codebegin}; place in RAM_regionB {section .textRAM}; place in FLASH_regionA {ro, first block IMAGE_HEAD, last section .codetail}; place in RAM_regionA {section .BITBAND_RAM, section .dma, section .ethernet}; place in RAM_regionA {rw, first block CSTACK, section .bssMemNoFill, block HEAP}; Добавление в этом проекте функции с префиксом __ramfunc в ".textRAM" - всё ок.
  12. Вполне допускаю, что у меня лес. До сих пор мне приходилось только вписывать секции внешней SRAM, а тут кучка внутренней памяти Однако, перенос строк в конец ни чего не дал. Ругань идет на конкретные данные, например. КодError[Lc037]: ambiguous section match: "zi section .bss in ADC.o symbols: [ADCCurrentLimits, ADC_Flags]" matches more than one pattern Попытка указать явно Кодplace in ITCMRAM_region {readonly section .itcmram, readwrite section .itcmram }; Успеха не принесли, сохраняется ошибка из первого поста.
  13. Цитата(amiller @ Feb 7 2017, 13:48) А если указать: place in ITCMRAM_region {readwrite, block ITCMRAM }; Может конечно масло маслянное... Обругался, что нельзя rw сразу в два региона класть. Основной rw живет в SRAM1
  14. Цитата(jcxz @ Feb 7 2017, 03:30) __ramfunc void Data_StartNextTransfer( void ) @ ".itcmram" {...} Только объявленную таким образом функцию нельзя вызывать до си-стартапа. Попробовал такой префикс. Сообщение осталось, не помогло.
  15. Исходя из непонятных соображений, линкер считает что процедуру, отмеченную секцией ITCMRAM надо считать RO, а в другом случае RW. Причем это может проявляться даже в рамках одного исходного файла на С. например Кодvoid Data_StartNextTransfer( void ) @ ".itcmram" {..................} При компиляции ошибок нет. Мало того, если посмотреть асемблерный листинг, то и там в заголовке указания на секции совпадают Однако линкер может выдать такое сообщение КодWarning[Lp005]: placement includes a mix of sections with content (example "ro code section .itcmram in USBH.o") and sections without content  D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 (example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]") Warning[Lp006]: placement includes a mix of writable sections (example "rw code section .itcmram in DataTask.o symbols: [Data_StartNextTransfer]")  D:\WORK\C\ARM\PA-20 v4 new\EWARM\stm32f745xx_flash_sram.icf 54 and non-writable sections (example "ro code section .itcmram in USBH.o") а в мэп файле хорошо видно, что те функции, которые он нормально кладет в ITCMRAM, помечены как RW. Те, что в том же исходнике, но оставленные в ПЗУ - CODE. Но те, что он отказывается класть в ITCMRAM помечает как RO. И хотя сообщение - предупреждение, реально прошивка не работает. По всяким атрибутам функций закономерности не заметил. Подскажите, что в функции может быть не так и как это исправить, если я ее хочу запускать из ITCMRAM? Код/*###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; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__     = 0x08000000; define symbol __ICFEDIT_region_ROM_end__       = 0x080FFFFF; define symbol __ICFEDIT_region_DTCMRAM_start__     = 0x20000000; define symbol __ICFEDIT_region_DTCMRAM_end__       = 0x2000FFFF; define symbol __ICFEDIT_region_SRAM1_start__     = 0x20010000; define symbol __ICFEDIT_region_SRAM1_end__       = 0x2004BFFF; define symbol __ICFEDIT_region_SRAM2_start__     = 0x2004C000; define symbol __ICFEDIT_region_SRAM2_end__       = 0x2004FFFF; define symbol __ICFEDIT_region_ITCMRAM_start__ = 0x00000000; define symbol __ICFEDIT_region_ITCMRAM_end__   = 0x00003FFF; define symbol __ICFEDIT_region_SRAM_start__    = 0x60000000; define symbol __ICFEDIT_region_SRAM_end__      = 0x601FFFFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** 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 DTCMRAM_region  = mem:[from __ICFEDIT_region_DTCMRAM_start__   to __ICFEDIT_region_DTCMRAM_end__]; define region SRAM1_region    = mem:[from __ICFEDIT_region_SRAM1_start__   to __ICFEDIT_region_SRAM1_end__]; define region SRAM2_region    = mem:[from __ICFEDIT_region_SRAM2_start__   to __ICFEDIT_region_SRAM2_end__]; define region SRAM_region     = mem:[from __ICFEDIT_region_SRAM_start__   to __ICFEDIT_region_SRAM_end__]; define region ITCMRAM_region  = mem:[from __ICFEDIT_region_ITCMRAM_start__ to __ICFEDIT_region_ITCMRAM_end__]; define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { }; define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { }; define block SRAM      with alignment = 8 { section .sram }; define block SRAM2     with alignment = 8 { section .sram2 }; define block DTCMRAM   with alignment = 8 { section .dtcmram }; define block ITCMRAM   with alignment = 8 { section .itcmram }; initialize by copy { readwrite, section .itcmram }; do not initialize  { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region     { readonly }; place in SRAM1_region   { readwrite,               block HEAP,                         block CSTACK}; place in SRAM_region    { block SRAM }; place in ITCMRAM_region {block ITCMRAM }; place in DTCMRAM_region {block DTCMRAM }; place in SRAM2_region   {block SRAM2 };