|
Старт c IAR+Sam7x |
|
|
|
Dec 24 2006, 23:43
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Здравствуйте. Получил плату от 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++); } }
|
|
|
|
|
 |
Ответов
|
Dec 26 2006, 13:45
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 26-01-05
Пользователь №: 2 200

|
Сергей Борщ, спасибо за описание, я хоть и пишу софт для АРМ, но пока пользовался шаблонами от 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, и др?
Спасибо
|
|
|
|
|
Dec 26 2006, 18:02
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SlavaCh @ Dec 26 2006, 12:45)  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 на С, но мне больше всего нравится первый вариант. Цитата(SlavaCh @ Dec 26 2006, 12:45)  2. В вашем описании нет выбора библиотеки, но при создании нового проекта во вкладке Project -> Options -> General Options -> Library configuration по умолчанию стоит Normal. Это можно оставить , или нужно поменять? Все, что не описано можно оставить как есть. Менять нужно лишь в том случае, если вы четко понимаете что вы меняете и что вам это действительно нужно менять. Цитата(SlavaCh @ Dec 26 2006, 12:45)  3. Как описывать обработчики исключений - data abort, и др? Учитывая, что спец. ключевых слов в описании компилятора (во всяком случае в версии 4.30) нет, то судя по всему только на асме. Ну в крайнем случае пролог/эпилог на асме и вызов основного обработчика, который уже на С. Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах. Цитата(Dopler @ Dec 26 2006, 09:03)  Цитата(Сергей Борщ @ Dec 25 2006, 15:55)  Спасибо, более-менее все работает, даже получилось создать проект без использования runtime библиотек, т.е. добавил весь необходимый минимальный код в проект. Буду теперь разбираться по шагам. Всем большое спасибо. Библиотеку все же желательно подключить. Из нее берется CStartup(если нет своего в проекте), из нее же берутся некоторые функции которые вы явно не вызываете (например у AVR конструкция switch при определенных условиях использует библиотечные функции, сдвиги на несколько битов). Что используется в ARM навскидку не скажу, но можно при помощи xlib распечатать список модулей библиотеки и поразмышлять над их названием. Нет смысла не подключать библиотеку. У IAR замечательный линкер, и ни одного лишнего (неиспользуемого) байта из библиотеки в проект не попадет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 26 2006, 18:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Dec 26 2006, 17:02)  Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах. Увы  , это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog.... Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 26 2006, 21:03
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 26-01-05
Пользователь №: 2 200

|
Цитата(zltigo @ Dec 26 2006, 18:20)  Цитата(Сергей Борщ @ Dec 26 2006, 17:02)  Откровенно говоря, кроме "ловушек"- зацикливания пока ничего не требовалось на этих векторах.
Увы  , это "паркетный" вариант, когда объект лежит на столе, к нему подключен JTAG и у него заблокирован Watchdog.... Для работы в реальных условиях для того, что-бы фиксировать факт вылета c последующей локализацией причины нужно писать реальный обработчик. Вот бы еще научиться писать реальные обработчики.. и можно эту тему перенести в FAQ.!! Может выложите пример как их правильно описать? Пока я нашел , что можно функцию описать как __swi void f(void) но опять вопрос - компилер сам поставит переход по нужному адресу этого прерывания, или нужно руками все описывать? спасибо
|
|
|
|
Сообщений в этой теме
Dopler Старт c IAR+Sam7x Dec 24 2006, 23:43 skn 1. Старт начинается как правило с адреса 00, сегме... Dec 25 2006, 01:07 Dopler Цитата(skn @ Dec 25 2006, 01:07) 1. Старт... Dec 25 2006, 08:22 IV_K если в проекте не указан cstartup.s90, то линкер в... Dec 25 2006, 11:09 Dopler Цитата(IV_K @ Dec 25 2006, 11:09) если в ... Dec 25 2006, 11:45 IV_K 1. lib\dl4tpainl8n.r79 и т.д. требуется при ... Dec 25 2006, 11:53 Dopler Цитата(IV_K @ Dec 25 2006, 11:53) 1. lib... Dec 25 2006, 13:15 IV_K от примеров пойдут, потом перепишете и допишете чт... Dec 25 2006, 13:34 Сергей Борщ Цитата(Dopler @ Dec 24 2006, 22:43) Здрав... Dec 25 2006, 15:55 Dopler Цитата(Сергей Борщ @ Dec 25 2006, 15:55) ... Dec 26 2006, 10:03  Dopler Цитата(Сергей Борщ @ Dec 26 2006, 18:02) ... Dec 26 2006, 20:46
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|