реклама на сайте
подробности

 
 
> Научите работать с IAR и AT91SAM7S
solder
сообщение Oct 5 2006, 10:41
Сообщение #1





Группа: Новичок
Сообщений: 13
Регистрация: 21-04-06
Пользователь №: 16 337



Проблемма в следующем:

если компилить сей код с высокой оптимизацией - то всё работает,
если без оптимизации то нет.

может ещё какая инициализация нужна?
(что такое sturtup и куда его пихать?)

и вообще - как грамотно проект настроить.
загружаю я бинарнрик SAM-Bой с 0х100000

-------------------------------------------------------

#include "ioat91sam7s256.h"
#define __inline inline
#include "..\src\examples\Atmel\SAM7S256\Include\lib_AT91SAM7S256.h"


#define set(a,cool.gif ((a) |= (cool.gif)
#define clr(a,cool.gif ((a) &=~ (cool.gif)
#define bit(a,cool.gif ((a) & (cool.gif)

#define LED_G ((unsigned int)0x1 << 18)
#define LED_Y ((unsigned int)0x1 << 17)
#define BUT_G ((unsigned int)0x1 << 19)
#define BUT_Y ((unsigned int)0x1 << 20)

#define LedOn(a) AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,a)
#define LedOff(a) AT91F_PIO_SetOutput(AT91C_BASE_PIOA,a)
#define Press(a) (!bit(AT91F_PIO_GetInput(AT91C_BASE_PIOA),a))




int main()
{

AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ;

// Disable watchwog
AT91F_WDTSetMode(AT91C_BASE_WDTC,AT91C_WDTC_WDDIS);// AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;


//Enabling the Main Oscillator:
// Start up time = 8 * 6 slow clock time
AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
//Wait the startup time
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MOSCS)){}


//Setting PLL and divider:
//18432 / 192 * 625 = 60000(MHz);
//Wait 1 slow clock cycle
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 192) | (AT91C_CKGR_PLLCOUNT & (1<<8)) | (AT91C_CKGR_MUL & (624<<16)));


// Wait the startup time
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_LOCK)){}
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY)){}

//Selection of Master Clock and Processor Clock
//select the PLL clock
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK ;
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK ;
while(!bit(AT91C_BASE_PMC->PMC_SR , AT91C_PMC_MCKRDY));


//enable the clock of the MC
AT91F_MC_CfgPMC (); // AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS)
//enable the clock of the PIO
AT91F_PIOA_CfgPMC ();// AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA)

//configure ports
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,LED_G | LED_Y);// AT91C_BASE_PIOA->PIO_PER; ->PIO_OER
AT91F_PIO_CfgInput (AT91C_BASE_PIOA,BUT_G | BUT_Y);// AT91C_BASE_PIOA->PIO_ODR; ->PIO_PER




while(1)
{
if(Press(BUT_Y)) LedOn (LED_Y);
else LedOff(LED_Y);
}

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
solder
сообщение Oct 6 2006, 06:03
Сообщение #2





Группа: Новичок
Сообщений: 13
Регистрация: 21-04-06
Пользователь №: 16 337



Похоже на правду.

только есть ещё два вопроса.

1. Почему же компилятор не добавляет в проект стартап по умолчанию, если проект состоит просто из сишного файла с main() на борту?

2. Как свой стартап конектится к проекту? Добавляется ассемблерный файл и всё, готово?
Go to the top of the page
 
+Quote Post
Edmundo
сообщение Oct 6 2006, 07:53
Сообщение #3


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Цитата(solder @ Oct 6 2006, 10:03) *
Похоже на правду.

только есть ещё два вопроса.

1. Почему же компилятор не добавляет в проект стартап по умолчанию, если проект состоит просто из сишного файла с main() на борту?

2. Как свой стартап конектится к проекту? Добавляется ассемблерный файл и всё, готово?

Вообще любой процессор имеет некоторый стартовый адрес, с которого он начинает свое выполнение после RESET'а. Как правило это 0-вой адрес. Бывает еще так, что в этой области (начиная с нулевого адреса) размещается таблица прерываний. Следовательно надо в этом нулевом адресе пославить прыжок на начало вашей программы. Этим и занимается стартап-файл. Чтобы код стартап-файла записался именно в нулевые адреса, а не туда, куда придется, нужно отлинковать его в нужную секцию. Для этого (и не только для этого) существует xcl-файл, дающий указания линкеру.

Ну а если вы хотите программировать на Си, а не на ассемблере, вам необходимо проинициализировать Сишное окружение (run-time initialization переменных, и т.п. -- что конкретно для АРМ, не знаю, но по аналогии наверное что-то похожее). Поэтому перед выполнением main надо выполнить эту инициализирующую функцию. Отсюда:

1. Он не добавляет, оставляя вам свободу делать так, как вы хотите. А вдруг вы будете писать на АСМе, а он добавит Сишный стартап.
2. Добавляется файл (можно и Сишный, но на Си трудновато все точно разместить, ведь в таблице прерываний каждый вектор должен занимать строго определенное место) и главное, чтобы секции кода этого файла лежали там, где надо (при помощи линкера).


--------------------
شامل
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016