AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
05.05.2015, 12:52
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
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]);
}
} |
Но почему-то ничего не выходит.
|
|
|
|
05.05.2015, 13:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
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)
|
|
|
|
05.05.2015, 13:58
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
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 указателям, но как это объяснить компилятору?
|
|
|
|
05.05.2015, 14:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: AVR + Переместить массив из области программ в SRAM
Сообщение от AlexWonder
|
что я обращаюсь к int указателям на массивы как к char указателям, но как это объяснить компилятору?
|
Ну как то так:
CopyBlockToRam((unsigned const char*)Sinus, &dst, sizeof(Sinus))
P.S. Только, похоже, & не нужна перед Sinus - это и так массив, т.е. указатель.
Ну и перед dst, Если dst - массив.
|
|
|
|
05.05.2015, 15:29
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
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++);
}
} |
|
|
|
|
05.05.2015, 15:55
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
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.
|
|
|
|
05.05.2015, 16:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: AVR + Переместить массив из области программ в SRAM
Видимо, не нравится:
(uint32_t) srcAddr
Какого размера у Вас pointer?
Что за компилятор/МК?
Последний раз редактировалось pambaru; 05.05.2015 в 16:22.
|
|
|
|
05.05.2015, 16:26
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
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
|
|
|
|
05.05.2015, 16:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: AVR + Переместить массив из области программ в SRAM
Сообщение от AlexWonder
|
поинтер = unsigneg int (указатель на адрес в памяти SRAM)
AVR Studio 6
ATxmega128A1
|
unsigned int, похоже, в данном случае 16 бит.
Похоже, все же, что Ваш const void * srcAddr 16 бит.
Т.е., правильно будет (uint16_t) srcAddr
|
|
|
|
05.05.2015, 17:27
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
Re: AVR + Переместить массив из области программ в SRAM
Согласно даташту на ATxmega - максимальный объем памяти SRAM = 0xFFFFFF, а это 24 бита
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|