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

 
 
 
Reply to this topicStart new topic
> Как прочесть константу с памяти программ?
Jhohn
сообщение Oct 5 2011, 14:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Извиняюсь, с pic только начал работать.

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

CODE
#pragma romdata const_table_1 = 0x1000

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


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

Сообщение отредактировал Jhohn - Oct 5 2011, 14:18
Go to the top of the page
 
+Quote Post
volodya
сообщение Oct 6 2011, 05:26
Сообщение #2


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

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Как и любую другую константу - обращаетесь по имени Line_001, а компилятор сам определит механизм доступа к значению.


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 6 2011, 05:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



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



CODE
rom U8 *q = &Line_001;
Go to the top of the page
 
+Quote Post
volodya
сообщение Oct 7 2011, 08:10
Сообщение #4


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

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



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


Так вы определитесь что надо и ЧАВО далее с ЕНтим делать - получить ссылку на константу в ROM памяти, или прочесть константу.
здесь в rom создана ссылка на переменную со значением равным адресу константы Line_001.


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 10 2011, 13:50
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



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


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

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


Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Oct 10 2011, 19:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(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)
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 11 2011, 06:01
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(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) таблицу почему-то не удается прочитать. В чем может быть "гвоздь"?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Oct 11 2011, 08:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(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]. Такой вид обращений к массивам работает на любой версии любого компилятора.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:10
Рейтинг@Mail.ru


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