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

JTAG отладка Allwinner H5 (Cortex-A53)

 

8 minutes ago, GenaSPB said:

Попробуйте базовый адрес на 28000 поменять 

Без изменений

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда fel работает,  для загрузок в h616 доступна область с 28000. Разумеется с уменьшением размера  (стек куда настроен?)

https://github.com/ua1arn/hftrx/tree/develop/arch/aw_t507

Если интересно,  cmsis headers для h616/t507. .svd файлы генерирую но немного с форматом ошибся.. но мне как-то не сильно надо - если кто починит genregdefs - то здорово 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, GenaSPB said:

Когда fel работает,  для загрузок в h616 доступна область с 28000. Разумеется с уменьшением размера  (стек куда настроен?) 

Стеком линкер занимается, там только размер задается(в примере 256), он его кладет в RAM, и если что то не лезет, то проект не соберется.

Да и не имеет это значения, раз инструкции не выполняются, дело до инициализации стека не доходит. Начальное значение SP показывает куда то в область DRAM (скрин)

image.thumb.png.df2ab73eeccde7a965dc2b3af717578f.png

1 hour ago, GenaSPB said:

https://github.com/ua1arn/hftrx/tree/develop/arch/aw_t507

Если интересно,  cmsis headers для h616/t507. .svd файлы генерирую но немного с форматом ошибся.. но мне как-то не сильно надо - если кто починит genregdefs - то здорово 

Спасибо, у меня свои: https://github.com/grinux/sunxi-svd

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, grinux сказал:

Стеком линкер занимается, там только размер задается(в примере 256), он его кладет в RAM, и если что то не лезет, то проект не соберется.

Не только линкер. Ещё им занимается программист, правильно указывая содержимое 0-го слова таблицы прерываний.

2 часа назад, grinux сказал:

Да и не имеет это значения, раз инструкции не выполняются, дело до инициализации стека не доходит. Начальное значение SP показывает куда то в область DRAM (скрин)

В область динамической ОЗУ? А почему SP туда указывает? А не в область внутренней SRAM.

И инициализирован ли контроллер DRAM, к этому моменту? А то может у вас всё колом встаёт из-за того, что обращаетесь к DRAM, а её контроллер ещё не запущен?

 

PS: И вообще - откуда взят столь бессмысленный код:

4 часа назад, grinux сказал:

там пустой main и стандартная инициализация от iar

 image.png.8ed6d8f5a57ca4c49f43944f51a5652d.png

?  :wacko2:  Что вы тут делаете??? Понимаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там типовое начало с выключем кеша похоже... до стека не дошло. 

Я думаю проблема отлалчика iar.

Автору зажечь светодиод пожелаем 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там куча бессмысленных операций типа:

MOVW R1, #0
MOVT R1, #0
BIC SP, R1, #7

Какой смысл грузить 0 в R1 так сложно? Если то же самое делается одной короткой командой: MOVS R1, #0  

А потом ещё и выравнивать этот 0 на границу 64 бит? 0 уже и так выравнен сам по себе.

И в результате в SP будет загружен 0. Который явно не является допустимым адресом для стека.

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

А это:

BIC R0, R0, #31
ORR R0, R0, #31

что за дичь??? На кой сперва обнулять 5 младших бит, а затем сразу устанавливать там 1-цы???  :fool:

Команда BIC R0, R0, #31 тут совершенно бессмысленна.

 

И последняя загрузка SP значением 0x00024100 тоже выглядит странно. Опять - с бессмысленным выравниванием уже выравненного. Есть ли по этому адресу вообще какая-то ОЗУ в данный момент (сразу после старта МК)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, GenaSPB сказал:

Там типовое начало с выключем кеша похоже... до стека не дошло. 

 И правда, какое-то странное "типовое" начало, ИАР в данном случае может только отключать кэш, включение на данной архитектуре таким образом бессмысленно абсолютно. Мне кажется нужно действительно для начала сделать минимальную РАБОЧУЮ прогу включения светодиода, протестировать ее загрузкой через усб и потом уже попробовать прогнать ее же уже jtag-ом, ИМХО...

6 часов назад, jcxz сказал:

Но ТС откуда-то его выдрал без всякой такой настройки.

Может в ИАРе не все настройки проекта сделаны...

7 часов назад, GenaSPB сказал:

Автору зажечь светодиод пожелаем

Именно)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, GenaSPB сказал:

Автору зажечь светодиод пожелаем 

