Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TI AM1808
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
SAURIS GmbH
Ну видимо в пути поиска он первым стоит. Название файла одинаковое, его и отображает (но вовсе не в него заходит!). Просто подгружает файл и подсвечивает некую совершенно бредовую строку кода, согласно таблице номеров строк из совершенно отвлеченного объектного модуля.
doom13
У меня есть только c:\ti\ccsv5\tools\compiler\arm_5.1.1\lib\, в ней папки src с boot.asm нету!?
SAURIS GmbH
Цитата(doom13 @ Jun 27 2014, 14:51) *
У меня есть только c:\ti\ccsv5\tools\compiler\arm_5.1.1\lib\, в ней папки src с boot.asm нету!?

Значит сделайте ее, раскрыв тамошний архив rtssrc.zip туда. Или просто достаньте boot.asm из него
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 13:53) *
Значит сделайте ее, раскрыв тамошний архив rtssrc.zip туда. Или просто достаньте boot.asm из него

Помогло, прилинковал его к проекту, теперь обе конфигурации работают одинаково, заходят в один и тот же boot.asm и ходить по нему нормально стало.

Ещё добавил в include options данную папку и вообще шикарно стало, можно от _c_int00 по шагам добраться до main. При создании проекта почему-то подключает к пректу папку c:\ti\ccsv5\tools\compiler\arm_5.1.1\include, которой вообще нет, зачем? Это, по-идее, и болжна быть данная src с распакованным архивом?
SAURIS GmbH
Цитата(doom13 @ Jun 27 2014, 16:03) *
Помогло,

Кстати там четко откоментирован кусок, отвечающий за вход в user mode. Так что три движения мизинцем, и оно выключено.
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 15:15) *
Кстати там четко откоментирован кусок, отвечающий за вход в user mode. Так что три движения мизинцем, и оно выключено.

Да, так и сделал, спасибо за полезные советы.
SAURIS GmbH
Цитата(doom13 @ Jun 27 2014, 16:03) *
При создании проекта почему-то подключает к пректу папку c:\ti\ccsv5\tools\compiler\arm_5.1.1\include, которой вообще нет, зачем? Это, по-идее, и болжна быть данная src с распакованным архивом?


Она там есть. Ее не может там не быть. Там лежат все стандартные инклуды, "stdio.h", "stdlib.h", "limits.h" и пр. Без этого у Вас бы ничего бы вообще не скомпилировалось с применением стандартных #include
doom13
Цитата(SAURIS GmbH @ Jun 27 2014, 16:13) *
Она там есть. Ее не может там не быть. Там лежат все стандартные инклуды, "stdio.h", "stdlib.h", "limits.h" и пр. Без этого у Вас бы ничего бы вообще не скомпилировалось с применением стандартных #include

Да, есть, что-то я, наверное, не то смотрел.
doom13
Приветствую.
Возник вопрос с прерыванием, вся инициализация проделана по аналогии с примером (правильно), но не заходит в обработчик прерывания.
Нашёл, что перед main (в примере у которого всё работает) выполняется кусок кода, который копирует вектор прерываний:
Код
static void CopyVectorTable(void)
{
    unsigned int *dest = (unsigned int *)0xFFFF0000;
    unsigned int *src =  (unsigned int *)vecTbl;
    unsigned int count;

    for(count = 0; count < sizeof(vecTbl)/sizeof(vecTbl[0]); count++)
    {
        dest[count] = src[count];
    }
}

, где 0xFFFF0000 - адрес ARM local RAM, у меня вектор прерываний лежал в On-Chip RAM, но при этом в Vector Base Register все адреса были прописаны правильно. Зачем нужно это копирование если адреса вектора прерываний и так были известны?
И второй вопрос по самому вектору:
Код
static unsigned int const vecTbl[14]=
{
    0xE59FF018,
    0xE59FF018,
    0xE59FF018,
    0xE59FF018,
    0xE59FF014,
    0xE24FF008,
    0xE59FF010,
    0xE59FF010,
    (unsigned int)Entry,
    (unsigned int)UndefInstHandler,
    (unsigned int)SWIHandler,
    (unsigned int)AbortHandler,
    (unsigned int)IRQHandler,
    (unsigned int)FIQHandler
};

