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

 
 
 
Reply to this topicStart new topic
> Научите работать с 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
Edmundo
сообщение Oct 5 2006, 11:56
Сообщение #2


Мастер
****

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



Цитата(solder @ Oct 5 2006, 14:41) *
#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 set(a,B)    ((a) |=  (B))
#define clr(a,B)    ((a) &=~ (B))
#define bit(a,B)    ((a) &   (B))


--------------------
شامل
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 5 2006, 12:21
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Скорее всего у вас непроинициализирована память и (или стек) и (или) распределение памяти неправильное

Просто при выскоком уровне оптимизации все происходит в регистрах.
Go to the top of the page
 
+Quote Post
solder
сообщение Oct 5 2006, 12:25
Сообщение #4





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



Чуть чуть поднял настроение. Спасибо.

Ну а всётаки?

Все IARовские примеры перегружены вот этими файлами

at91SAM7S256_NoRemap.xcl
at91SAM7S256_64KRAM.xcl

SAM7.mac
SAM7_RAM.mac

Cstartup_SAM7.c
Cstartup.s79

вероятно это всё должно работать.

но не очень понимаю как они с main.c завязаны
и каков вообще поцесс сборки этогочуда

может кто просветит???



Цитата(KRS @ Oct 5 2006, 16:21) *
Скорее всего у вас непроинициализирована память и (или стек) и (или) распределение памяти неправильное

Просто при выскоком уровне оптимизации все происходит в регистрах.



Вот я также думаю.

Подскажите пожалуйста, как правильно это сделать.

Не так чтоб сэмпл взять да своего кода туда налить,
а так чтоб самому разобраться откуда ноги ростут.
Go to the top of the page
 
+Quote Post
solder
сообщение Oct 5 2006, 12:41
Сообщение #5





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



Отвечу сам себе.

В опциях линкера подключен LinkerCommandFile - это xxx.xcl
там разметка памяти и областей данных на этой памяти.
В принципе всё понятно.


Там же стоит галочка Overwrite Defaul Program Entry

Тоесть надо полагать, что прога не запустится с main(), а с какой-то функции
мжет быть в ассемблерном файле, который и потащит за собой AT91F_LowLevelInit() из Стартапа,
а потом и main().

Кто подробности знает?????
Подскажите?
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 5 2006, 13:41
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(solder @ Oct 5 2006, 16:41) *
Тоесть надо полагать, что прога не запустится с main(), а с какой-то функции
мжет быть в ассемблерном файле, который и потащит за собой AT91F_LowLevelInit() из Стартапа,
а потом и main().


Прога с main никогда не запускается, по умолчанию она запускается с
__program_start

исходники стнадартного стартапа лежат в
$EW_DIR$\arm\src\lib\

файл cstartup.s79 и содержит метку __program_start
и он входит в библиотеку, полные исходники библиотек есть только в полной версии, но исходники инициализации есть во всех.

если вы хотите изменить стандартный стратап
подключите свой файл и сделайте Overwrite Defaul Program Entry

в простейшем случае можно просто
1. проинитить стек
2. заполнить сегмент DATA_Z нулями
3. скопировать DATA_ID в DATA_I (или если отладка в памяти через JTAG сделать что бы эти сегменты находились по одному адресу)
4. перейти на main
Go to the top of the page
 
+Quote Post
solder
сообщение Oct 6 2006, 06:03
Сообщение #7





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



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

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

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

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


Мастер
****

Группа: Свой
Сообщений: 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
Kail
сообщение Oct 6 2006, 08:14
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 3-08-06
Пользователь №: 19 285



Когда начал изучать ARM, то первым делом выбирал среду программирования. IAR всем нравился - прежде всего безглючной работай wrigler черех H-JTAG, но убивало отсуствие в списке сырцов startup кода, тем более, что я всегда придерживался мысли, что изучать все нужно с основ, поэтому учил ассемблер и писал свой стартовый код. В этом отношении более прозрачен Keil, но с жтагом глючит. Откуда тянет стартовый код IAR я так и не разобрался, было бы интересно узнать, может тогда стоит и перелезть на него.
Go to the top of the page
 
+Quote Post
solder
сообщение Oct 6 2006, 09:49
Сообщение #10





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



Всем спасибо за советы.

На выходных попробую осилить smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 06:25
Рейтинг@Mail.ru


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