Автору пожелаем вдумываться в то, что он откуда-то выдирает и вставляет в свой код. Иначе даже до светодиода не дойдёт.

А также почитать мануал на контроллер в части работы его после снятия RESET-а (какое ядро/ядра активны после снятия RESET? по какому адресу должна находиться таблица прерываний этого ядра? какие регионы памяти активны сразу после сброса? и т.п.) Надеюсь - такой мануал имеется (я не имею практического опыта с Allwinner-ами). Если тыкать наугад (как сейчас), то тыкать так можно долго.

 

PS: Буквально на днях осваивал новый для себя МК (XMC7200) о 3-х ядрах (CM0+ + CM7 + CM7). Так хватило всего 1го дня (вперемешку с другой работой) чтобы дойти до мигающего светодиода и опроса кнопок. Без всяких примеров и даже при том, что поддержка этого МК отсутствует в IAR. Просто даташит + мануал на МК и на семейство. Никаких чужих накачанных с инета кодов не использовал и не смотрел.

В XMC7200 после снятия RESET активно только CM0+ ядро. Ядра CM7 в дальнейшем должны быть проинициализированы и запущены уже программой пользователя, выполняющейся на CM0+.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@jcxz, по-вашему там внутри гном сидит и делает упреждающее чтение блока команд и, видя, что стеки будут нулевые и регистр инициализируется не оптимально, отказывается инкрементировать PC.

SP устанавливается в ноль два раза для режимов IRQ и FIQ потому, что стеки для этих режимов не заданы. Если их задать, то ничего не меняется (разумеется).

Код который это делает это стандартный cstartup для v7 от IAR:

Spoiler

#define MODE_MSK 0x1F            ; Bit mask for mode bits in CPSR

#define USR_MODE 0x10            ; User mode
#define FIQ_MODE 0x11            ; Fast Interrupt Request mode
#define IRQ_MODE 0x12            ; Interrupt Request mode
#define SVC_MODE 0x13            ; Supervisor mode
#define MON_MODE 0x16            ; Monitor mode
#define ABT_MODE 0x17            ; Abort mode
#define HYP_MODE 0x1A            ; Hypervisor mode
#define UND_MODE 0x1B            ; Undefined Instruction mode
#define SYS_MODE 0x1F            ; System mode


        MRS     r0, cpsr                ; Original PSR value

        ;; Set up the interrupt stack pointer.

        BIC     r0, r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0, r0, #IRQ_MODE       ; Set IRQ mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     r1, =SFE(IRQ_STACK)     ; End of IRQ_STACK
        BIC     sp,r1,#0x7              ; Make sure SP is 8 aligned

        ;; Set up the fast interrupt stack pointer.

        BIC     r0, r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0, r0, #FIQ_MODE       ; Set FIR mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     r1, =SFE(FIQ_STACK)     ; End of FIQ_STACK
        BIC     sp,r1,#0x7              ; Make sure SP is 8 aligned

        ;; Set up the normal stack pointer.

        BIC     r0 ,r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0 ,r0, #SYS_MODE       ; Set System mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     r1, =SFE(CSTACK)        ; End of CSTACK
        BIC     sp,r1,#0x7              ; Make sure SP is 8 aligned

        ;; Turn on core features assumed to be enabled.
          FUNCALL __iar_program_start, __iar_init_core
        BL      __iar_init_core

        ;; Initialize VFP (if needed).
          FUNCALL __iar_program_start, __iar_init_vfp
        BL      __iar_init_vfp

;;;
;;; Add more initialization here
;;;

;;; Continue to __cmain for C-level initialization.

          FUNCALL __iar_program_start, __cmain
        B       __cmain

        END
 

Как видите, инструкции там нормальные. 

У меня не программа крашится, а выполнения не происходит. Это не может быть связано ни с каким потенциально кривым кодом, т.к. до выполнения этого кода дело не доходит. 

2 minutes ago, jcxz said:

Автору пожелаем вдумываться в то, что он откуда-то выдирает и вставляет в свой код. Иначе даже до светодиода не дойдёт.

А также почитать мануал на контроллер в части работы его после снятия RESET-а (какое ядро/ядра активны после снятия RESET? по какому адресу должна находиться таблица прерываний этого ядра? какие регионы памяти активны сразу после сброса? и т.п.) Надеюсь - такой мануал имеется (я не имею практического опыта с Allwinner-ами). Если тыкать наугад (как сейчас), то тыкать так можно долго.

