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

 
 
 
Reply to this topicStart new topic
> кодить под арм, хочу научится мало мальски
_chaos_
сообщение May 20 2008, 08:43
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653



День добрый!
Необходимо чуть-чуть разобраться с разработкой под АРМ.
Что я имею: есть собранный сишный компилер. проги на нем пишу, так сказать высокоуровневые.
но необходимо научится работать с ГПИО и переводить проц в спящий режим. тут как я понимаю С++ и тп не поможет. нашел на сайте АТМЕЛ доки и какие-то либы к AT91SAM9260 а именно softpack-1.4-at91sam9260-ek-web.zip
там есть примеры, но не один пример не собирается: вываливается ошибка
chaos@penguin:~/Work/Eddy/App/Hibernate> make
/opt/lemonix/cdt/bin/arm-linux-gcc -Wall -mlong-calls -ffunction-sections -g -I../at91lib/boards/at91sam9260-ek -I../at91lib/peripherals -I../at91lib/components -I../at91lib -Dat91sam9260 -Dsdram -c -o obj/sdram_stdio.o ../at91lib/utility/stdio.c
../at91lib/utility/stdio.c:49: error: variable 'r' has initializer but incomplete type


возникло несколько вопросов:
1. поможет мне данная либа с этими 2мя задачами? если нет куда копать
2. как побороть ошибку?

Заранее благодарен
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 20 2008, 09:54
Сообщение #2


Гуру
******

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



Цитата(_chaos_ @ May 20 2008, 11:43) *
но необходимо научится работать с ГПИО и переводить проц в спящий режим. тут как я понимаю С++ и тп не поможет.
А как вы думаете, что делает эта библиотека? В конечном счете она пишет в регистры периферии. То же самое прекрасно делается на "С++ и т.п.". Весьма вероятно, что эта библиотека сама написана на "С++ и т.п.". Вам необходимо найти (или написать свой) заголовочный файл, в котором будут описаны регистры периферии (описаны как обычные volatile-переменные). Что-нибудь вроде ioAT91SAM9260.h. Скорее всего он есть в составе вашей библиотеки. А дальше читать описание процессора, разделы "ГПИО" и "спящий режим", там будет написано, за что отвечает каждый из регистров. Ну а дальше все сводится к присвоению данных соотвествующим переменным-регистрам.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_chaos_
сообщение May 20 2008, 10:31
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653



Цитата(Сергей Борщ @ May 20 2008, 12:54) *
Вам необходимо найти (или написать свой) заголовочный файл, в котором будут описаны регистры периферии (описаны как обычные volatile-переменные). Что-нибудь вроде ioAT91SAM9260.h. Скорее всего он есть в составе вашей библиотеки.

чего-то я недопанимаю sad.gif а как будут связаные переменные и регистры?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 20 2008, 11:32
Сообщение #4


Гуру
******

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



Цитата(_chaos_ @ May 20 2008, 13:31) *
чего-то я недопанимаю sad.gif а как будут связаные переменные и регистры?
А вы найдите этот файл и посмотрите. Вот, например, для AT91SAM7:
Код
typedef volatile unsigned int AT91_REG;// Hardware register definition
#define AT91_CAST(a) (a)
typedef struct _AT91S_CKGR {
    AT91_REG     CKGR_MOR;     // Main Oscillator Register
    AT91_REG     CKGR_MCFR;     // Main Clock  Frequency Register
    AT91_REG     Reserved0[1];     //
    AT91_REG     CKGR_PLLR;     // PLL Register
} AT91S_CKGR, *AT91PS_CKGR;
// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register --------
#define AT91C_CKGR_MOSCEN     (0x1 <<  0) // (CKGR) Main Oscillator Enable
#define AT91C_CKGR_OSCBYPASS  (0x1 <<  1) // (CKGR) Main Oscillator Bypass
#define AT91C_CKGR_OSCOUNT    (0xFF <<  8) // (CKGR) Main Oscillator Start-up Time
// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register --------
#define AT91C_CKGR_MAINF      (0xFFFF <<  0) // (CKGR) Main Clock Frequency
#define AT91C_CKGR_MAINRDY    (0x1 << 16) // (CKGR) Main Clock Ready
// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register --------
#define AT91C_CKGR_DIV        (0xFF <<  0) // (CKGR) Divider Selected
#define     AT91C_CKGR_DIV_0                    (0x0) // (CKGR) Divider output is 0
#define     AT91C_CKGR_DIV_BYPASS               (0x1) // (CKGR) Divider is bypassed
#define AT91C_CKGR_PLLCOUNT   (0x3F <<  8) // (CKGR) PLL Counter
#define AT91C_CKGR_OUT        (0x3 << 14) // (CKGR) PLL Output Frequency Range
#define     AT91C_CKGR_OUT_0                    (0x0 << 14) // (CKGR) Please refer to the PLL datasheet
#define     AT91C_CKGR_OUT_1                    (0x1 << 14) // (CKGR) Please refer to the PLL datasheet
#define     AT91C_CKGR_OUT_2                    (0x2 << 14) // (CKGR) Please refer to the PLL datasheet
#define     AT91C_CKGR_OUT_3                    (0x3 << 14) // (CKGR) Please refer to the PLL datasheet
#define AT91C_CKGR_MUL        (0x7FF << 16) // (CKGR) PLL Multiplier
#define AT91C_CKGR_USBDIV     (0x3 << 28) // (CKGR) Divider for USB Clocks
#define     AT91C_CKGR_USBDIV_0                    (0x0 << 28) // (CKGR) Divider output is PLL clock output
#define     AT91C_CKGR_USBDIV_1                    (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2
#define     AT91C_CKGR_USBDIV_2                    (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4

#define AT91C_BASE_CKGR      (AT91_CAST(AT91PS_CKGR)     0xFFFFFC20) // (CKGR) Base Address

// использование:

void Test()
{
    AT91C_BASE_CKGR->CKGR_MOR = AT91C_CKGR_MOSCEN | AT91C_CKGR_DIV_0 | AT91C_CKGR_USBDIV_0;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_chaos_
сообщение May 20 2008, 11:38
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653



Цитата(Сергей Борщ @ May 20 2008, 14:32) *

файл нашел. похоже на то что привели Вы
Код
#ifndef AT91SAM9260_H
#define AT91SAM9260_H

#ifndef __ASSEMBLY__
typedef volatile unsigned int AT91_REG;// Hardware register definition
#define AT91_CAST(a) (a)
#else
#define AT91_CAST(a)
#endif

// *****************************************************************************
//              SOFTWARE API DEFINITION  FOR System Peripherals
// *****************************************************************************
#ifndef __ASSEMBLY__
typedef struct _AT91S_SYS {
        AT91_REG         SDRAMC_MR;     // SDRAM Controller Mode Register
        AT91_REG         SDRAMC_TR;     // SDRAM Controller Refresh Timer Register
        AT91_REG         SDRAMC_CR;     // SDRAM Controller Configuration Register
        AT91_REG         SDRAMC_HSR;    // SDRAM Controller High Speed Register
        AT91_REG         SDRAMC_LPR;    // SDRAM Controller Low Power Register
        AT91_REG         SDRAMC_IER;    // SDRAM Controller Interrupt Enable Register
        AT91_REG         SDRAMC_IDR;    // SDRAM Controller Interrupt Disable Register
        AT91_REG         SDRAMC_IMR;    // SDRAM Controller Interrupt Mask Register
        AT91_REG         SDRAMC_ISR;    // SDRAM Controller Interrupt Mask Register
        AT91_REG         SDRAMC_MDR;    // SDRAM Memory Device Register
        AT91_REG         Reserved0[118];        //
        AT91_REG         SMC_SETUP0;    //  Setup Register for CS 0
        AT91_REG         SMC_PULSE0;    //  Pulse Register for CS 0
        AT91_REG         SMC_CYCLE0;    //  Cycle Register for CS 0
        AT91_REG         SMC_CTRL0;     //  Control Register for CS 0
        AT91_REG         SMC_SETUP1;    //  Setup Register for CS 1
        AT91_REG         SMC_PULSE1;    //  Pulse Register for CS 1
        AT91_REG         SMC_CYCLE1;    //  Cycle Register for CS 1
        AT91_REG         SMC_CTRL1;     //  Control Register for CS 1
        AT91_REG         SMC_SETUP2;    //  Setup Register for CS 2
        AT91_REG         SMC_PULSE2;    //  Pulse Register for CS 2
        AT91_REG         SMC_CYCLE2;    //  Cycle Register for CS 2
        AT91_REG         SMC_CTRL2;     //  Control Register for CS 2
        AT91_REG         SMC_SETUP3;    //  Setup Register for CS 3
        AT91_REG         SMC_PULSE3;    //  Pulse Register for CS 3
        AT91_REG         SMC_CYCLE3;    //  Cycle Register for CS 3
        AT91_REG         SMC_CTRL3;     //  Control Register for CS 3
        AT91_REG         SMC_SETUP4;    //  Setup Register for CS 4
        AT91_REG         SMC_PULSE4;    //  Pulse Register for CS 4
        AT91_REG         SMC_CYCLE4;    //  Cycle Register for CS 4
        AT91_REG         SMC_CTRL4;     //  Control Register for CS 4
        AT91_REG         SMC_SETUP5;    //  Setup Register for CS 5
        AT91_REG         SMC_PULSE5;    //  Pulse Register for CS 5
        AT91_REG         SMC_CYCLE5;    //  Cycle Register for CS 5
        AT91_REG         SMC_CTRL5;     //  Control Register for CS 5
        AT91_REG         SMC_SETUP6;    //  Setup Register for CS 6
        AT91_REG         SMC_PULSE6;    //  Pulse Register for CS 6
        AT91_REG         SMC_CYCLE6;    //  Cycle Register for CS 6
        AT91_REG         SMC_CTRL6;     //  Control Register for CS 6
        AT91_REG         SMC_SETUP7;    //  Setup Register for CS 7
.............


по поводу примера использования: разве в юзер моде этот код не вылетит(Segmentation fault)?

все верно, вылетит sad.gif
Код
#include "AT91SAM9260.h"
#include <stdio.h>

int main()
{
    printf("PMC_SCSR=%X\n", AT91C_BASE_PMC);
    printf("PMC_SCSR=%X\n", AT91C_BASE_PMC->PMC_SCDR);//Тута будет БАБАХ!!!!!
    return 0;
}


как быть? в режиме ядра необходимо выполнять или можно как еще?

Сообщение отредактировал _chaos_ - May 20 2008, 11:37
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 20 2008, 12:03
Сообщение #6


Гуру
******

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



Цитата(_chaos_ @ May 20 2008, 14:38) *
по поводу примера использования: разве в юзер моде этот код не вылетит(Segmentation fault)?

все верно, вылетит sad.gif
Вот тут я пас. Для таких больших не писал, а маленькие Segmentation fault не умеют


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_chaos_
сообщение May 20 2008, 12:23
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653



Цитата(Сергей Борщ @ May 20 2008, 15:03) *
Вот тут я пас. Для таких больших не писал, а маленькие Segmentation fault не умеют

как же быть
1111493779.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 20 2008, 12:55
Сообщение #8


Гуру
******

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



Цитата(_chaos_ @ May 20 2008, 15:23) *
как же быть
1111493779.gif
Посмотреть исходники той самой библиотеки?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
amw
сообщение May 20 2008, 17:18
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(_chaos_ @ May 20 2008, 14:38) *
по поводу примера использования: разве в юзер моде этот код не вылетит(Segmentation fault)?
как быть? в режиме ядра необходимо выполнять или можно как еще?

А у Вас ОС есть?
Если есть - либо драйвер писать либо /dev/mem Ваш (не)друг.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 19:47
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ May 20 2008, 16:03) *
Вот тут я пас. Для таких больших не писал, а маленькие Segmentation fault не умеют
Дык вроде ж из начального поста ясно:
Код
................. /opt/lemonix/cdt/bin/arm-linux-gcc .............

что там линух, ну а для линуха или пишем свой драйвер или mm(memory map) или
обращение к уже сушествуещему /dev/XXX

вроде как другого не дано...
Go to the top of the page
 
+Quote Post
_chaos_
сообщение May 26 2008, 07:56
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 20-05-08
Пользователь №: 37 653



Цитата(amw @ May 20 2008, 20:18) *
либо /dev/mem

нашел на сайте пример работы http://www.simtec.co.uk/appnotes/AN0014/
опробовал пергружать системы запись в регистр RSTC - все ок.
а вот что-то со спящим режимом не очень понятно, запись в регистр PMC_SCDR ничего не дает sad.gif
Go to the top of the page
 
+Quote Post

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

 


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


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