|
DMA - для чего он и как его использовать |
|
|
|
Jan 30 2007, 22:39
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
Подскажите для чего нужен DMA и если можно пример как его использовать. Пример "фирменный" или свой - в чем "СОЛЬ" DMA ?
|
|
|
|
|
Jan 31 2007, 01:20
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
Спасибо. подскажите апноут какой нить чтоб посмотреть конкретно.
и еще - этот буфер будет требовать данные или принимть по мере помтупления ? т.е. как передатчик даст ... или по всякому бывает.
и еще - ресь идет о внутренней РАМ или и внешней тоже ?
|
|
|
|
|
Jan 31 2007, 01:45
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
и какова скорость приема дданных ? например по параллельному интерфейсу в LPC или SAM - во сколько раз медленней такта ?
|
|
|
|
|
Jan 31 2007, 10:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Спасибо. подскажите апноут какой нить чтоб посмотреть конкретно. Нечего там смотреть. Прописываются два регистра - указатель на буфер и количество байт. Для SAM все описание узла страницы на три включая раскладку регистров. Цитата и еще - этот буфер будет требовать данные или принимть по мере помтупления ? т.е. как передатчик даст ... или по всякому бывает. По сути DMA это второй счетчик адреса. Т.е. в обычном режиме идет пересылка IO -> регистры ядра -> RAM, с DMA IO -> RAM (для передачи наоборот) пока не насчитает заданное количество байт. Для IO будет ждать готовности данных, для памяти будет молотить пока свободна шина.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jan 31 2007, 11:40
|
Участник

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292

|
большое спасибо за помощь. сижу разбираюсь.
|
|
|
|
|
Jan 31 2007, 23:05
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326

|
zltigo Режим работы контроллера DMA определяется в первую очередь типом используемой накристальной шины. В частности, шина AHB может иметь несколько ведущих и ведомых, и несколько шина адреса данных, подключаемых через мультиплексор. Поэтому время задержки транзакции незначительно, то есть как CPU, так и DMA имеют, в среднем, одинаковые возможности для доступа к ресурсам. Поправите, если не прав. Abakt В режиме DMA не используются ресурсы (регистры, АЛУ и т.п.) на операции пересылки данных.
|
|
|
|
|
Feb 1 2007, 00:40
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(beer_warrior @ Jan 31 2007, 23:35)  А и действительно. Не дадите ли ссылку на доку? Момент ведь весьма принципиальный. Вот что написано в мануале к SAM7S: The Memory Controller has a simple, hard-wired priority bus arbiter that gives the control of the bus to one of the two masters. The Peripheral DMA Controller has the highest priority; the ARM processor has the lowest one. [AT91SAM7S.pdf, 6175G–ATARM–22-Nov-06, page 120] Действительно, курить в сторонке будет процессор, а не DMA...
Сообщение отредактировал sonycman - Feb 1 2007, 00:41
|
|
|
|
|
Feb 1 2007, 12:23
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(Karl @ Feb 1 2007, 08:49)  Помогите, пожалуйста, с конкретной задачей: Необходимо через ДМА передавать массив в SPI и получать из него ответ (контроллер SAM7S64). Какие операции необходимо произвести? Вот как делаю я (коментарии от специалистов приветствуются  ) Здесь только отсылка, ну и особенности от FreeRTOS, но общий смысл должен быть понятен. Код void SPI_task(void *pvParameters) { unsigned portCHAR i; unsigned portCHAR SPI_buf[8]; ( void ) pvParameters; portENTER_CRITICAL();
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_SPI); AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA11_NPCS0 | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK, 0); AT91F_SPI_Reset(AT91C_BASE_SPI);
AT91C_BASE_SPI->SPI_MR=0x0E0011;//Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
AT91F_SPI_CfgCs(AT91C_BASE_SPI, 0, AT91C_SPI_NCPHA | (128 << 8) | 0x04 ); AT91F_SPI_Enable(AT91C_BASE_SPI); AT91F_PDC_Open(AT91C_BASE_PDC_SPI); for(i=0;i<8;i++) SPI_buf[i]=i; portEXIT_CRITICAL();
for(;;)
{ while(AT91F_SPI_SendFrame(AT91C_BASE_SPI,(char*) &SPI_buf[0],8,0,0) == 0) vTaskDelay(portTICK_RATE_MS * 10); i++; SPI_buf[7]=i; vTaskDelay(portTICK_RATE_MS * 1000); } }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|