, что означают константы 0xE59FF018, ... , 0xE59FF010 в таблице?
jcxz
Цитата(doom13 @ Jul 12 2014, 14:34) *
, где 0xFFFF0000 - адрес ARM local RAM, у меня вектор прерываний лежал в On-Chip RAM, но при этом в Vector Base Register все адреса были прописаны правильно. Зачем нужно это копирование если адреса вектора прерываний и так были известны?

Наверное контроллер прерывания AM1808 требует чтобы таблица векторов находилась с этого адреса.
Или вы спрашиваете почему на этапе компиляции вы сразу не разместили эту таблицу по адресу 0xFFFF0000?
Про AM1808 не знаю, но например в OMAP-L137 делается так же, там тоже вектора прерываний ARM-ядра прописываются в ARM local RAM уже после старта ПО.
Делается это по той причине, что первым в нём стартует DSP-ядро, ARM-ядро в это время в сбросе. Грузит и стартует прошивку DSP-ядро.
А оно не имеет доступа к ARM local RAM.
doom13
А что можно сказать по поводу констант, которе забиты в вектор прерываний, что это может быть?
DmitryM
Цитата(doom13 @ Jul 14 2014, 09:42) *
А что можно сказать по поводу констант, которе забиты в вектор прерываний, что это может быть?


код сомманды jmp
doom13
Если можно поясните здесь подробнее. Что-то не могу понять, что прописано в приведённом выше векторе прерываний. Счас читаю доки, но пока не нахожу ничего по данной теме. Entry - понятно, адрес заданной точки входа, UndefInstHandler, SWIHandler, AbortHandler, IRQHandler, FIQHandler - адреса соответствующих обработчиков. Константы выше Entry - 4 одинаковые 0xE59FF018, ещё 0xE59FF014, 0xE24FF008 и две одинаковые 0xE59FF010 - это всё JUMP? Это ведь должна быть таблица адресов по которым происходит переход при том или ином событии, каким боком здесь JUMP?

Описание вектора прерываний из даташита на рисунке, всё практически как в описанной выше таблице за исключением "констант".


Попробовал удалять или менять на нули эти константы, процессор запускается и работает, но при срабатывании прерывания вылетает.
jcxz
Цитата(doom13 @ Jul 14 2014, 14:50) *
Если можно поясните здесь подробнее. Что-то не могу понять, что прописано в приведённом выше векторе прерываний. Счас читаю доки, но пока не нахожу ничего по данной теме. Entry - понятно, адрес заданной точки входа, UndefInstHandler, SWIHandler, AbortHandler, IRQHandler, FIQHandler - адреса соответствующих обработчиков. Константы выше Entry - 4 одинаковые 0xE59FF018, ещё 0xE59FF014, 0xE24FF008 и две одинаковые 0xE59FF010 - это всё JUMP? Это ведь должна быть таблица адресов по которым происходит переход при том или ином событии, каким боком здесь JUMP?

