Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-13 19:58

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 2016-авг-31 11:58 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
Добрый день.

Делаю попытки загружать мк из внешней ПЗУ через внутреннюю. Для этого использую "Отладочный комплект для микроконтроллера 1986ВЕ3Т", контроллер 1986ВЕ3Т, "Модуль внешней памяти Flash (на базе 1636РР1У)". Среда разработки IAR EWARM 6.4.
Во внутренней EEPROM (0x00000000 - 0x000fffff) лежит загрузчик, во внешней (0x00100000 - 0x001fffff) лежит основная программа. Контроллер стартует из внутренней флешки, после чего загрузчик передает управление на адрес 0x00100f29, где лежит Reset_Handler основной программы. Пробовал на main, __iar_program_start и пр.
Программа выполняется, но не работают прерывания. (Замечу, что при размещении во внутренней флеш (разумеется при сборке с соответствующими адресами), программа оказывается вполне работоспособной.) Поскольку в Cortex M1 регистра для альтернативного адреса размещения таблицы векторов нет, пытался в таблицу загрузчика подсовывать адреса обработчиков внешней программы - ничего не дало. Как заставить контроллер грузиться из внутренней флеш, переходить во внешнюю, полноценно работать оттуда (с прерываниями)?


Вложения:
Комментарий к файлу: Программа загрузчика и программа для внешнего ПЗУ
example.ZIP [462.21 КБ]
Скачиваний: 99
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-авг-31 12:10 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1034
Откуда: Тула
Roman_Navis писал(а):
Поскольку в Cortex M1 регистра для альтернативного адреса размещения таблицы векторов нет, пытался в таблицу загрузчика подсовывать адреса обработчиков внешней программы - ничего не дало. Как заставить контроллер грузиться из внутренней флеш, переходить во внешнюю, полноценно работать оттуда (с прерываниями)?

Выделенный вариант теоретически должен был бы работать, но уж очень стрёмный костыль.

А нельзя ли обойтись только одной ПЗУ: внешней или внутренней?

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-авг-31 12:22 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1271
Откуда: АО "ПКК Миландр"
Roman_Navis писал(а):
Добрый день.

Делаю попытки загружать мк из внешней ПЗУ через внутреннюю. Для этого использую "Отладочный комплект для микроконтроллера 1986ВЕ3Т", контроллер 1986ВЕ3Т, "Модуль внешней памяти Flash (на базе 1636РР1У)". Среда разработки IAR EWARM 6.4.
Во внутренней EEPROM (0x00000000 - 0x000fffff) лежит загрузчик, во внешней (0x00100000 - 0x001fffff) лежит основная программа. Контроллер стартует из внутренней флешки, после чего загрузчик передает управление на адрес 0x00100f29, где лежит Reset_Handler основной программы. Пробовал на main, __iar_program_start и пр.
Программа выполняется, но не работают прерывания. (Замечу, что при размещении во внутренней флеш (разумеется при сборке с соответствующими адресами), программа оказывается вполне работоспособной.) Поскольку в Cortex M1 регистра для альтернативного адреса размещения таблицы векторов нет, пытался в таблицу загрузчика подсовывать адреса обработчиков внешней программы - ничего не дало. Как заставить контроллер грузиться из внутренней флеш, переходить во внешнюю, полноценно работать оттуда (с прерываниями)?



Вообщем то должно работать, но не понятно что именно у вас пошло не так. "Ничего не дало" - слишком мало.
При ITCMLAEN=0 – внешняя память внешняя шина отображается начиная с нулевых адресов и проблем с таблицей векторов быть не должно.

Если же надо все же стартовать из Flash, а потом во внешнюю память перейти (в том числе по обработчикам прерываний) надо сделать более сложные настройки проекта.

main располагаем в Flash
main_ext располагаем во внешней памяти, но с атрибутом ROM (не RAM иначе образ поместится сначала во Флеш и при запуске начнется переписываться во внешнюю память)
обработчики прерываний тоже располагаем во внешней памяти.

При начала работы в main инициализируем внешнюю шину и разрешаем прерывания и передаем управление на main_ext

Для зашивки всего этого потребуется два FLM (или как они там в IAR) первый шьет Flash, второй шьет внешнюю память. IAR для каждого диапазона сам выберет тот или иной образ.

В этом случае в таблице будут адреса указывающие на внешнюю память. И уход на них должен выполнятся корректно, если конечно контроллер внешней шины включен.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 15:20 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
prostoRoman писал(а):
Выделенный вариант теоретически должен был бы работать, но уж очень стрёмный костыль.

Костыль стремный, но регистра нет...

prostoRoman писал(а):
А нельзя ли обойтись только одной ПЗУ: внешней или внутренней?

Нельзя - предполагается, что загрузчик будет сидеть внутри постоянно. Его основная задача размещать ПО (получаемое через UART) во внешней ПЗУ и передавать туда управление. Т.е. готовое устройство никто не должен трогать руками (никаких механических переключений и пр.), доступ по UART и это не ПК.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 15:29 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
-=Sergei=- писал(а):
Roman_Navis писал(а):
Добрый день.

Делаю попытки загружать мк из внешней ПЗУ через внутреннюю. Для этого использую "Отладочный комплект для микроконтроллера 1986ВЕ3Т", контроллер 1986ВЕ3Т, "Модуль внешней памяти Flash (на базе 1636РР1У)". Среда разработки IAR EWARM 6.4.
Во внутренней EEPROM (0x00000000 - 0x000fffff) лежит загрузчик, во внешней (0x00100000 - 0x001fffff) лежит основная программа. Контроллер стартует из внутренней флешки, после чего загрузчик передает управление на адрес 0x00100f29, где лежит Reset_Handler основной программы. Пробовал на main, __iar_program_start и пр.
Программа выполняется, но не работают прерывания. (Замечу, что при размещении во внутренней флеш (разумеется при сборке с соответствующими адресами), программа оказывается вполне работоспособной.) Поскольку в Cortex M1 регистра для альтернативного адреса размещения таблицы векторов нет, пытался в таблицу загрузчика подсовывать адреса обработчиков внешней программы - ничего не дало. Как заставить контроллер грузиться из внутренней флеш, переходить во внешнюю, полноценно работать оттуда (с прерываниями)?



Вообщем то должно работать, но не понятно что именно у вас пошло не так. "Ничего не дало" - слишком мало.
При ITCMLAEN=0 – внешняя память внешняя шина отображается начиная с нулевых адресов и проблем с таблицей векторов быть не должно.

Если же надо все же стартовать из Flash, а потом во внешнюю память перейти (в том числе по обработчикам прерываний) надо сделать более сложные настройки проекта.

main располагаем в Flash
main_ext располагаем во внешней памяти, но с атрибутом ROM (не RAM иначе образ поместится сначала во Флеш и при запуске начнется переписываться во внешнюю память)
обработчики прерываний тоже располагаем во внешней памяти.

При начала работы в main инициализируем внешнюю шину и разрешаем прерывания и передаем управление на main_ext

Для зашивки всего этого потребуется два FLM (или как они там в IAR) первый шьет Flash, второй шьет внешнюю память. IAR для каждого диапазона сам выберет тот или иной образ.

В этом случае в таблице будут адреса указывающие на внешнюю память. И уход на них должен выполнятся корректно, если конечно контроллер внешней шины включен.



Не понятно и нам. "Ничего не дало" = ничего не изменилось. "Программа выполняется, но не работают прерывания." Программа - это то, что лежит во внешней ПЗУ (0x00100000 - 0x001fffff), загрузчик - во внутренней (0x00000000 - 0x000fffff). Программа в цикле выдает в UART2 символы, при приеме 12 байт (FIFO UART) должна выдавать в порт строчку.

Цитата:
main располагаем в Flash

Так и есть - загрузчик лежит внутри, таблица начинается с 0х00000000.

Цитата:
main_ext располагаем во внешней памяти, но с атрибутом ROM

Программа со своим main() и таблицей лежит во внешней памяти, которая начинается с 0х00100000 (туда ее помещает загрузчик, и больше она никуда не перемещается). Эта секция определена как "place in ROM_region { readonly };".

Цитата:
При начала работы в main инициализируем внешнюю шину и разрешаем прерывания и передаем управление на main_ext

Так и есть.

Цитата:
В этом случае в таблице будут адреса указывающие на внешнюю память.

В statrup'е загрузчика меняю имена обработчиков на абсолютные адреса обработчиков из внешней программы. Под debug'ом видно, что они там лежат.

Цитата:
И уход на них должен выполнятся корректно, если конечно контроллер внешней шины включен.

Контроллер шины включен (передача управления все же происходит), но прерывания не вызываются.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 15:37 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1271
Откуда: АО "ПКК Миландр"
Roman_Navis писал(а):

Цитата:
В этом случае в таблице будут адреса указывающие на внешнюю память.

В statrup'е загрузчика меняю имена обработчиков на абсолютные адреса обработчиков из внешней программы. Под debug'ом видно, что они там лежат.



Листинг startup файла и скриншот значений в памяти можно посмотреть ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 16:15 
Не в сети

Зарегистрирован: 2009-июл-15 14:29
Сообщения: 33
-=Sergei=-, вопрос по МК 1986ВЕ3Т. Где должна быть расположена таблица векторов прерываний для полноценной работы программы из внешенго ПЗУ? Для внутренней Flash это адрес 0х00000. А для внешней какой адрес? Можно ли управлять этим процессом и указывать самому с какого адреса будет начинаться эта самая таблица прерываний?
Было бы интересно увидеть работающий скатер icf(scf) файл. Ни у стартап файл тоже. Если нет для IARа, то можно и для Кейла.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 16:18 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
-=Sergei=- писал(а):
Roman_Navis писал(а):

Цитата:
В этом случае в таблице будут адреса указывающие на внешнюю память.

В statrup'е загрузчика меняю имена обработчиков на абсолютные адреса обработчиков из внешней программы. Под debug'ом видно, что они там лежат.



Листинг startup файла и скриншот значений в памяти можно посмотреть ?


Открыть
MODULE ?cstartup

;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)

SECTION .intvec:CODE:NOROOT(2)
EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table


DATA
__vector_table
DCD sfe(CSTACK) ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD 0x00100f5d;NMI_Handler ; NMI Handler
DCD 0x00100f61;HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0x00100f65;SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0x00100f69;PendSV_Handler ; PendSV Handler
DCD 0x00100f6d;SysTick_Handler ; SysTick Handler

; External Interrupts

DCD 0;MIL_STD_1553B2_IRQHandler ;IRQ0
DCD 0;MIL_STD_1553B1_IRQHandler ;IRQ1
DCD 0;USB_IRQHandler ;IRQ2
DCD 0;CAN1_IRQHandler ;IRQ3
DCD 0;CAN2_IRQHandler ;IRQ4
DCD 0;DMA_IRQHandler ;IRQ5
DCD 0;UART1_IRQHandler ;IRQ6
DCD 0x00100cd7;UART2_IRQHandler ; ;IRQ7
DCD 0;SSP1_IRQHandler ;IRQ8
DCD 0;BUSY_IRQHandler ;IRQ9
DCD 0;ARINC429R_IRQHandler ;IRQ10
DCD 0;POWER_IRQHandler ;IRQ11
DCD 0;WWDG_IRQHandler ;IRQ12
DCD 0;Timer4_IRQHandler ;IRQ13
DCD 0;Timer1_IRQHandler ;IRQ14
DCD 0;Timer2_IRQHandler ;IRQ15
DCD 0;Timer3_IRQHandler ;IRQ16
DCD 0;ADC_IRQHandler ;IRQ17
DCD 0;ETHERNET_IRQHandler ;IRQ18
DCD 0;SSP3_IRQHandler ;IRQ19
DCD 0;SSP2_IRQHandler ;IRQ20
DCD 0;ARINC429T_IRQHandler ;IRQ21
DCD 0;KEYPAD_IRQHandler ;IRQ22
DCD 0;LED_IRQHandler ;IRQ23
DCD 0;UART3_UART4_IRQHandler ;IRQ24
DCD 0;AudioCodec_IRQHandler ;IRQ25
DCD 0;ETHERNET2_IRQHandler ;IRQ26
DCD 0;BKP_IRQHandler ;IRQ27
DCD 0;EXT_INT1_IRQHandler ;IRQ28
DCD 0;EXT_INT2_IRQHandler ;IRQ29
DCD 0;EXT_INT3_IRQHandler ;IRQ30
DCD 0;EXT_INT4_IRQHandler ;IRQ31
Закрыть