Проходите мимо уже. Почитать мануал и некрасивые инструкции, - не стоит время тратить на такие советы.

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, grinux сказал:

@jcxz, по-вашему там внутри гном сидит и делает упреждающее чтение блока команд и, видя, что стеки будут нулевые и регистр инициализируется не оптимально, отказывается инкрементировать PC.

Думаю - вы не изучили даташит на предмет начальной работы CPU после снятия RESET.

Или у вас выполнился какой-то начальный bootcode, который что-то запустил. Оно там работает и что-то делает.

И отладчик возможно подключился куда-то не туда.

19 минут назад, grinux сказал:

SP устанавливается в ноль два раза для режимов IRQ и FIQ потому, что стеки для этих режимов не заданы. Если их задать, то ничего не меняется (разумеется).

Зачем их устанавливаете в 0? А если произойдёт прерывание что будет с 0 d SP? Может оно у вас и происходит?

И почему SP устанавливается в 0 так странно? Это можно сделать одной командой.

19 минут назад, grinux сказал:

Код который это делает это стандартный cstartup для v7 от IAR:

...

Как видите, инструкции там нормальные. 

Вижу - код нормальный. У вас же совершенно другое. Почему не использовать этот код? Выделив реальные блоки реальной ОЗУ под все стеки, указанные в этом коде (IRQ_STACK, FIQ_STACK, ...)?

Что за адрес (0x00024100) вы грузите в SP, с которым потом запускаете си-стартап? По этому адресу есть ОЗУ вообще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, grinux сказал:

SP устанавливается в ноль два раза для режимов IRQ и FIQ потому, что стеки для этих режимов не заданы.

Кто вам это сказал? До вас там поработал бутром, проинитил клоки, прерывания, усб девайс и еще много чего. Ваш jtag если это принудительно не сбросил, то там может быть все, что угодно...

 

37 минут назад, grinux сказал:

Почитать мануал и некрасивые инструкции

На счет некрасивых инструкций, это ладно, лирика, но без чтения мануала чего вы хотите получить?

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, jcxz said:

Думаю - вы не изучили даташит на предмет начальной работы CPU после снятия RESET.

Или у вас выполнился какой-то начальный bootcode, который что-то запустил. Оно там работает и что-то делает.

И отладчик возможно подключился куда-то не туда.

Зачем их устанавливаете в 0? А если произойдёт прерывание что будет с 0 d SP? Может оно у вас и происходит?

И почему SP устанавливается в 0 так странно? Это можно сделать одной командой.

Вижу - код нормальный. У вас же совершенно другое. Почему не использовать этот код? Выделив реальные блоки реальной ОЗУ под все стеки, указанные в этом коде (IRQ_STACK, FIQ_STACK, ...)?

Что за адрес (0x00024100) вы грузите в SP, с которым потом запускаете си-стартап? По этому адресу есть ОЗУ вообще?

Код у меня совершенно такой же. Это он и есть, только в окошке дизассемблера.

Ну давайте я вам расскажу про Alwinner и IAR? Зачем участвовать в теме, которая вам не близка? 

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 минут назад, grinux сказал:

отказывается инкрементировать PC.

Проверьте еще раз, грузите код и запускаете ядро 0 или какое-то другое, при старте будет работать только нулевое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, mantech said:

Кто вам это сказал? До вас там поработал бутром, проинитил клоки, прерывания, усб девайс и еще много чего. Ваш jtag если это принудительно не сбросил, то там может быть все, что угодно...

 

На счет некрасивых инструкций, это ладно, лирика, но без чтения мануала чего вы хотите получить?

 

Стеки для режимов не заданы мной в конфигурации линкера. То что они не заданы, никак не влияет на то, что не происходит выполнения инструкции после того как IAR после загрузки инициализирует PC нужным значением.

Чтение мануала и совет по чтению мануала это разные вещи. Универсальный ответ когда нечего сказать по делу, но сказать что то хочется.

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, mantech said:

Проверьте еще раз, грузите код и запускаете ядро 0 или какое-то другое, при старте будет работать только нулевое.

Проверил. Все ядра кроме 0-го в ресете.

Также убедился, что 0-e ядро не в режиме WFI.

Попробую Keil. J-Link commander читает адекватное значение SP в отличие от IAR.

image.thumb.png.3dcec804d7e9b1560d3b3500b2910cf9.png

Изменено пользователем grinux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...