Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 05.05.2015, 12:52  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию AVR + Переместить массив из области программ в SRAM

Всем привет. Вроде понятно, но ничего не получается. Задача такая: Есть в области программ массив в 300 значений типа uint16_t. Необходимо перекинуть его в область SRAM. Делаю так:

Код:
CopyBlockToRam(&Sinus, &Sinusoida, sizeof(Sinus));




void CopyBlockToRam(unsigned char * srcAddr, unsigned char * dstAddr, unsigned int Size)
{
	for(uint16_t Begin = 0; Begin ‹ Size; Begin++)
	{
		//((unsigned int *)dstAddr)[Begin] = pgm_read_byte(((unsigned int *)srcAddr)[Begin]);
		dstAddr[Begin] = pgm_read_byte(srcAddr[Begin]);
	}
}
Но почему-то ничего не выходит.
Реклама:
AlexWonder вне форума  
Непрочитано 05.05.2015, 13:30  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Если это CV, то так
void CopyBlockToRam(unsigned flash char * srcAddr, unsigned char * dstAddr, unsigned int Size)

Если что-то другое, то возможно, так:
void CopyBlockToRam(unsigned const char * srcAddr, unsigned char * dstAddr, unsigned int Size)
pambaru вне форума  
Непрочитано 05.05.2015, 13:58  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Пишу в AVR Studio 6
пока сделал так. (вроде работает, но ругается на несоответствие типов)

Код:
const unsigned int Sinus[360] PROGMEM = {
	1, 1, 2, 4, 6, 9, 12, 16, 21, 26, 32, 39, 46, 53, 62, 71, 80, 90, 101, 113,
	124, 137, 150, 164, 178, 193, 208, 224, 241, 258, 275, 293, 312, 331, 351, 
....... 
39, 32, 26, 21, 16, 12, 9, 6, 4, 2, 1 };


CopyBlockToRam(&Sinus, sizeof(Sinus));


void CopyBlockToRam(unsigned const char * srcAddr, unsigned int Size)
{
	unsigned char *Destination;
	Destination = &Sinusoida;
	for(uint16_t Begin = 0; Begin ‹ Size; Begin++)
	{
		*(Destination++) = pgm_read_byte(srcAddr++);
	}
}
выдает варнинг
passing argument 1 of 'CopyBlockToRam' from incompatible pointer type [enabled by default] в строке "CopyBlockToRam(&Sinus, sizeof(Sinus))"
и
assignment from incompatible pointer type [enabled by default] в строке "Destination = &Sinusoida"

логически я понимаю что компилятор ругается на то, что я обращаюсь к int указателям на массивы как к char указателям, но как это объяснить компилятору?
AlexWonder вне форума  
Непрочитано 05.05.2015, 14:20  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Сообщение от AlexWonder Посмотреть сообщение
что я обращаюсь к int указателям на массивы как к char указателям, но как это объяснить компилятору?
Ну как то так:
CopyBlockToRam((unsigned const char*)Sinus, &dst, sizeof(Sinus))

P.S. Только, похоже, & не нужна перед Sinus - это и так массив, т.е. указатель.
Ну и перед dst, Если dst - массив.
pambaru вне форума  
Непрочитано 05.05.2015, 15:29  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Код:
void CopyBlockToRam(const unsigned int * srcAddr, unsigned int * dstAddr, unsigned int Size)
{


	for(uint16_t Begin = 0; Begin ‹ Size; Begin++)
	{

              *(dstAddr++) = pgm_read_word(srcAddr++);

	}

}
STM32F0 вне форума  
Непрочитано 05.05.2015, 15:55  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Спасибо огромное!
Помогло.

Еще вопрос в той же теме:
в процедуру передается указатель на адрес.
Компилятор постоянно ругается : - cast from pointer to integer of different size [-Wpointer-to-int-cast]
не смертельно, но раздражает