скриншот прилагаю


Вложения:
table.jpg
table.jpg [ 143.92 КБ | Просмотров: 3434 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 16:21 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
И еще вопрос, где должна быть расположена таблица прерываний для проги находящейся во внешнем ПЗУ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 16:51 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1271
Откуда: АО "ПКК Миландр"
Григорий писал(а):
-=Sergei=-, вопрос по МК 1986ВЕ3Т. Где должна быть расположена таблица векторов прерываний для полноценной работы программы из внешенго ПЗУ? Для внутренней Flash это адрес 0х00000. А для внешней какой адрес? Можно ли управлять этим процессом и указывать самому с какого адреса будет начинаться эта самая таблица прерываний?
Было бы интересно увидеть работающий скатер icf(scf) файл. Ни у стартап файл тоже. Если нет для IARа, то можно и для Кейла.


Таблица векторов всегда должна располагаться в 0x00000. И процессору в принципе не важно что обработчик во внешней памяти или во внутреннем флеш.
Но я так понял, что вы сделали два разных проекта - первый для флеша, второй для внешней памяти. и соединяете их вручную. При этом компилятор и линкер второго проекта делает вторую таблицу начиная с базового адреса внешней памяти - так как он не знает об этом ограничении.

По идеи должно работать, почему не работает непонятно. Нам потребуется время для повторения ситуации и разбора. Напиши в наш суппорт support@milandr.ru - они поставят эту задачу нашим программистам.

Пока могу предложить вариант, в первом проекте который располагается во флеш реализовать обработчики этих прерываний и уже из тела обработчиков вызывать обработчики во втором проекте как обычные функции (немного увеличит цикл правда), но возможно укажет в чем проблема.

Ну а совсем по хорошему необходимо что бы оба этих проекта были объеденные в один, и в этом случае таблица будет одна.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-01 20:12 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 229
-=Sergei=- писал(а):
Но я так понял, что вы сделали два разных проекта - первый для флеша, второй для внешней памяти. и соединяете их вручную. При этом компилятор и линкер второго проекта делает вторую таблицу начиная с базового адреса внешней памяти - так как он не знает об этом ограничении.


Может быть попробовать, как здесь https://www.iar.com/support/tech-notes/ ... rtup-code/

-=Sergei=- писал(а):
Пока могу предложить вариант, в первом проекте который располагается во флеш реализовать обработчики этих прерываний и уже из тела обработчиков вызывать обработчики во втором проекте как обычные функции (немного увеличит цикл правда), но возможно укажет в чем проблема.


А я всё думал, как виртуальную таблицу векторов сделать... :D

_________________
Hack the Planet!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-02 16:07 
Не в сети

Зарегистрирован: 2015-июн-04 10:38
Сообщения: 40
Кто и почему может ставить прерывания от UART в программе во внешней ПЗУ в ожидание? Это происходит при передаче управления из внутренней ПЗУ во внешнюю и возникновении прерывания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-05 15:55 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1271
Откуда: АО "ПКК Миландр"
Roman_Navis писал(а):
Кто и почему может ставить прерывания от UART в программе во внешней ПЗУ в ожидание? Это происходит при передаче управления из внутренней ПЗУ во внешнюю и возникновении прерывания.


Не понял вопроса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-06 08:47 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 381
Скорее всего, после работы загрузчика в UART остается необработанный запрос, или генерируется прерывание, например по таймауту или изменению на линии при перенастройке портов.
Попробуйте перед передачей управления п основную программу отключить UART и запретить прерывания от него в NVIC.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-окт-06 08:38 
Не в сети

Зарегистрирован: 2016-окт-06 08:31
Сообщения: 3
Что-нибудь получилось? похожая задача
И вопрос по подключению выводов: возможна ли работа из ПЗУ при подключении 16-и разрядов данных? или обязательно 32? мк 1986ВЕ1Т


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB