|
IAR (STM32+Ext SRAM) |
|
|
|
May 3 2012, 07:16
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Использую связку STM32F217IG + SRAM CY7C1061AV33 (1 M × 16bit). IAR 6.30
Инициализацию FSMC взял из демо-проекта к плате STM322xG EVAL. Память прекрасно читается и пишется (если писать 16-битными словами) по указателю. Скорость порадовала. Пробовал размещать в этой памяти heap FreeRTOS, подменив указатель - некоторые задачи работают, некоторые нет (видимо из-за выравнивания).
Хотелось бы, конечно, чтобы линкер знал про эту область памяти и мог размещать в ней глобальные структуры, которых планируется много. Ну, конечно, с поправкой на выравнивание по 16 бит. Возможно такое? Попытался поправить скрипт линкера, но при попытке разместить в секции любые данные, процессор не стартует. Если такое возможно сделать, поделитесь, плис, примером скрипта линкера. И откуда в данном случае инициализировать FSMC?
Если нет, то какой способ размещения данных можно применить? Данные - массивы, структуры.
Сообщение отредактировал athlon64 - May 3 2012, 07:19
--------------------
Руслан
|
|
|
|
|
May 3 2012, 08:24
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Вот, например, моя попытка разместить стек во внешней памяти Отладчик виснет
--------------------
Руслан
|
|
|
|
|
May 3 2012, 12:03
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Цитата(KRS @ May 3 2012, 15:53)  Вы хотите сказать что без отладчика работает? Нет, не работает. Я о том, что не могу даже в отладке посмотреть куда попадает проц.
--------------------
Руслан
|
|
|
|
|
May 3 2012, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(KRS @ May 3 2012, 18:24)  можно конечно! Ну, так и думал. Цитата(KRS @ May 3 2012, 18:24)  даже функция есть __set_MSP Её и использовать, если так хочется стек во внешнее озу расположить. Это гораздо проще чем Цитата поставить точку входа на кусок написанный на асме что бы не трогать стек до инициализации памяти... Цитата(KRS @ May 3 2012, 18:24)  но для этого контроллера очень сомнительно что именно стек нужно во внешнюю память пихать. И для многих других МК - сомнительно.
|
|
|
|
|
May 3 2012, 16:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(athlon64 @ May 3 2012, 14:16)  И откуда в данном случае инициализировать FSMC? Самое подходящее для этого место - функция __low_level_init Посмотрите в файле \arm\doc\EWARM_DevelopmentGuide.ENU.pdf что это такое и с чем его употребляют. Добавлено: Впрочем, если пользоваться STM32F2xx_StdPeriph_Lib от ST, то там уже есть свой стартап CMSIS\CM3\DeviceSupport\ST\STM32F2xx\startup\iar\startup_stm32f2xx.s, из него вызывается функция SystemInit, её код находится в файле CMSIS\CM3\DeviceSupport\ST\STM32F2xx\system_stm32f2xx.c, а уже там есть вызов #ifdef DATA_IN_ExtSRAM SystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM */ так что инициализировать FSMC можно и таким способом, только нужно будет поправить эту функцию под свою конфигурацию памяти.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
May 4 2012, 03:41
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Цитата(SSerge @ May 3 2012, 22:44)  Самое подходящее для этого место - функция __low_level_init Ага, точно. Раскомментировал DATA_IN_ExtSRAM, поправил SystemInit_ExtMemCtl();. Теперь в майне сразу же могу работать с ОЗУ, инициализация к тому моменту уже выполнена. Вопрос с местом инициализации решён. Теперь как указать линкеру что это ОЗУ можно использовать? Объявить новый блок с выравниванием 16? А дальше? как разместить в нём нужные мне данные?
Сообщение отредактировал IgorKossak - May 4 2012, 07:07
--------------------
Руслан
|
|
|
|
|
May 14 2012, 07:19
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Цитата(_Артём_ @ May 12 2012, 17:47)  Открыть Compiler Reference- ...-Placing code and data. Сильно понятнее не стало Пошёл с другой строны. Нашёл в примерах IAR демо проект "SRAM_DataMemory" для платы STM322xG-EVAL, использующий аналогичную внешнюю память как основную. В скрипте линкера этого проекта просто изменены адреса начала и конца RAM, также проект использует изменённый cstartup.s, в котором во время исполнения SystemInit() используется стек во внутренней SRAM, после чего заменяется на стек во внешней SRAM. Переделал свой cstartup.s по аналогии с демкой, скрипт линкера тоже. Судя по map-файлу, глобальные переменные теперь все размещены во внешней SRAM Контроллер стартует, но не работают прерывания. Причём после вызова vTaskStartScheduler(), а точнее vPortStartFirstTask(), значение регистра SP запарывается адресом внутреннего SRAM. До этого вызова в SP указатель во внешней SRAM. Получившийся cstartup и скрипт линкера во вложении
--------------------
Руслан
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|