Dopler 0 24 декабря, 2006 Опубликовано 24 декабря, 2006 · Жалоба Здравствуйте. Получил плату от Olimex с SAM7X256. Спаял wiggler. Установил IAR 4.41a и Keil. Так как примеры у атмела и Olimex для IAR начал разбираться с ним. Запустил пример олимекса, более менее разобрался, поудалял все, в главном цикле сделал вывод миандра на pb22. Вроде работало, виглер шил через H-JTAG, правда из RAM отладка не работала, работала только через FLASH. Никаких стартапов в пректе я не нашел. Базовый пример от Atmela я прошивать не стал, так как он инициализирует линии, которые на плате от олимекса используются для разных других целей. Так вот, проблемы начались, когда я попытался создать совершенно пустой проект, откомпилировать и запустить в устройство (на С под железо раньше не писал). В связи с этим следующие вопросы: 1. Откуда запускается проект, с функции Main или откуда то еще? 2. Что за файлы .xcl (я понял, что это структура памяти для линковщика), как ими пользоваться, откуда брать и т.д. 3. Что за файлы mac для дебагера и можно ли без них (когда отключал, отладка не работала). 4. Если не сложно, то как по шагам сделать минимальный проект для отладки в RAM (как создать, какие файлы подключать, откуда брать, что прописать в настройках). Вот листинг моей программы. Этот код вроде работает в проекте от Olimex, перенести его в свой пустой у меня не получилось. #include "at91sam7xc256.h" //it's a simple delay void Delay (unsigned long a) { while (--a!=0); } int main() { //Enable RESET AT91C_BASE_RSTC->RSTC_RCR = 0xA5000008; AT91C_BASE_RSTC->RSTC_RMR = 0xA5000001; Delay(1000); // Set Flash Waite sate - Flash Memory Controler // if MCK = 47923200 I have 50 Cycle for 1 usecond AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS; // Watchdog Disable AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; // Set MCK at 47 923 200 // 1 Enabling the Main Oscillator: // SCK = 1/32768 = 30.51 uSecond // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN )); // Wait the startup time while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); // 2 Checking the Main Oscillator Frequency (Optional) // 3 Setting PLL and divider: // - div by 5 Fin = 3,6864 =(18,432 / 5) // - Mul 25+1: Fout = 95,8464 =(3,6864 *26) // for 96 MHz the erroe is 0.16% // Field out NOT USED = 0 // PLLCOUNT pll startup time estimate at : 0.844 ms // PLLCOUNT 28 = 0.000844 /(1/32768) AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16))); // Wait the startup time while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); // 4. Selection of Master Clock and Processor Clock // select the PLL clock divided by 2 AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ; while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); //enable the clock of the PIO AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; //enable the clock of the PIO AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB; // GPIO init AT91C_BASE_PIOA->PIO_ODR = 0xffffffff; // All as input AT91C_BASE_PIOB->PIO_ODR = 0xffffffff; // All as input AT91C_BASE_SYS->PIOA_PPUDR = 0xffffffff; // Disable Pull-up resistor AT91C_BASE_SYS->PIOB_PPUDR = 0xffffffff; // Disable Pull-up resistor AT91C_BASE_PIOB->PIO_OER = 1 << 22; for (;;) { unsigned int waiting_time; AT91C_BASE_PIOB->PIO_SODR = 1 << 22; for(waiting_time = 0; waiting_time < 2000; waiting_time++); AT91C_BASE_PIOB->PIO_CODR = 1 << 22; for(waiting_time = 0; waiting_time < 2000; waiting_time++); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skn 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 (изменено) · Жалоба 1. Старт начинается как правило с адреса 00, сегмент INTVEC в IAR. Поведение после старта описано в файле cstartup.s90. После инициализации стеков и, если надо, периферии переход на Вашу main. 2. В xcl описаны сегменты памяти, которые понимает IAR и, если необходимо, Ваши собственные. Там самое главное указать правильно адреса для размещения программы и данных. Два больших ключевых слова CODE и DATA - сегменты размещения программы и данных. В документации от IAR все очень хорошо расписано. Возьмите любой xcl из примеров, там комментариями все пояснено что куда. 3. Как я понял mac файлы нужны для первоначальной инициализации периферии перед запуском дебагера. Например у меня контроллер с внешей памятью SDRAM. И я хочу отлаживаться в ней. В mac файле прописываю значения нужных регистров, для инициализации PLL, SDRAM и пр. Далее контроллер перед заливкой программы начинает видеть SDRAM в своем адресном пространстве. 4. Для отладки в RAM надо учесть две вещи. Первое, чтобы Ваш код вместе с данными помещался в RAM. И второе - в xcl указать диапазон адресов, для всех сегментов расположенных в области программ, совпадающим с размещением Вашей RAM. Тут важно понимать, что у ARM адресное пространство единое и ему все равно откуда выполнять программу, главное указать компилятору где код, а где нет. Добавлю, что работая с IAR более четырех лет, не было ни одного вопроса, котрорый я не нашел бы в документации. Читайте внимательнее. Изменено 25 декабря, 2006 пользователем skn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба 1. Старт начинается как правило с адреса 00, сегмент INTVEC в IAR. Поведение после старта описано в файле cstartup.s90. После инициализации стеков и, если надо, периферии переход на Вашу main. А если файла cstartup.s90 нет в проекте, откуда стартует программа (в проекте олимекса такого файла нет)? 2. В xcl описаны сегменты памяти, которые понимает IAR и, если необходимо, Ваши собственные. Там самое главное указать правильно адреса для размещения программы и данных. Два больших ключевых слова CODE и DATA - сегменты размещения программы и данных. В документации от IAR все очень хорошо расписано. Возьмите любой xcl из примеров, там комментариями все пояснено что куда. 3. Как я понял mac файлы нужны для первоначальной инициализации периферии перед запуском дебагера. Например у меня контроллер с внешей памятью SDRAM. И я хочу отлаживаться в ней. В mac файле прописываю значения нужных регистров, для инициализации PLL, SDRAM и пр. Далее контроллер перед заливкой программы начинает видеть SDRAM в своем адресном пространстве. 4. Для отладки в RAM надо учесть две вещи. Первое, чтобы Ваш код вместе с данными помещался в RAM. И второе - в xcl указать диапазон адресов, для всех сегментов расположенных в области программ, совпадающим с размещением Вашей RAM. Тут важно понимать, что у ARM адресное пространство единое и ему все равно откуда выполнять программу, главное указать компилятору где код, а где нет. Я это более менее понимаю, но так как я совершенно не в теме, то сразу въехать в структуру программы не получилось. Более того, у IAR подсветка синтаксиса на столько убогая, что в иных местах коментарии от кода не отличишь. Поэтому и хочется минимально возможный рабочий пример. Добавлю, что работая с IAR более четырех лет, не было ни одного вопроса, котрорый я не нашел бы в документации. Читайте внимательнее. Документация у IAR представлена в виде десятка ядреных PDF, т.е. отсутствуют вразумительный поиск, ссылки и т.д. Буду читать дальше. Спасибо за ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IV_K 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба если в проекте не указан cstartup.s90, то линкер включает в проект стандартный код инициализации, уберите в свойствах дебугера галку run to main и посмотрите на этот код.. PS. примеры у иара должны быть рабочие Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба если в проекте не указан cstartup.s90, то линкер включает в проект стандартный код инициализации, уберите в свойствах дебугера галку run to main и посмотрите на этот код.. Это я уже понял научным тыком (удаляя все файлы из проекта от олимекс), а также понял, что требуется ему файл lib\dl4tpainl8n.r79, вопрос - почему именно этот? PS. примеры у иара должны быть рабочие Они рабочие, но расчитаны на боард от атмела, а там инициализируется много линий ввода/вывода, которые на плате олимекса подключены хрен знает куда, поэтому не хотел запускать в плату пример от IAR, но похоже пора эти заняться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IV_K 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба 1. lib\dl4tpainl8n.r79 и т.д. требуется при использовании c runtime library, это можно менять в library config в свойствах проекта, но тогда не будут доступны всякие memcpy, printf и т.д... 2. имхо проще код в си файле поменять, чем с самого начала ковыряться с настройками проекта =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба 1. lib\dl4tpainl8n.r79 и т.д. требуется при использовании c runtime library, это можно менять в library config в свойствах проекта, но тогда не будут доступны всякие memcpy, printf и т.д... 2. имхо проще код в си файле поменять, чем с самого начала ковыряться с настройками проекта =) Как раз если я пытаюсь отключить библиотеки в настройках, ничего не работает. Т.е. нужно подключить к проекту те файлы, которые перекомпиленные в библиотеке? Наверное, это стартапы и лоулевел иниты? А какие, интересно, конкретно взять? От примера для атмеловского борда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IV_K 0 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба от примеров пойдут, потом перепишете и допишете что надо.. для работы библиотек достаточно указать конфигурацию нормал и подключить *.h файлы типа stdio, stdlib.. посмотрите как сделано в примерах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 декабря, 2006 Опубликовано 25 декабря, 2006 · Жалоба Здравствуйте. 4. Если не сложно, то как по шагам сделать минимальный проект для отладки в RAM (как создать, какие файлы подключать, откуда брать, что прописать в настройках). 1) Запускаем IAR, создаем новый workspace или используем текущий. 2) Project->Create new project, выбираем C -> main или C++ -> main по вкусу, жмем ОК, указываем имя проекта. 3) Идем Project -> Options -> General Options 3.1)вкладка Target --- Ставим крыжик на Device, выбираем в списке тип процессора. Это заставит IAR правильно указывать компилятору/ассемблеру архитектуру (ARM7TDMI, ARM9E и т.д.), правильно выбрать библиотеку, указать симулятору подходящий файл описания sfr (.ddf). --- Выбираем Processor Mode Arm Или Thumb 4) Project -> Options -> С/С++ Compiler 4.1)вкладка Language --- В разделе Language галочка уже стоит где надо в зависимости от того, что мы выбрали в п.2. Можно переставиь ее на Automatic(extension based). 4.2)вкладка Optimization --- Для начала оставляем Size Low или Size none, позволит легко отлаживаться. По мере возрастания опыта можно будет увеличить до максимума. 4.3)вкладка List --- ставим галочку Output list file --- Ставим галочку Assembler mnemonics 5) Project -> Options -> Assembler 5.1) Вкладка List --- ставим галочку Output list file 6) Project -> Options -> Linker 6.1) Вкладка Output --- Если делаем проект для RAM оставляем все как есть, если для Flash - ставим галочку Allow C-SPY-specific output file и на вкладке Extra output ставим галочки Generate Extra output file и выбираем Output Format -> simple-code 6.2) Вкладка List --- ставим галочку Generate linker listing 6.3) Вкладка Config Копируем из папки примеров компилятора в папку проекта подходящий .xcl --- Link command file ставим галочку Override default, указываем $PROJ_DIR$\файл.xcl 7) Project -> Options -> Debugger 7.1) Вкладка Setup --- Выбираем Driver (Simulator/J-Link/Macraigor и т.д.) Копируем из папки примеров .mac в папку проекта --- Ставим галочку Use Macro File, указываем $PROJ_DIR$\файл.mac 7.2) Если отлаживаемся в Flash: Вкладка Download --- Если отлаживаемся в Flash, ставим галочки Verify download, Use flash loader(s) --- Жмем Edit, в появившейся форме New..., в появившемся окне настроек ничего не трогая жмем OK., Жмем ОК в форме выбора загрузчиков. 8) Если используем Wiggler, Project -> Options -> Macraigor --- Выбираем Wiggler в списке OCD interface device. Остальное можно не трогать. 9) File->Save all. Собственно все. Проект создан. На всякий случай прикладываю .xcl и .mac для AT91SAM7. В .xcl надо правильно указать макс. адреса ОЗУ и флеши для конкретного кристалла - сейчас там указан минимум который есть в любом SAM7. xcl_mac.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам. Всем большое спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Сергей Борщ, спасибо за описание, я хоть и пишу софт для АРМ, но пока пользовался шаблонами от IAR - брал простейший проект, и модифицировал его под свою задачу, но файлы CStartup оставлял. Можно еще неск вопросов: 1. Как работать с прерываниями? Достаточно описать ф-цию __irq __arm void f(void) , при выходе из которой надо сбросить регистр EIOCR, или необходимо делать еще какое-то описание по адресу 0х18?, ну и соотв настроить AIC. (В случае со стартапом - я объявляю функцию прерывания просто void, без __irq __arm, так как в стартапе есть асм код, который делает все сам) 2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять? 3. Как описывать обработчики исключений - data abort, и др? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба 1. Как работать с прерываниями? Достаточно описать ф-цию __irq __arm void f(void) , при выходе из которой надо сбросить регистр EIOCR, или необходимо делать еще какое-то описание по адресу 0х18?, ну и соотв настроить AIC. (В случае со стартапом - я объявляю функцию прерывания просто void, без __irq __arm, так как в стартапе есть асм код, который делает все сам) тут есть два подхода (точнее, считая и Ваш с Cstartupом, три): 1) на место вектора исключения при помощи асм-файла ставится команда безусловного перехода по адресу AIC_IVR: CODE32 COMMON INTVEC:CODE:ROOT org 0x00000018 LDR PC, AT91C_AIC_IVR END в С вы объявляете каждый обработчик с атрибутами __arm __irq. Это заставляет компилятор генерить отдельный пролог/эпилог для каждого обработчика, что конечно требует дополнительной памяти кода, но позволяет компилятору сгенерить пролог/эпилог максимально эффективно под конкретный обработчик (сохранять только нужные регистры), а вам индивидуально разрешать в отдельных обработчиках вложенные прерывания: __irq __arm void IRQ_Handler1() { ............. AT91C_BASE_AIC->AIC_EOICR = 0; } __irq __arm __nested void IRQ_Handler2() { ............. AT91C_BASE_AIC->AIC_EOICR = 0; } 2) Делается одна функция-обработчик в которой делается сохранение/восстановление регистров и из этой функции вызываются обработчики, которые представляют из себя обычные функции. Функция-обработчик "подвешивается" на вектор исключения стандартными средствами компилятора: #pragma vector = 0x0000018 __irq __arm void IRQ_Switch() { (void (*)(void))(AT91C_BASE_AIC->AT91C_AIC_IVR)(); AT91C_BASE_AIC->AIC_EOICR = 0; } void Handler1() { ........... } void Handler2() { ........... } 3) Ваш третий метод по сути тот же второй только на асме. Он получается чуть эффективнее чем вариант 2 на С, но мне больше всего нравится первый вариант. 2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять? Все, что не описано можно оставить как есть. Менять нужно лишь в том случае, если вы четко понимаете что вы меняете и что вам это действительно нужно менять. 3. Как описывать обработчики исключений - data abort, и др?Учитывая, что спец. ключевых слов в описании компилятора (во всяком случае в версии 4.30) нет, то судя по всему только на асме. Ну в крайнем случае пролог/эпилог на асме и вызов основного обработчика, который уже на С. Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах. Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам. Всем большое спасибо. Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах. Увы :(, это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog.... Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет. Библиотеки я стремился отключить исключительно для детального изучения процессора и среды. Т.е. с подключенными библиотеками, если какой-то модуль объявлен, но не описан, линкер приспокойно берет его из библиотеки. Естественно, в реальных программах библиотеки надо использовать, во всяком случае, они один из основных плюсов программирования на С под МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaCh 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах. Увы :(, это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog.... Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик. Вот бы еще научиться писать реальные обработчики.. и можно эту тему перенести в FAQ.!! Может выложите пример как их правильно описать? Пока я нашел , что можно функцию описать как __swi void f(void) но опять вопрос - компилер сам поставит переход по нужному адресу этого прерывания, или нужно руками все описывать? спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться