Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запускается во FLASH, но не доходит до main() !?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
DnTrm
Несколько дней бьюсь над проблемой. Помогите.. Имею: IAR, LPC2294, J-link, 1M RAM, 4M ROM (OLIMEX). Проект нормально работает в RAM (под JTAG'ом). После прошивки PHILIPS'овской утилитой во FLASH (с расчетом KS и размещением по 0х00000014 адресу) имею следующее: В отладчике IAR'а, через JTAG, работает. Без отладчика - прорабатывает cstarup, __low_level_init и после проработки ее последней команды return (1) куда-то "девается"... Я исполльзую scmRTOS ну и соответственно __low_level_init ее родная, в нее добавил только инициализацию частоты процессора, портов и включение MAM (MAMTIM=3). В стандартном cstartup, в самом начале, перед определением стеков добавил настройку внешней памяти. Там есть такие слова, что-то вроде: "свои инициализации добавлять сюда..". Добавил вот только сегодня. Возлагал на это дело большие надежды.. Не помогло..! Как я понял, что добираюсь до указанного места? Просто в самом начале __low_level_init настроил один из pin'ов процессора на выход и в цикле мигаю светодиодом. Так вот до выхода из __low_level_init мигает, а в main() уже нет. В отладчике мигает и в main(). Да и вообще в отладчике программа выполняет свое назначение. Да, еще! В отладчике наблел, что между __low_level_init и main() прорабатывается две (видимо стандартные процедуры) что-то вроде __sector_init (инициализирует ICODE) и чего-то там еще (какя-то вложенная процедура). Не запомнилось, так, как уже уходил с работы. Увидел только, что во всю используется стек, а он у меня во внешней памяти (проект большой, ну и стек ему соответствует). Успел только попробовать с инициализацией внешней памяти в cstartup. Но, как уже сказал - не помогло. Раньше работал с 51-ми, ATmega, Winbond, с msp430-м немного. В ARM все не так! Медленно, как-то все продвигается! Помогите советом.
Andy Mozzhevilov
Если у вас стеки во внешней памяти - то контроллер внешней памяти нужно инициализировать до любого первого использования стека.
Если у вас low_level_init вызывает какие-то вложенные функции, то при входе в нее копилятор скорее всего вставит PUSH {LR}.
Если стек при этом настроен на внешнюю память, а она еще не инициализирована, то результат понятен.
Напишите low_level_init на ассемблере, где первым делом проинициализируейте контроллер внешней памяти, а потом, если нужно, можете вызвать Си-шную функцию.
DnTrm
Спасибо за ответ Andy Mozzhevilov. Тормознул я с ответом. В выходные занят был. По поводу заранее инициализировать стеки. Это-то я и попробовал сделать в конце недели. Я писал, что очень надеялся, что проблема решится, ан нет! Инициализация выглядит сейчас так ( в cstartup):

...
CODE32
?cstartup

; Add initialization nedded before setup of stackpointers here

; Initialization of EMC
; BCFG0=0x10002480;
; FLASH 16bit; IDCY = 1; WST1 = 4; RBLE = 1; WST2 = 4
; 00010000 00000000 00100100 10000000
MOV R1,#0xF0000000
ORR R1,R1,#0xFE00000
MOV R2,#0x10000000
ORR R2,R2,#0x2480
STR R2,[R1,#+0]
; BCFG1=0x20000400;
; SRAM 32bit; IDCY = 1; WST1 = 0; RBLE = 1; WST2 = 0
; 00100000 00000000 00000100 00000000
MOV R2,#0x20000000
ORR R2,R2,#0x400
STR R2,[R1,#+4]


; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#IRQ_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
ldr sp,=SFE(IRQ_STACK) & 0xFFFFFFF8 ; End of IRQ_STACK

bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#SYS_MODE ; Set System mode bits
msr cpsr_c,r0 ; Change the mode
ldr sp,=SFE(CSTACK) & 0xFFFFFFF8 ; End of CSTACK
...

Буду разбираться дальше...
Andy Mozzhevilov
У вас в IAR случаем нет Setup макроса для инициализации EMI?
Если есть, попробуйте отключить его и пройти пошагово всю инициализацию.
Или сбросить руками все настройки EMI в окне регистров, затем пройти инициализацию пошагово (этот вариант даже лучше).
DnTrm
Макрос есть. Проработку попробовал отключить. Поставил точку останова перед своей инициализацией. При останове в регистрах уже нужные настройки!? Подозреваю, что пока JTAG сбрасывает процессор успевает проработаться загруженный в кристалл cstartup (как раз моя инициализация). Дело в том, что IAR не грузит ничего он только сбрасывает процессор и "подхватывает" исполняющуюся программу (я не сумел настроить IAR на загрузку и шью Philis'овской утилитой). В точке останова обнулил BCFG0 (0x00000000) и BCFG1 (0x20000000). Затем по шагам проработал свою инициализацию.. Все OK! Инициализировалась теми же значениями, что и перед сбросом! Кстати все происходит, в отличии от RAM'овского вариаета отладки, в дизассемблере. Но это вроде так и должно быть?
Стоп! Макрос-то отключил, а питание не выключал ! Сейчас отпишусь...
Макрос восстановил, питание передернул: Все работает. После сброса (0х00000000) перескакивает на cstartup еще раз инициирует память моим кодом (первый раз инициализация в макросе) и дальше работает как надо.
Макрос отключил, питание тоже передернул. После адреса 0х00000000 начинает переберать адреса последовательно 0х00000004, 0х00000008 и т.д. до первого BL и все... вылетает (пошаговой отладке кирдык, хотя остановить могу и даже сбросить в 0х00000000).
Еще одно! Взял и все повторил в соответствии с первым абзацем:
Макрос восстановил, питание передернул.. - все работает.
Макрос отключил, НО питание не передергивал. Вроде как должно бы быть, все по первому абзацу, т.е. должно бы заработать. Однако получил тотже перебор адресов с "вылетом".
Кстати пару раз после прошивки программы и пересброса(питанием) она начинала работать во FLASH'е. Но стоило выключить питание минут на несколько.. ВСЕ!

Когда начинается перебор адресов то первая команда CDPLE P0,14,C0,C14,C8,0 ??!!!
Во FLASH'е по нулевому адресу нормальная команда перехода LDR,[PC,#+24] (проверил Philips утилитой).
Чего это? Не туда ремапится? Но при автономной работе я же вижу (по светодиоду), что во FLASH"е начинает работать.
Andy Mozzhevilov
Цитата(DnTrm @ May 18 2009, 16:26) *
Макрос есть. Проработку попробовал отключить. Поставил точку останова перед своей инициализацией. При останове в регистрах уже нужные настройки!? Подозреваю, что пока JTAG сбрасывает процессор успевает проработаться загруженный в кристалл cstartup (как раз моя инициализация).

Да, там есть такое. Ядро по JTAG можно ввести в halt после запуска. С чем связано точно не помню, по-моему особенности EmbeddedICE.

Цитата
Дело в том, что IAR не грузит ничего он только сбрасывает процессор и "подхватывает" исполняющуюся программу (я не сумел настроить IAR на загрузку и шью Philis'овской утилитой).

Так разберитесь, там все предельно просто.

Цитата
В точке останова обнулил BCFG0 (0x00000000) и BCFG1 (0x20000000). Затем по шагам проработал свою инициализацию.. Все OK! Инициализировалась теми же значениями, что и перед сбросом! Кстати все происходит, в отличии от RAM'овского вариаета отладки, в дизассемблере. Но это вроде так и должно быть?

Тогда еще смотрите правильность настройки МАМ. Смотрите errata на чип, свою ревизию чипа и ограничения для него по значениям МАМ.

Цитата
Стоп! Макрос-то отключил, а питание не выключал ! Сейчас отпишусь...
Макрос восстановил, питание передернул: Все работает. После сброса (0х00000000) перескакивает на cstartup еще раз инициирует память моим кодом (первый раз инициализация в макросе) и дальше работает как надо.
Макрос отключил, питание тоже передернул. После адреса 0х00000000 начинает переберать адреса последовательно 0х00000004, 0х00000008 и т.д. до первого BL и все... вылетает (пошаговой отладке кирдык, хотя остановить могу и даже сбросить в 0х00000000).

Сумбурно очень. Смотрите еще re-map векторов прерываний, регистр MEMMAP.
DnTrm
Andy Mozzhevilov, примите слова благодарности!
Все заработало! Спасибо за советы где искать!
Насчет сумбура согласен. Часть того, что наблюдал - под вопросом.
Рассказываю, что сделал:
Начал по одной ремить строчки Setup макроса и запускать отладчик.
Выяснил, что на строчке инициализации регистра PINSEL2 все и происходит, т.е. начинает работать (точнее не работать), как и при простом запуске без IAR'а. Регистр PINSEL2 при этом содержит 0x0F6009F4. В макросе же я инициировал значением 0x0F000924:

__writeMemory32(0x0F000924, 0xE002C014, "Memory");
//00001111 00000000 00001001 00100100
//bits 0 1 = xx(00) (reserved)
//bit 2 = 1 (pins P1.31:26 are used as a JTAG port)
//bit 3 = 0 (pins P1.25:16 are used as GPIO pins)
//bits 5 4 = 10 (pins P2.7:0 - D7:0
// pin P1.0 - CS0,
// pin P1.1 - OE,
// pin P3.31 - BLS0,
// pins P2.15:8 - D15:8,
// pin P3.30 - BLS1,
// pins P2.27:16 - D27:16,
// pins P2.29:28 - D29:28,
// pins P2.31:30 - D31:30,
// pins P3.29:28 - BLS2:3)
//bit 6 = x(0) (controls the use of pin P3.29 is not, as bits 5:4 are 10)
//bit 7 = x(0) (controls the use of pin P3.28 is not, as bits 5:4 are 10)
//bit 8 = 1 (pin P3.27 - WE)
//bits 10 9 = xx(00) (reserved)
//bit 11 = 1 (pin P3.26 - CS1)
//bit 12 = x(0) (reserved)
//bit 13 = x(0) (controls the use of pin P3.23 is not, as bits 25:23 are 110)
//bits 15 14 = 00 (pin P3.25 are used as GPIO pin)
//bits 17 16 = 00 (pin P3.24 are used as GPIO pin)
//bits 19 18 = xx(00) (reserved)
//bit 20 = x(0) (controls the use of pin P2.29:28 is not, as bits 5:4 are 10)
//bit 21 = x(0) (controls the use of pin P2.30 is not, as bits 5:4 are 10)
//bit 22 = x(0) (controls the use of pin P2.31 is not, as bits 5:4 are 10)
//bit 23 = 0 (P3.0 are used as GPIO pin)
//bit 24 = 1 (P3.1 - A1)
//bits 27 25 = 111 (P23:2 - A23:2)
//bits 31 28 = xxxx(0000) (reserved)

Кдючевым оказалось то, что при значении 0x0F6009F4 биты 5, 4 равны 11 и внешняя шина данных отсутствует!
После того, как добавил следующий код в cstartup, все заработало:

CODE32
?cstartup
. . .
; Add initialization nedded before setup of stackpointers here

; Initialization of MEMMAP
MOV R1,#0xE0000000
ORR R1,R1,#0x1FC000

#ifdef RAM_MAP
;MEMMAP = 2;
MOV R2,#0x2
#endif
#ifdef ROM_MAP
;MEMMAP = 1;
MOV R2,#0x1
#endif
STR R2,[R1,#+64]
;Set Data bus functionality
;PINSEL1 = 0x0;
;GPIO for P0.16 - P0.25 and P0.27 - P0.30
MOV R0,#0xE0000004
ORR R0,R0,#0x2C000
MOV R1,#0x0
STR R1,[R0,#+0]

;PINSEL2 &= 0x00000004;
LDR R1,[R0,#+16]
AND R1,R1,#0x4
STR R1,[R0,#+16]

;PINSEL2 |= 0x0F000920;
;00001111 00000000 00001001 00100000
LDR R1,[R0,#+16]
MOV R2,#0xF000000
ORR R2,R2,#0x920
ORR R1,R2,R1
STR R1,[R0,#+16]

; Initialization of EMC
; BCFG0=0x10002480;
; FLASH 16bit; IDCY = 1; WST1 = 4; RBLE = 1; WST2 = 4
; 00010000 00000000 00100100 10000000
MOV R1,#0xF0000000
ORR R1,R1,#0xFE00000
MOV R2,#0x10000000
ORR R2,R2,#0x2480
STR R2,[R1,#+0]

; BCFG1=0x20000400;
; SRAM 32bit; IDCY = 1; WST1 = 0; RBLE = 1; WST2 = 0
; 00100000 00000000 00000100 00000000
MOV R2,#0x20000000
ORR R2,R2,#0x400
STR R2,[R1,#+4]

. . .

MEMMAP, наверно, можно было не инициировать, т.к. на старте в нем уже единица (подтянутая ножка P0.14 + KS по адресу 0х00000014), но я его проинициировал на всякий случай.
Биты 5 и 4 PINSEL2 после сброса в единицах, я так понимаю, тоже из-за внутренних подтяжек на соответствующих пинах ( BOOT1:0 ).

Много получилось, но зато поделился изысканиями! :0)
Еще раз спасибо! Успехов!
Думаю, что загляну еще и нераз! Пока.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.