Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

AVR + Переместить массив из области программ в SRAM

Непрочитано 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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,396
Сказал спасибо: 85
Сказали Спасибо 674 раз(а) в 393 сообщении(ях)
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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,396
Сказал спасибо: 85
Сказали Спасибо 674 раз(а) в 393 сообщении(ях)
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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,396
Сказал спасибо: 85
Сказали Спасибо 674 раз(а) в 393 сообщении(ях)
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.RUN
 
Регистрация: 24.03.2007
Сообщений: 1,396
Сказал спасибо: 85
Сказали Спасибо 674 раз(а) в 393 сообщении(ях)
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, время: 05:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.