Что такое дизассемблер знаете?
Даже без него могу предположить, что первые 8 строк - команды типа:
LDR PC,[PC,#N]
а следующие 8 строк - это собственно таблица адресов, которая считывается первыми 8-ю командами.
DmitryM
Цитата(jcxz @ Jul 14 2014, 12:11) *
Даже без него могу предположить, что первые 8 строк - команды типа:
LDR PC,[PC,#N]
а следующие 8 строк - это собственно таблица адресов, которая считывается первыми 8-ю командами.

Совершенно верно, кроме шестого вектора, который Reserved.
doom13
Цитата(jcxz @ Jul 14 2014, 12:11) *

Цитата(DmitryM @ Jul 14 2014, 13:12) *

Спасибо, так и есть, если дизассм сделать, то получаем следующее:
Код
address   |
---------------------------------------------------------
80010000: | E59FF018     LDR           PC, 0x80010020
80010004: | E59FF018     LDR           PC, 0x80010024
80010008: | E59FF018     LDR           PC, 0x80010028
8001000c: | E59FF018     LDR           PC, 0x8001002C
80010010: | E59FF014     LDR           PC, 0x8001002C
80010014: | E24FF008     SUB           PC, PC, #0x8
80010018: | E59FF010     LDR           PC, 0x80010030
8001001c: | E59FF010     LDR           PC, 0x80010034
80010020: | XXXXXXX1    Entry_Adddress
80010024: | XXXXXXX2    UndefInstHandler_Adddress
80010028: | XXXXXXX3    SWIHandler_Adddress
8001002c: | XXXXXXX4    AbortHandler_Adddress
80010030: | XXXXXXX5    IRQHandler_Adddress
80010034: | XXXXXXX6    FIQHandler_Adddress

, что соответствует таблице векторов прерываний из даташита. Неверно посчитал - это должна быть таблица переходов на адреса обработчиков, а не просто их адресов.
Ещё не совсем понятна необходимость её переноса в ARM RAM? Получится ли сделать кусок кода на ассме, который отвечает за эти переходы, разместить его в секцию vectors, а её через CMD-файл прикрутить к ARM RAM?
Или поскольку к ARM RAM имеет доступ только сам ARM, то с эмулятором такой вариант точно не прокатит, а если это будет загрузчик, то подход тоже неверный, т.е. при старте программы всегда необходимо перебросить твблицу векторов прерываний в ARM RAM?
doom13
Приветствую.
Начинаю разбираться с работой MMC/SD контроллера и, забегая вперёд, хотел спросить:
1) MMC/SD контроллер после его конфигурации сам произведет инициализаию памяти и переведёт её в нужный режим работы?
2) Если контроллер поддерживает версию спецификации памяти, то мне опускаться до уровня команд MMC/SD не придётся, необходимо будет только писать/читать данные в/из его фифо?
doom13
Немного разобрался с работой MMC/SD контроллера, прошёл этап инициализации памяти. Надо браться за чтение/запись данных и тут не могу понять, каким образом настроить работу шины данных на x8.
Есть у контроллера регистр MMCCTL (рисунок 1), в котором есть биты отвечающие за ширину шины данных, но бит WIDTH1 (рисунок 2) используется, как Read Only. Как же тогда задать режим работы шины данных?
doom13
Приветствую! Помогите разобраться, куда копать. Проблема следующая.
Есть программа, заливаю её в процессор всё работает. В CCS v5.5 останавливаю процессор нажимаю "Suspend", далее нажимаю "CPU Reset", "Restart", "Resume", всё заново запускается и работает.
Добавляю кусок кода, который настраивает и использует прерывария от McBSP и тогда всё работает только один раз после включения питания либо Hard Reset-a.

В начале программы использую настройку прерываний, все функции из AM1808_StarterWare:
Код
IntAINTCInit();
//Enable IRQ for ARM (in CPSR)*/
IntMasterIRQEnable();
// Enable AINTC interrupts in GER */
IntGlobalEnable();
// Enable IRQ in AINTC */
IntIRQEnable();

при инициализации McBSP выполняется следующий кусок кода:
Код
IntRegister((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT), isr);
IntChannelSet((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT), (device_num ? AINTC_CHANNEL_5_MCBSP1RX : AINTC_CHANNEL_4_MCBSP0RX));
IntSystemEnable((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT));


Если поставить точку останова на IntIRQEnable(), дойдёт до неё, далее при нажатии на "Resume" опять попадает на эту же строку (каким-то образом само перезапустилось). Если убираем из программы настройку прерываний McBSP, всё будет работать нормально.

UPP:

Хочу уточнить. Ещё раз всё посмотрел, получается, программа сбрасывается на самое начало. Ещё нашёл, что в CCS можно выбирать кнопку сброса "CPU Reset (SW)", "CPU Reset (HW)" и "System Reset". Так вот, если для программы с "глючным куском кода" делать "CPU Reset", то перезапустить её не получится, выполнение доходит до определённого места, а потом каким-то образом происходит сброс на начало. Если выполнить "System Reset" и "Restart", то программа запустится нормально. Для программы без использования прерывания от McBSP можно использовать любой вариант сброса. В чём отличие? И как сделать правильно, чтоб запускалось в любом случае?
akos
Помогите найти пример для работы с SD картой на AM1808
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.