Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как прочесть константу с памяти программ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Jhohn
Извиняюсь, с pic только начал работать.

Расположил таблицу в памяти программ. Оболочка MPLAB, compiler C18.

CODE
#pragma romdata const_table_1 = 0x1000

rom const U8 Line_001 = 24;
...
...
...
#pragma romdata


Как прочесть элемент 24? по адресу 0x1000?
volodya
Как и любую другую константу - обращаетесь по имени Line_001, а компилятор сам определит механизм доступа к значению.
Jhohn
Цитата(Jhohn @ Oct 5 2011, 18:16) *
Как прочесть элемент 24? по адресу 0x1000?



CODE
rom U8 *q = &Line_001;
volodya
Цитата(Jhohn @ Oct 6 2011, 07:47) *
CODE
rom U8 *q = &Line_001;


Так вы определитесь что надо и ЧАВО далее с ЕНтим делать - получить ссылку на константу в ROM памяти, или прочесть константу.
здесь в rom создана ссылка на переменную со значением равным адресу константы Line_001.
Jhohn
Цитата(volodya @ Oct 7 2011, 12:10) *
Так вы определитесь что надо и ЧАВО далее с ЕНтим делать - получить ссылку на константу в ROM памяти, или прочесть константу.
здесь в rom создана ссылка на переменную со значением равным адресу константы Line_001.


Как прочесть элемент 24? по адресу 0x1000?

Я по ссылке получил значение. Сложность заключалась как создать ссылку на таблицу констант в rom, далее как получить значение и остальное это понятно. Или вы о том, что я должен был еще привести пример как получить значение? biggrin.gif


Ruslan1
Цитата(Jhohn @ Oct 10 2011, 16:50) *
Как прочесть элемент 24? по адресу 0x1000?

Я по ссылке получил значение. Сложность заключалась как создать ссылку на таблицу констант в rom, далее как получить значение и остальное это понятно. Или вы о том, что я должен был еще привести пример как получить значение? biggrin.gif


Код
static const double K1mlt[64] =
{
        1.0,            //in0
}

double *pnt;
double value;
pnt= (const double *)(&K1mlt[0]);
value = *pnt;


Это под Hi-Tech (picc18 STD)
Jhohn
Цитата(Ruslan1 @ Oct 10 2011, 23:41) *


Руслан, у меня таблица находится в памяти программ (Rom), я ее расположил по конкретному адресу, и проверил каждый ли байт этой таблицы находится последовательно... Мне потом с этой таблицей нужно работать с помощью одного указателя. В таблице типы данных разные (символы, одно-байтовые и много-байтовые целые).

Цитата(Jhohn @ Oct 6 2011, 09:47) *
CODE

#pragma romdata const_table_1 = 0x1000

rom const U8 Line_001 = 24;
...
...
...
#pragma romdata

rom U8 *q = &Line_001;



При изменении расположения адреса в таблице (например на 0х1100) таблицу почему-то не удается прочитать. В чем может быть "гвоздь"?
Ruslan1
Цитата(Jhohn @ Oct 11 2011, 09:01) *
При изменении расположения адреса в таблице (например на 0х1100) таблицу почему-то не удается прочитать. В чем может быть "гвоздь"?

Извините, но не понимаю что именно нужно сделать. Вам нужно считать данные из конкретной ячейки ROM(как они туда попадают- неважно), или из конкретной ячейки массива (какого типа и сложности массив- неважно)? Или что-то третье?
Приведите кусочек таблицы и кусочек кода, где есть нужное вам обращение к таблице. У меня смутное подозрение, что вашу задачу можно решить проще и гибче, если с самого начала правильно описать массив данных, а не пытаться использовать физическую адресацию. То есть заводите нормальный typedef, в котором определяете структуру полей, ну а дальше обращаться по полям, а не по физическим адресам. То есть "table1[24].cfg.Fmax" гораздо предпочтительней чем чтение байта, сдвинутого на 24*36+8 байт относительно адреса 0x1000.

Использовать физическую адресацию при ползании по массиву опасно, упаковка может измениться при изменении опций или версии компилятора. Нужно использовать хотя бы указатель на первый элемент массива и функцию sizeof() для определения длины элемента массива. И это не зависит никак от того, в ОЗУ или в ПЗУ расположен массив. Меняется только определение этих указателей.

Если вам нужно прочесть 24-й (считаем с нулевого) элемент массива table1, то это будет table1[24]. Если вам нужно узнать где в памяти расположен первый байт 24-го элемента массива table1, то это будет &table1[24]. Такой вид обращений к массивам работает на любой версии любого компилятора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.