Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:4
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
работа в RHEL4 AT91SAM9 Linux build machine
Valentinus
Добавлено 08.02.2010 09:27 Редактировалось 08.02.2010 09:33 Сообщение: 11
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
Цитата

PIT для своих целей нельзя использовать - на нем сделан системный таймер,

ну я в принципе так и думал, но была малююююсенькая надежда что "портировщики" PIT не тронут, там же RTT есть.
Цитата
кроме PIT есть TC0,1,2 - пример как с ними работать есть в at91lib.
ох, я уж смотрел в их сторону, но они мне показались гораздо сложнее чем PIT. ну что ж, будем пробовать :(
а в AIC можно запрограмировать прерывание на ТС? Линух не будет ругаться?
Цитата
Точных задержек в linux вы никогда не добъетесь - это не rtos, можно поэкспериментировать с таймерами и назначить наивысший приоритет для их прерываний - AIC позволяет разруливать приоритеты аппаратно, но все равно любой поток может отключить прерывания в самый неподходящий момент. Кстати - ф-ция должна вызываться в пространстве ядра или в пространстве пользователя ? а то это сильно разные вещи.

мне нужно не столько точность задержек, сколько точность периодичности вызова функции (хотя полагаю вы это и имели в виду).
функция пока реализуется на уровне приложения, может потом перепишу ее в виде драйвера. мне думается в этом урезаном линухе не так много служб и сторонних процессов, которые могут "заховать" проц "в самый неподходящий момент". да и приоритет конечно подниму.
вообще, сдается мне что Linux на этих kit`ах - вроде игрушки. ну так, сделали, чтобы показать что это в принципе возможно.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 08.02.2010 09:44 Сообщение: 12
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
вообще, сдается мне что Linux на этих kit`ах - вроде игрушки. ну так, сделали, чтобы показать что это в принципе возможно.

так никто не мешает вместо линукса загрузить на кит что-то свое под свои задачи..
кит он для того и существует, что можно попробовать на конкретном железе свои идеи без предварительных "трахов" по созданию макетки

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Alfamayonez
Добавлено 08.02.2010 09:47 Сообщение: 13
Alfamayonez
3.42

Пункты: 3702
Регистрация: 04.10.2009
Пол: Мужчина
Да и сам linux неплохой kit ;)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 08.02.2010 10:11 Редактировалось 08.02.2010 10:30 Сообщение: 14
sasamy
4.70

Пункты: 77292
Регистрация: 14.08.2009
Цитата
я уж смотрел в их сторону, но они мне показались гораздо сложнее чем PIT.


При наличии примеров в at91lib дело сводится к банальной правке. Вот например в prex я переделал с PIT на TC0:

Код
irq_t clock_irq;
unsigned int div, tcclks, sr;

/* Enable TC */
PMC_PCER = 1 << ID_TC;

find_divisor(CONFIG_HZ, &div, &tcclks);
/* Disable TC clock */
TC_CCR = CCR_CLKDIS;
/* Disable interrupts */
TC_IDR = 0xffffffff;
/* Clear status register */
sr = TC_SR;
/* Set mode */
TC_CMR = tcclks | CMR_WAVE | CMR_WAVESEL_UP_AUTO;
TC_RC = CONFIG_MCK / (CONFIG_HZ * div);

clock_irq = irq_attach(ID_TC, IPL_CLOCK, 1, &clock_isr, IST_NONE, NULL);

/* Enable timer interrupt */
TC_IER = SR_CPCS;
/* Start timer */
TC_CCR = CCR_CLKEN | CCR_SWTRG;

DPRINTF(("Clock rate: %d ticks/sec\n", CONFIG_HZ));


Цитата
а в AIC можно запрограмировать прерывание на ТС? Линух не будет ругаться?


С чего он должен ругаться ? Это стандартная ф-ия для абсолютно любой ОС, единственно в ядре есть драйвер для TC который нужно отключить если он включен, где-то в misc devices находится или удостовериться что используются разные таймеры (думаю из трех два выберете :)

Цитата
мне думается в этом урезаном линухе не так много служб и сторонних процессов, которые могут "заховать" проц "в самый неподходящий момент". да и приоритет конечно подниму.


"Урезаный" - это вы о чем ? тут полноценное ядро. "Заховать" ядро может абсолютно любой поток в ядре - было как то обсуждение, банальный printk задерживает таймер до миллисекунд.
Спуститься к концу Подняться к началу
Персональная информация
Valentinus
Добавлено 08.02.2010 14:59 Сообщение: 15
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
Цитата

"Заховать" ядро может абсолютно любой поток в ядре - было как то обсуждение, банальный printk задерживает таймер до миллисекунд.

а если функцию перенести в драйвер, то гарантирует ли это четкую периодичность ее вызовов и ее "непрерываемость"?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 08.02.2010 15:08 Редактировалось 08.02.2010 15:14 Сообщение: 16
sasamy
4.70

Пункты: 77292
Регистрация: 14.08.2009
Цитата
а если функцию перенести в драйвер, то гарантирует ли это четкую периодичность ее вызовов и ее "непрерываемость"?


Так я о ядре и говорю - не гарантируется никаких точных задержек и таймеров. Во всех стандартных ф-ях ядра гарантируется только что задержка будет не менее того что вы попросите. Если нужны точные задержки - это нужна ОС реального времени, для linux есть отдельные патчи для этого, но я ими никогда не пользовался, к тому же очень много зависит от того как реализованы драйверы - в rtos обработчики прерываний обязаны как можно быстрей вернуть управление, похоже atmel явно не заморачивалось этим при написании драйверов для linux :)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 08.02.2010 15:55 Сообщение: 17
sasamy
4.70