вот сама процедура:
Код:
void DMA_SetupBlock( volatile DMA_CH_t * channel,
                     const void * srcAddr,
                     DMA_CH_SRCRELOAD_t srcReload,
                     DMA_CH_SRCDIR_t srcDirection,
                     void * destAddr,
                     DMA_CH_DESTRELOAD_t destReload,
                     DMA_CH_DESTDIR_t destDirection,
                     uint16_t blockSize,
                     DMA_CH_BURSTLEN_t burstMode,
                     uint8_t repeatCount,
                     bool useRepeat )
{
	channel-›SRCADDR0 = (( (uint32_t) srcAddr) ›› 0*8 ) & 0xFF;
	channel-›SRCADDR1 = (( (uint32_t) srcAddr) ›› 1*8 ) & 0xFF;
	channel-›SRCADDR2 = (( (uint32_t) srcAddr) ›› 2*8 ) & 0xFF;

	channel-›DESTADDR0 = (( (uint32_t) destAddr) ›› 0*8 ) & 0xFF;
	channel-›DESTADDR1 = (( (uint32_t) destAddr) ›› 1*8 ) & 0xFF;
	channel-›DESTADDR2 = (( (uint32_t) destAddr) ›› 2*8 ) & 0xFF;

	channel-›ADDRCTRL = (uint8_t) srcReload | srcDirection |
	                              destReload | destDirection;
	channel-›TRFCNT = blockSize;
	channel-›CTRLA = ( channel-›CTRLA & ~( DMA_CH_BURSTLEN_gm | DMA_CH_REPEAT_bm ) ) |
	                  burstMode | ( useRepeat ? DMA_CH_REPEAT_bm : 0);

	if ( useRepeat ) {
		channel-›REPCNT = repeatCount;
	}
}
ругается на строки:
channel-›SRCADDR0 = (( (uint32_t) srcAddr) ›› 0*8 ) & 0xFF;
channel-›SRCADDR1 = (( (uint32_t) srcAddr) ›› 1*8 ) & 0xFF;
channel-›SRCADDR2 = (( (uint32_t) srcAddr) ›› 2*8 ) & 0xFF;

channel-›DESTADDR0 = (( (uint32_t) destAddr) ›› 0*8 ) & 0xFF;
channel-›DESTADDR1 = (( (uint32_t) destAddr) ›› 1*8 ) & 0xFF;
channel-›DESTADDR2 = (( (uint32_t) destAddr) ›› 2*8 ) & 0xFF;

Последний раз редактировалось AlexWonder; 05.05.2015 в 15:58.
AlexWonder вне форума  
Непрочитано 05.05.2015, 16:20  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Видимо, не нравится:
(uint32_t) srcAddr
Какого размера у Вас pointer?
Что за компилятор/МК?

Последний раз редактировалось pambaru; 05.05.2015 в 16:22.
pambaru вне форума  
Непрочитано 05.05.2015, 16:26  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

typedef struct DMA_CH_struct
{
register8_t CTRLA; /* Channel Control */
register8_t CTRLB; /* Channel Control */
register8_t ADDRCTRL; /* Address Control */
register8_t TRIGSRC; /* Channel Trigger Source */
_WORDREGISTER(TRFCNT); /* Channel Block Transfer Count */
register8_t REPCNT; /* Channel Repeat Count */
register8_t reserved_0x07;
register8_t SRCADDR0; /* Channel Source Address 0 */
register8_t SRCADDR1; /* Channel Source Address 1 */
register8_t SRCADDR2; /* Channel Source Address 2 */
register8_t reserved_0x0B;
register8_t DESTADDR0; /* Channel Destination Address 0 */
register8_t DESTADDR1; /* Channel Destination Address 1 */
register8_t DESTADDR2; /* Channel Destination Address 2 */
register8_t reserved_0x0F;
} DMA_CH_t;

поинтер = unsigneg int (указатель на адрес в памяти SRAM)
AVR Studio 6
ATxmega128A1
AlexWonder вне форума  
Непрочитано 05.05.2015, 16:55  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Сообщение от AlexWonder Посмотреть сообщение
поинтер = unsigneg int (указатель на адрес в памяти SRAM)
AVR Studio 6
ATxmega128A1
unsigned int, похоже, в данном случае 16 бит.

Похоже, все же, что Ваш const void * srcAddr 16 бит.
Т.е., правильно будет (uint16_t) srcAddr
pambaru вне форума  
Непрочитано 05.05.2015, 17:27  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: AVR + Переместить массив из области программ в SRAM

Согласно даташту на ATxmega - максимальный объем памяти SRAM = 0xFFFFFF, а это 24 бита
AlexWonder вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
Литература по микроконтроллерам (AVR, PIC, ПЛИС и т.д.). Сборка книг - (256 книг+ 27 CD c примерами из книг) [обновление 2011, PDF, DJVU] yurinform Микроконтроллеры, АЦП, память и т.д 5 05.07.2011 19:00
Архив проектов на AVR fmssp Proteus, KiCAD и другие ECAD 4 25.10.2010 17:14
DES для AVR с SRAM 512 kb Savrik Микроконтроллеры, АЦП, память и т.д 0 14.08.2008 16:09
Драйвер графического дисплея 122х32 для AVR prottoss Микроконтроллеры, АЦП, память и т.д 14 13.09.2005 12:18


Часовой пояс GMT +4, время: 13:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot