Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRStudio ATxMega b FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
chernenko
Работаю с ХМега32А4 в AVRStudio. Нужно в памяти программ хранить большой массив из uint64_t до 1024 элементов.
Для линкера прописал:
Код
-Wl,--section-start=.BOOT=0x8000,--section-start=.SYNT_FREQ_TBL=0x5800


в заголовочном файле:
Код
typedef uint64_t synt_freq_elm_t;
typedef synt_freq_elm_t synt_freq_tbl_t [ SYNT_FREQ_PNT_MAX ];

в сишном фале:
Код
volatile const static synt_freq_tbl_t _synt_freq_tbl  __attribute__ ( (section (".SYNT_FREQ_TBL") ) );


Затем в программе успешно заполняю массив значениями через sp_driver. Все нормально.
Но получить таким значение через доступ к элементу массива не получается:
Код
return _synt_freq_tbl [ pnt ];

В смысле либо ерунда читается, либо нули.
чтение же через sp_driver происходит нормально.

в чем моя ошибка?
chernenko
Да... При этом в отладке _synt_freq_tbl[] располагается именно по адресу 0x5800 и все элементы массива соответствуют записанным значениям.
demiurg_spb
1) Чтобы читать из flash uint64_t нужно использовать pgm_read_qword(&_synt_freq_tbl [pnt]), а не так как вы _synt_freq_tbl [pnt]
2) Нужно чтобы ваш массив размером sizeof(uint64_t)*1024=8K лёг целиком строго в одну из областей flash, кратную 64к (без переключения RAMP(Z,Y,X)).
3) Возможно вы напутали адресацию: в gcc вся адресация в байтах, а у атмел flash в даташитах чаще всего в словах измеряется...

hint:
pgm_read_qword ещё не реализована в <avr\pgmspace.h>, но накропать её не сложно...

Код
static __inline uint64_t pgm_read_qword(const uint64_t* src)
{
    uint64_t x;

    memcpy_P(&x, src, sizeof(x));     // memcpy_PF если массив лежит "далеко"

    return (x);
}

Используйте на здоровьеsm.gif
Ой, изначально не из той оперы запостил код.

Правда так будет гораздо оптимальней:
Код
static __inline void pgm_read_qword(uint64_t* dst, const uint64_t* src)
{
    memcpy_P(dst, src, sizeof(*dst));     // memcpy_PF если массив лежит "далеко"
}
chernenko
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.