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

 
 
 
Reply to this topicStart new topic
> обращение на Си к памяти программ за пределом кода программы
sbw
сообщение Oct 5 2007, 21:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107



Си для АВРа изучаю недавно, поэтому образовался такой вопрос.
Есть проблема, легко решаемая на асме: после тела (откомпилированной) программы идут данные, подгружаемые другой (пользовательской) программой, то есть в исходном файле (тексте) этих данных нет, внешняя программа их добавляет в хекс-файл. Длина программы может меняться от версии к версии, внешние данные тоже переменной длины, то есть могут быть и пара байт, а могут быть до конца памяти проца. Дополнительное условие: пользователю не должен быть доступен код (текст) программы, то есть отконвертировать внешние данные в Си-файл а потом подгружать их при компиляции (каждый раз компилировать) не предлагать.

Как я это делаю на асме: после тела программы и всех внутренних констант пишу метку
end_prog: ; конец программы
после метки ничего нет. на эту метку ссылаюсь в теле программы ( типа ldi zl, low (end_prog * 2) ) и все путем.
Как такое же сделать на си? Может есть какая-то переменная типа "последний занятый байт" или "длина программы"?
Си- Винавр, но я только начал знакомиться, могу перейти на Иар. Хочется универсального решения.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 5 2007, 21:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В IAR можно выделить отдельный сегмент под ваши данные и при описании данных помещать их именно в этот сегмент. Сегмент описывается в .xcl-файле. Подробнее см. в хелпе IAR.
Go to the top of the page
 
+Quote Post
IceS
сообщение Oct 5 2007, 21:31
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 17-10-06
Из: Санкт Петербург
Пользователь №: 21 387



Цитата(sbw @ Oct 6 2007, 01:04) *
Дополнительное условие: пользователю не должен быть доступен код (текст) программы, то есть отконвертировать внешние данные в Си-файл а потом подгружать их при компиляции (каждый раз компилировать) не предлагать.

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

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

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

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

Если вы пользователю даете HEX, значит ему доступна вся программа. При желании перевести ее в Асм не составит труда.
Go to the top of the page
 
+Quote Post
sbw
сообщение Oct 5 2007, 22:01
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107



[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 ]
Это так, но возможен вариант, что "хекс" с кодом программы будет запрятан глубоко в экзешнике оболочки, дописывающей внешние данные, или закодирован (а оболочка раскодирует их перед записью)

Сообщение отредактировал sbw - Oct 5 2007, 22:27
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 5 2007, 22:04
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



__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[];
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 6 2007, 03:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



В ИАР в одном проекте пользовался директивой #pragma location

Код
#pragma location 0x7fff
char __flash my_array[1024];


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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