Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обращение на Си к памяти программ за пределом кода программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
sbw
Си для АВРа изучаю недавно, поэтому образовался такой вопрос.
Есть проблема, легко решаемая на асме: после тела (откомпилированной) программы идут данные, подгружаемые другой (пользовательской) программой, то есть в исходном файле (тексте) этих данных нет, внешняя программа их добавляет в хекс-файл. Длина программы может меняться от версии к версии, внешние данные тоже переменной длины, то есть могут быть и пара байт, а могут быть до конца памяти проца. Дополнительное условие: пользователю не должен быть доступен код (текст) программы, то есть отконвертировать внешние данные в Си-файл а потом подгружать их при компиляции (каждый раз компилировать) не предлагать.

Как я это делаю на асме: после тела программы и всех внутренних констант пишу метку
end_prog: ; конец программы
после метки ничего нет. на эту метку ссылаюсь в теле программы ( типа ldi zl, low (end_prog * 2) ) и все путем.
Как такое же сделать на си? Может есть какая-то переменная типа "последний занятый байт" или "длина программы"?
Си- Винавр, но я только начал знакомиться, могу перейти на Иар. Хочется универсального решения.
rezident
В IAR можно выделить отдельный сегмент под ваши данные и при описании данных помещать их именно в этот сегмент. Сегмент описывается в .xcl-файле. Подробнее см. в хелпе IAR.
IceS
Цитата(sbw @ Oct 6 2007, 01:04) *
Дополнительное условие: пользователю не должен быть доступен код (текст) программы, то есть отконвертировать внешние данные в Си-файл а потом подгружать их при компиляции (каждый раз компилировать) не предлагать.

в ИАРе я бы сделал так:

Код
__flash unsigned char Arr[2048]; //максимальная длинна данных
__flash unsigned int ArrLen;        //кол-во загруженных данных

Эти данные заливал бы не програматором, а передавал в сам контроллер, а он знает где их размещать и знает сколько их пришло, вот только процедуру записи придется делать свою, банальный
Arr[i] = Data;
может не прокатить sad.gif (у меня не пошло, но я сильно и не разбирался)

обрадаться с данными как с обычным массивом (правда хранящимся во флеше).

Если вы пользователю даете HEX, значит ему доступна вся программа. При желании перевести ее в Асм не составит труда.
sbw
[quote name='rezident' post='303786' date='Oct 5 2007, 23:07']
В IAR можно выделить отдельный сегмент под ваши данные и при описании данных помещать их именно в этот сегмент.
[/quote ]
А если в ВинАвр?

[quote name='IceS' date='Oct 5 2007, 23:31' post='303789']
в ИАРе я бы сделал так:

Код
__flash unsigned char Arr[2048]; //максимальная длинна данных
__flash unsigned int ArrLen;        //кол-во загруженных данных

[/quote ]
То есть зарезервировать массив? Два "но": как я извне (внешней оболочкой) узнаю, куда этот массив "лег", и как мне сделать так, чтобы он был "от конца программы и до конца флеша"? Из этого - не ясно.
[quote ]
Эти данные заливал бы не програматором, а передавал в сам контроллер, а он знает где их размещать и знает сколько их пришло, вот только процедуру записи придется делать свою, банальный
[/quote]
То есть лепить к контроллеру какой-то интерфейс? И процедуру записи кода разбивать на два этапа?...
[quote ]
Если вы пользователю даете HEX, значит ему доступна вся программа. При желании перевести ее в Асм не составит труда.
[/quote ]
Это так, но возможен вариант, что "хекс" с кодом программы будет запрятан глубоко в экзешнике оболочки, дописывающей внешние данные, или закодирован (а оболочка раскодирует их перед записью)
defunct
__flash char *ptr = (__flash char *)0x6000;

и читайте наздоровье.


Цитата
А если в ВинАвр?

аналогично, только вместо модификатора __flash использовать PROGMEM.

ключевые моменты:
PROGMEM
#include <avr/pgmspace.h>
pgm_read_byte_near( )

Цитата
внешняя программа их добавляет в хекс-файл

проще внешней программой конвертировать ваши данные в C файл следующего содержания:
PROGMEM char mydata[] =
{
0xXX, 0xZZ и т.д. ... данные через запятую
};

подключить этот C файл к проекту и работать с ним как с

extern PROGMEM char mydata[];
prottoss
В ИАР в одном проекте пользовался директивой #pragma location

Код
#pragma location 0x7fff
char __flash my_array[1024];
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.