Дмитрий Агапов
Apr 13 2009, 05:54
Доброе утро вам
Пишу для тиона про 2 без ОС.
Программа скомпилирована по адресу 0x60000000 и оттуда же работает. Использую для заливки download.exe.
Оба банка SDRAM инициализированы и вроде как работают, поскольку в первом видео память на TFT. Стек может располагаться в любом банке, проверил, инициализируются все 4 банка SDRAM.
Вектора прерываний скопированы в SDRAM банк 0, по адресу 0x00000000, указал в файле линкера и проверил чтением из оттуда. Все вроде ок.
MMU выключен.
Но как только приходит прерывание, контроллер уходит непонятно куда...
По адресу 0x18 поставил включение светодиодов, никаких переходов ни по каким адресам из контроллера прерываний не делаю.
Но он туда не приходит...
В чем может быть дело? Или обязательно нужно MMU конфигурировать?
Куда копать?
2 дня и 2 ночи...
aaarrr
Apr 13 2009, 07:12
Цитата(Дмитрий Агапов @ Apr 13 2009, 09:54)

Или обязательно нужно MMU конфигурировать?
Не обязательно.
Цитата(Дмитрий Агапов @ Apr 13 2009, 09:54)

Куда копать?
Выложите свой минимальный неработающий проект - посмотрим.
Дмитрий Агапов
Apr 13 2009, 07:48
Выкладываю. Компилятор Keil. можно и ADS
aaarrr
Apr 13 2009, 08:11
Ваш листинг:
Код
72 00000040;_irqtest
73 00000040 E59F1224 ldr r1,=PEDR
74 00000044 E5912000 ldr r2,[r1,#0]
75 00000048 E20220FC and r2,r2,#0xfc; both off
76 0000004C E3822003 orr r2, r2, #3; both on
77 00000050 E5812000 str r2,[r1,#0]
78 00000054 EAFFFFFE b .
00000040 E59F1224 - это ldr r1,0x0000026c. По этому адресу у Вас ничего осмысленного не будет. Нельзя безнаказанно переносить даже простой код.
Да и не нужно переносить руками - можно спокойно прописать вектора в секции VECTORS, которая зачем-то забита пустотой.
Дмитрий Агапов
Apr 13 2009, 08:54
Это если линковать с адреса 0. если линковать со стартовым адресом 0x60000000, там там будет адрес порта E.
Вот что показывает IDA при загрузке в него готового бинарника. Вроде там так раз указатель на константу в FLASH(стартовый адрес 0x00000000). Ошибаюсь?
ROM:60000000 43 DCB 0x43 ; C
ROM:60000001 52 DCB 0x52 ; R
ROM:60000002 55 DCB 0x55 ; U
ROM:60000003 53 DCB 0x53 ; S
ROM:60000004 ; ---------------------------------------------------------------------------
ROM:60000004 5C F2 9F E5 LDR PC, =loc_60000058
ROM:60000008 ; ---------------------------------------------------------------------------
ROM:60000008 00 00 A0 E1 NOP
ROM:6000000C 00 00 A0 E1 NOP
ROM:60000010 00 00 A0 E1 NOP
ROM:60000014 00 00 A0 E1 NOP
ROM:60000018 00 00 A0 E1 NOP
ROM:6000001C 00 00 A0 E1 NOP
ROM:60000020 00 00 A0 E1 NOP
ROM:60000024 00 00 A0 E1 NOP
ROM:60000028 00 00 A0 E1 NOP
ROM:6000002C 00 00 A0 E1 NOP
ROM:60000030 00 00 A0 E1 NOP
ROM:60000034 00 00 A0 E1 NOP
ROM:60000038 00 00 A0 E1 NOP
ROM:6000003C 00 00 A0 E1 NOP
ROM:60000040 24 12 9F E5 LDR R1, =0x80840020
ROM:60000044 00 20 91 E5 LDR R2, [R1]
ROM:60000048 FC 20 02 E2 AND R2, R2, #0xFC
ROM:6000004C 03 20 82 E3 ORR R2, R2, #3
ROM:60000050 00 20 81 E5 STR R2, [R1]
ROM:60000054
ROM:60000054 loc_60000054 ; CODE XREF: ROM:loc_60000054j
ROM:60000054 FE FF FF EA B loc_60000054
ROM:60000058 ; ---------------------------------------------------------------------------
...
...
...
ROM:60000268 58 00 00 60 off_60000268 DCD loc_60000058 ; DATA XREF: ROM:60000004r
ROM:6000026C 20 00 84 80 dword_6000026C DCD 0x80840020 ; DATA XREF: ROM:60000040r
ROM:6000026C ; ROM:loc_60000058r
ROM:60000270 FC 50 01 80 dword_60000270 DCD 0x800150FC ; DATA XREF: ROM:60000068r
ROM:60000274 55 AA 00 00 dword_60000274 DCD 0xAA55 ; DATA XREF: ROM:60000078r
ROM:60000278 00 00 94 80 dword_60000278 DCD 0x80940000 ; DATA XREF: ROM:6000007Cr
ROM:6000027C 28 00 21 00 dword_6000027C DCD 0x210028 ; DATA XREF: ROM:60000088r
ROM:60000280 00 00 06 80 dword_60000280 DCD 0x80060000 ; DATA XREF: ROM:6000009Cr
ROM:60000284 18 00 08 80 dword_60000284 DCD 0x80080018 ; DATA XREF: ROM:60000114r
Ничего не понимаю... в стартате Reset_Handler этот код работает... Где то я гоню.(?)
вот показан код и для прерывания и при исполнении из флэш(Reset_Handler).
У ARM же нет никаких сегментов? чем будет отличаться при исполнении код из rom и ram?
или вот эта команда LDR R1, =0x80840020 указывает СМЕЩЕНИЕ? блин...
60000038 00 00 A0 E1 NOP
ROM:6000003C 00 00 A0 E1 NOP
ROM:60000040 24 12 9F E5 LDR R1, =0x80840020
ROM:60000044 00 20 91 E5 LDR R2, [R1]
ROM:60000048 FC 20 02 E2 AND R2, R2, #0xFC
ROM:6000004C 03 20 82 E3 ORR R2, R2, #3
ROM:60000050 00 20 81 E5 STR R2, [R1]
ROM:60000054
ROM:60000054 loc_60000054 ; CODE XREF: ROM:loc_60000054j
ROM:60000054 FE FF FF EA B loc_60000054
ROM:60000058 ; ---------------------------------------------------------------------------
ROM:60000058
ROM:60000058 loc_60000058 ; CODE XREF: ROM:60000004j
ROM:60000058 ; DATA XREF: ROM:off_60000268o
ROM:60000058 0C 12 9F E5 LDR R1, =0x80840020
ROM:6000005C 00 20 91 E5 LDR R2, [R1]
ROM:60000060 FC 20 02 E2 AND R2, R2, #0xFC
ROM:60000064 00 20 81 E5 STR R2, [R1]
ROM:60000068 00 D2 9F E5 LDR SP, =0x800150FC
ROM:6000006C 00 00 0F E1 MRS R0, CPSR
ROM:60000070 C0 00 80 E3 ORR R0, R0, #0xC0
ROM:60000074 00 F0 29 E1 MSR CPSR_cf, R0
ROM:60000078 F4 01 9F E5 LDR R0, =0xAA55
aaarrr
Apr 13 2009, 09:01
Цитата(Дмитрий Агапов @ Apr 13 2009, 12:54)

или вот эта команда LDR R1, =0x80840020 указывает СМЕЩЕНИЕ? блин...
Смещение относительно PC, естественно. И достаточно далекое смещение, о чем я и пытался сказать.
Дмитрий Агапов
Apr 13 2009, 10:00
Ё мое.... Спасибо вам огромное... Здоровья Вам и вашим детям))
Т.е. если обработчик в адресах 0x6000_0000, то по адресу 0х18 разместить команду перехода "B 0x600xxxxx" и там уже выполнять обработку прерывания? Я просто никогда не работал с векторами в ОЗУ. Или слинковать обработчик отдельным модулем по адресам в области 0x0000_0000 и скопировать код в ОЗУ?
при попытке разместить вектора в VECTORS, ругается
RM9200.s(44): error: A1186E: Code generated in data area
это же описание сегмента в ОЗУ...
aaarrr
Apr 13 2009, 10:06
Просто разместите обработчик тут:
Код
AREA VECTORS, CODE, READONLY
ARM
b . ; Reset
b . ; Undefined instruction
b . ; Software interrupt
b . ; Prefetch abort
b . ; Data abort
b . ; reserved
b irq_test ; IRQ
b . ; FIQ
irq_test
ldr r1,=PEDR
ldr r2,[r1,#0]
and r2,r2,#0xfc; both off
orr r2, r2, #3; both on
str r2,[r1,#0]
b .
Линкер разместит его по нулевому адресу, секция будет скопирована автоматически после перехода на __main.
Цитата(Дмитрий Агапов @ Apr 13 2009, 14:00)

это же описание сегмента в ОЗУ...
А что, в ОЗУ не может быть кода?

Обратите внимание на описание AREA.
Дмитрий Агапов
Apr 13 2009, 11:30
Может)
Проверил сейчас в отладчике. Все сделал как вы сказали
Место начиная с адреса 0х00000000 зарезервировалось под длину этой секции, дальше идут инициализированные данные и заполненные нулями. Так вот их __main инициализировал, а код из 0x00000000 не скопировал.
Может нужно отдельно как то указывать что это секцию нужно скопировать автоматически?
aaarrr
Apr 13 2009, 11:50
Цитата(Дмитрий Агапов @ Apr 13 2009, 15:30)

Может нужно отдельно как то указывать что это секцию нужно скопировать автоматически?
Странно как-то. А что оказалось на месте векторов?
Да, и запретите пока ICache.
Код
MRC p15, 0, R0, c1, c0, 0
orr r0,r0,#(1<<31)
orr r0,r0,#(1<<30)
bic r0,r0,#(1<<12)
mcr p15, 0, r0, c1, c0, 0
Дмитрий Агапов
Apr 13 2009, 12:04
Извиняюсь... это навороченный отладчик Keil не показывал что туда пишется пока не разрешил эту часть памяти на запись.. Все работает. Код копируется. Спасибо большое. Вечером буду прерывания проверять, как они работают из RAM.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.