реклама на сайте
подробности

 
 
> Запись данных в память программ PIC24F на С30
Галстук
сообщение Nov 17 2010, 14:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 5-12-05
Из: Москва, Россия
Пользователь №: 11 818



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

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

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Галстук
сообщение Nov 17 2010, 21:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 5-12-05
Из: Москва, Россия
Пользователь №: 11 818



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

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

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

Успехов!
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 18 2010, 05:37
Сообщение #3


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(Галстук @ Nov 18 2010, 00:23) *
Ваш метод, как я понимаю, состоит в размещение по абсолютному адресу указателя на начало массива или структуры.


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

Цитата(Галстук @ Nov 18 2010, 00:23) *
Так что главное - операции стирания и записи блоков флеш. А их-то как на С30 реализовать?


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


Цитата(Галстук @ Nov 18 2010, 00:23) *
2. А нельзя отказаться от прописывания абсолютного адреса и сделать так, чтобы линкер сам размещал массив? А то ведь при линковке код еще наедет на этот адрес и будет ерунда. Придется вручную подгонять адрес. Или это бессмысленные мечтания?


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


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
Абырвалг
сообщение Nov 18 2010, 08:08
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 23-08-06
Пользователь №: 19 752



Цитата(Danis @ Nov 18 2010, 09:37) *
Ничего не надо в линкере править для массива, потому что ничего не наедет. Размещайте свои структуры хоть посредине Вашего кода. Одно правило. Размер массива, структуры или массива структур должен быть кратным 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 слова
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016