Пункты: 77292
Регистрация: 14.08.2009
В любом случае стоит поэкспериментировать, может быть удастся получить приемлемые результаты.
Спуститься к концу Подняться к началу
Персональная информация
Valentinus
Добавлено 09.02.2010 10:40 Редактировалось 09.02.2010 10:44 Сообщение: 18
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
сейчас пробую! ;)

вот проблема:
пробую пока на уровне приложения (не драйвера)
для функции request_irq подключаю заголовочный файл interrupt.h из папки /home/user/src/linux-2.6.24/include/linux, вроде бы там лежат исходники ядра, прошиваемого в kit.

но компилятор выдает ошибки:
Цитата
**** Build of configuration Default for project pit_test ****

make all
arm-none-linux-gnueabi-gcc -Wall -mlong-calls -ffunction-sections -g -I../at91lib/boards/at91sam9260-ek -I../at91lib/peripherals -I../at91lib/components -I../at91lib -I/home/user/src/linux-2.6.24/include -Dat91sam9xe512 -c -o pit_test.o pit_test.c
In file included from /home/user/src/linux-2.6.24/include/linux/interrupt.h:7,
from pit_test.c:13:
/home/user/src/linux-2.6.24/include/linux/bitops.h: In function 'get_bitmask_order':
/home/user/src/linux-2.6.24/include/linux/bitops.h:29: warning: implicit declaration of function 'fls'
/home/user/src/linux-2.6.24/include/linux/bitops.h: In function 'hweight_long':
/home/user/src/linux-2.6.24/include/linux/bitops.h:45: warning: implicit declaration of function 'hweight32'
/home/user/src/linux-2.6.24/include/linux/bitops.h:45: warning: implicit declaration of function 'hweight64'
/home/user/src/linux-2.6.24/include/linux/bitops.h: In function 'fls_long':
/home/user/src/linux-2.6.24/include/linux/bitops.h:72: warning: implicit declaration of function 'fls64'
In file included from /home/user/src/linux-2.6.24/include/linux/preempt.h:9,
from /home/user/src/linux-2.6.24/include/linux/interrupt.h:8,
from pit_test.c:13:
/home/user/src/linux-2.6.24/include/linux/thread_info.h: At top level:
/home/user/src/linux-2.6.24/include/linux/thread_info.h:23: error: expected specifier-qualifier-list before 'u32'
In file included from /home/user/src/linux-2.6.24/include/linux/preempt.h:11,
from /home/user/src/linux-2.6.24/include/linux/interrupt.h:8,
from pit_test.c:13:
/home/user/src/linux-2.6.24/include/linux/list.h:995:2: warning: #warning "don't include kernel headers in userspace"
In file included from /home/user/src/linux-2.6.24/include/linux/cpumask.h:86,
from /home/user/src/linux-2.6.24/include/linux/interrupt.h:9,
from pit_test.c:13:
/home/user/src/linux-2.6.24/include/linux/bitmap.h: In function 'bitmap_zero':
/home/user/src/linux-2.6.24/include/linux/bitmap.h:135: error: 'BITS_PER_LONG' undeclared (first use in this function)
/home/user/src/linux-2.6.24/include/linux/bitmap.h:135: error: (Each undeclared identifier is reported only once
...
и так далее...


я, пардон, с прерываниями в Linux еще не писал, может забыл что-то, а?
и настораживает "warning: #warning "don't include kernel headers in userspace"" - может request_irq нельзя вызывать в пользовательском приложении, а только в драйвере?
Спуститься к концу Подняться к началу
Персональная информация
Alfamayonez
Добавлено 09.02.2010 11:28 Сообщение: 19
Alfamayonez
3.42

Пункты: 3702
Регистрация: 04.10.2009
Пол: Мужчина
Цитата
и настораживает "warning: #warning "don't include kernel headers in userspace""

правильно,
нельзя смешивать stdc и kernel :).
Спуститься к концу Подняться к началу
Персональная информация
Valentinus
Добавлено 09.02.2010 13:18 Редактировалось 09.02.2010 14:14 Сообщение: 20
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
кажется, да.
вот чо нашел.
Цитата

You can't catch the IRQ in userspace. To catch an IRQ, you have to write a device driver in kernel, that for minimum reports the IRQ to userspace (polling, blocking call etc). Then your app uses that driver to get the signal to do something.


ладно, сегодня вечером начну писать драйвер.

сразу несколько вопросов:

1. после компиляции у меня получится модуль с расширением .ko, так?

2. чтобы его инсталлировать в linux на kit`е, я его перекачиваю на него, и в командной строке пишу что-то типа:
Код

install -c -m 0644 ${DRIVER_SOURCE_PATH}/${DRIVER_FILENAME}.ko ${DRIVER_INSTALL_PATH}/${DRIVER_FILENAME}.ko
depmod -r
/sbin/modprobe ${DRIVER_FILENAME}
Смотрю в /proc/devices свой драйвер, запоминаю № устройства ${DEVICE_NUM}
mknod /dev/${DEVICE_NAME} c ${DEVICE_NUM} 0

так?
в какую папку нужно/можно инсталлировать драйвер?

3. и потом могу вызвать
cat /dev/${DEVICE_NAME}
или через приложение, что-то типа:
Код

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* f;
int chr;
f=fopen("/dev/${DEVICE_NAME}","r");
while (1)
{
chr=fgetc(f);
printf("%04x", chr);
}

}

так?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux