Перейти к содержанию
    

Запись данных в память программ PIC24F на С30

Есть PIC24FJ256 , используется C30, хочется выделить в памяти программ место под данные (100Кбайт), которые будут генерироваться постепенно в процессе работы устройства, записываться и затем использоваться. Цеплять внешнюю память конечно можно, но нецелесообразно. Как сделать это на С30? Для PIC18 на PICC удавалось.

 

Есть AN1095, но уж больно там накручено. Ресурс перезаписи не беспокоит, так как перезапись будет только в единичных количествах.

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть PIC24FJ256 , используется C30, хочется выделить в памяти программ место под данные (100Кбайт), которые будут генерироваться постепенно в процессе работы устройства, записываться и затем использоваться. Цеплять внешнюю память конечно можно, но нецелесообразно. Как сделать это на С30? Для PIC18 на PICC удавалось.

 

Есть AN1095, но уж больно там накручено. Ресурс перезаписи не беспокоит, так как перезапись будет только в единичных количествах.

 

Спасибо.

 

Держи. Вместо структуры (как у меня) можешь задать массив, только как const.

 

__attribute__((space(psv),address (0x1400))) //(у Вас адрес начала размещения может отличаться!)

volatile struct Programm_Data My_Data; // size = 2048 - это размер моей структуры (у Вас размер может отличаться!)

 

//---------------------------------------------------

int main(void)

{

 

CORCONbits.PSV = 1;

PSVPAG = __builtin_psvpage(&My_Data);

 

Oscillator_init() ;

.....

.....

 

.....

 

Переделал под массив для ясности.

 

_attribute__((space(psv),address (0x1400)))

const unsigned char My_Array[1024 * 100];

 

//---------------------------------------------------

int main(void)

{

 

CORCONbits.PSV = 1;

PSVPAG = __builtin_psvpage(&My_Array[0]);

 

Oscillator_init() ;

………………….

………………….

………………….

………………….

return 0;

}

 

Off.

В свое время работал с таким контроллером. У него (и PIC24FJ**GA и PIC24FJ**GB) один баг нехороший есть. Если установить бит защиты от R/W кода, то нельзя бутлодером прошить его 1-й килобайт. Поэтому пришлось править линкер скрипт и использовать таблицу альтернативных векторов прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за совет. Ваш метод, как я понимаю, состоит в размещение по абсолютному адресу указателя на начало массива или структуры. Потом можно считывать (если уже есть, что). Есть еще пара мелких вопросиков.

 

1. Данные на момент компиляции отсутствуют и появятся после, в run time. Так что главное - операции стирания и записи блоков флеш. А их-то как на С30 реализовать?

 

2. А нельзя отказаться от прописывания абсолютного адреса и сделать так, чтобы линкер сам размещал массив? А то ведь при линковке код еще наедет на этот адрес и будет ерунда. Придется вручную подгонять адрес. Или это бессмысленные мечтания?

 

Успехов!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш метод, как я понимаю, состоит в размещение по абсолютному адресу указателя на начало массива или структуры.

 

Примерно так. Это есть некое отображение flash в ОЗУ. Это очень удобно, когда работаешь под отладкой. Приятно работать не с массивом, а с конкретной структурой и просматривать ее содержимое в Watch, хотя последняя находится во flash.

 

Так что главное - операции стирания и записи блоков флеш. А их-то как на С30 реализовать?

 

В PIC24 стирание как и в PIC18 идет блоками по 1024 байта, запись также блоками по 64 байта. Не буду Вас заставлять читать pdf на С30, хотя было бы неплохо это сделать, там есть примеры и в мануале на PIC24 это хорошо описано. Просто у меня фунции чтения/записи в моих проектам завязаны с многими дефайнами и просто от туда их не выдернуть не потратив часок/другой. Если сами не разберетесь напишите в личку, отвечу попозжа.

 

 

2. А нельзя отказаться от прописывания абсолютного адреса и сделать так, чтобы линкер сам размещал массив? А то ведь при линковке код еще наедет на этот адрес и будет ерунда. Придется вручную подгонять адрес. Или это бессмысленные мечтания?

 

Ничего не надо в линкере править для массива, потому что ничего не наедет. Размещайте свои структуры хоть посредине Вашего кода. Одно правило. Размер массива, структуры или массива структур должен быть кратным 1024 байт и начинаться с адреса кратным килобайту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего не надо в линкере править для массива, потому что ничего не наедет. Размещайте свои структуры хоть посредине Вашего кода. Одно правило. Размер массива, структуры или массива структур должен быть кратным 1024 байт и начинаться с адреса кратным килобайту.

 

Вместо address можно использовать aligned. Тогда линкер сам размещает массив где ему вздумается.

 

У меня в одной проге для HJ есть такая строчка:

double kk_in_flash[_FLASH_PAGE/4][2] __attribute__ ( (space(prog), aligned (_FLASH_PAGE*2)) ) =
...

 

_FLASH_PAGE*2 скорее всего из-за путаницы в том, что FLASH_PAGE выражено в словах, а надо в байтах. Не помню уже точно.

 

Ниже пример чтения и записи в этот массив во флеше. У меня, правда, все просто, потому как все влезает в одну строку флеша.

void read_kk_flash(void)
{
  _prog_addressT flash_addr;  // Адрес во флеше
  _init_prog_address(flash_addr, kk_in_flash);  // Получение адреса таблицы во флеше
  _memcpy_p2d16(kk_in_ram, flash_addr, sizeof(kk_in_ram));  // sizeof(kk_in_ram) - размер в байтах
}


void write_kk_flash(void)
{
// Стирание и запись
  _prog_addressT flash_addr;  // Адрес во флеше
  _init_prog_address(flash_addr, kk_in_flash);  // Получение адреса таблицы во флеше
  _erase_flash(flash_addr);             // Затирание страницы размером _FLASH_PAGE==512 слов по 24 бита
  _write_flash16(flash_addr, (int *)kk_in_ram);  // Запись строки данными 16-бит на слово, размер строки _FLASH_ROW==64 слова
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... пример чтения и записи в этот массив во флеше...

 

Спасибо.

 

Это то, что хотелось. Правда, успел уже сам разобраться. Все это, включая определения функций, отлично описано в мануале "16-Bit Language Tools Libraries", в который, признаться, только теперь заглянул. Главное, не забыть #include <libpic30.h>.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...