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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> получение "чистого" кода функции, вопрос новичка
der Spomer
сообщение Dec 18 2007, 05:07
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 13-08-07
Пользователь №: 29 733



Допустим, я написал программу на C++, скомпилил, прошил. Теперь мне понадобилось дописать в ROM ещё одну функцию, написанную также на C++. Цель - скажем, допрошил 30-40 файлов-функций в ROM и пользуешься ими из основной программы.
Вопрос:
1) Возможно ли настроить среду (EWARM или любую другую) так, чтобы она выдала мне файл с "чистым" кодом функции, т.е. без кода инициализации процессора и т.п.?
2) Существуют ли стандарты файлов, предназначенных не для включения в проект, а для непостедственной прошивки в устройство?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 18 2007, 07:25
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата(der Spomer @ Dec 18 2007, 09:07) *
Допустим, я написал программу на C++, скомпилил, прошил. Теперь мне понадобилось дописать в ROM ещё одну функцию, написанную также на C++. Цель - скажем, допрошил 30-40 файлов-функций в ROM и пользуешься ими из основной программы.
Вопрос:
1) Возможно ли настроить среду (EWARM или любую другую) так, чтобы она выдала мне файл с "чистым" кодом функции, т.е. без кода инициализации процессора и т.п.?
2) Существуют ли стандарты файлов, предназначенных не для включения в проект, а для непостедственной прошивки в устройство?


1) Можно функции разместить в каком нить отдельном пространстве и выдрать потом и прошивочного файла.

2) конечно существуют, обычно имеют разширения .hex и .bin, но бывают и другие форматы smile.gif

P.S.
Цитата
дописать в ROM
обычно туда 1 раз записывают

И еще по ходу, а откуда основная программа узнает что вы что то куда то дописали ?
Go to the top of the page
 
+Quote Post
_dem
сообщение Dec 18 2007, 07:38
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



1) ROM = Read Only Memory
2) сразу на будущее ознакомьтесь с понятием трансляции адресов (как в DLL)

Если Вы будете дописывать в FLASH/EEPROM функции во время работы девайса, то таким же нехитрым способом можно переписать всю прошивку, что обычно и делают.

Опишите вашу конечную цель, так как я могу себе представить разве что изменение функционала устройства в зависимости от типа "лицензии" без перепрошивки всего девайса.

Да, эти функции должны хранится во внутренней флешке или во внешнем хранилище (CF card/FLASH....) ?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 18 2007, 07:46
Сообщение #4


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
сразу на будущее ознакомьтесь с понятием трансляции адресов (как в DLL)


А это зачем ?
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 18 2007, 08:13
Сообщение #5


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

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(MALLOY2 @ Dec 18 2007, 10:46) *
А это зачем ?

в результате работы компилятора получаются "относительные" адреса, абсолютные их значения становятся известны только на этапе линковки. соответственно, если Вы хотите использовать скомпилированный код, преобразовывать "относительные" адреса в абсолютные придется самостоятельно. эта процедура в DLL называется "трансляцией адреса"
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 18 2007, 08:17
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
в результате работы компилятора получаются "относительные" адреса, абсолютные их значения становятся известны только на этапе линковки. соответственно, если Вы хотите использовать скомпилированный код, преобразовывать "относительные" адреса в абсолютные придется самостоятельно. эта процедура в DLL называется "трансляцией адреса"


Может в DLL и так, а вот для микроконтроллера вы не преобразуете никак и никогда !!! незная MAP(файл для линкера который описывает пямять). А когда этот файл есть то и ничего преобразовывать не надо так как всегда можно посмотреть где эта функция находится.
Go to the top of the page
 
+Quote Post
Shuuura
сообщение Dec 18 2007, 08:31
Сообщение #7


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Попробуйте заранее расположить 30-40 по фиксированным адресам. Получится если функции не использут никаких системных библиотек и внешних функций (или внешним функциям как-же присваивать адреса). И с оптимизацией поиграть. Возможно придется выключить перемещение кода.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 18 2007, 08:38
Сообщение #8


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Shuuura @ Dec 18 2007, 11:31) *
Попробуйте заранее расположить 30-40 по фиксированным адресам.

Совершенно бесполезное и ненужное занятие.
Зачем это, я что-то не понимаю. 07.gif
Go to the top of the page
 
+Quote Post
Shuuura
сообщение Dec 18 2007, 08:41
Сообщение #9


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Цитата(alexander55 @ Dec 18 2007, 11:38) *
Совершенно бесполезное и ненужное занятие.
Зачем это, я что-то не понимаю. 07.gif

Я так понимаю, чтобы пользователь мог сам определять функционал устройства. что-то вроде ПЛК. Ядро отдельно , юзеровская программа отдельно. Можно даже несколько юзеровских программ хранить и практически на лету переключать. Остается придумать как подключить стандартные функции, которые уже есть в ядре. Например как можно присвоить функции cos фиксированый адрес? или если эта функция не используется в ядре, расположить ее в юзеровской области.
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 18 2007, 08:51
Сообщение #10


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

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(MALLOY2 @ Dec 18 2007, 11:17) *
Может в DLL и так, а вот для микроконтроллера вы не преобразуете никак и никогда !!! незная MAP(файл для линкера который описывает пямять). А когда этот файл есть то и ничего преобразовывать не надо так как всегда можно посмотреть где эта функция находится.

вопрос тут не в том, КАК это сделать - достаточно разместить функцию-транслятор адресов в фиксированном месте памяти, и в ней хранить таблицу остальных адресов функций. вопрос в том, ЗАЧЕМ это может понадобиться
Go to the top of the page
 
+Quote Post
alexander55
сообщение Dec 18 2007, 08:59
Сообщение #11


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Shuuura @ Dec 18 2007, 11:41) *
Я так понимаю, чтобы пользователь мог сам определять функционал устройства. что-то вроде ПЛК. Ядро отдельно , юзеровская программа отдельно. Можно даже несколько юзеровских программ хранить и практически на лету переключать. Остается придумать как подключить стандартные функции, которые уже есть в ядре. Например как можно присвоить функции cos фиксированый адрес? или если эта функция не используется в ядре, расположить ее в юзеровской области.

Понятно.
Что-то типа BIOS и OS на борту. Юзеровские программы подгружаемые. Аналог наладоннина.
Так же BIOS и OS на борту. А юзеровские программы прошиваются в отведенную область. Аналог PLC.
Go to the top of the page
 
+Quote Post
der Spomer
сообщение Dec 18 2007, 09:15
Сообщение #12





Группа: Новичок
Сообщений: 5
Регистрация: 13-08-07
Пользователь №: 29 733



Цитата
ЗАЧЕМ это может понадобиться
Цитата
чтобы пользователь мог сам определять функционал устройства


Цитата(MALLOY2 @ Dec 18 2007, 13:25) *
.hex и .bin

Можно ли настроить среду, чтобы она сгенерила .hex или .bin, содержащий только скомпилённую мою функцию?

Сообщение отредактировал der Spomer - Dec 18 2007, 09:16
Go to the top of the page
 
+Quote Post
Shuuura
сообщение Dec 18 2007, 09:34
Сообщение #13


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Цитата(der Spomer @ Dec 18 2007, 12:15) *
Можно ли настроить среду, чтобы она сгенерила .hex или .bin, содержащий только скомпилённую мою функцию?

1 вариант. Попробуйте отключить стартап, все глобальные переменные no_init
2 вариант. Вручную линковать obj. Может получится
Результат сообщите, интересно
Go to the top of the page
 
+Quote Post
der Spomer
сообщение Dec 18 2007, 10:04
Сообщение #14





Группа: Новичок
Сообщений: 5
Регистрация: 13-08-07
Пользователь №: 29 733



Мои соображения.

Если я всё правильно понимаю(в чём я сильно сомневаюсь) то стандартный исполняемый файл с пустым main, сгенерённый ewarm, имеет след. структуру:
------------------------------------
таблица векторов прерываний
сstartup
cmain
cexit
------------------------------------
Если структура верна, то, видимо, при отключении первых двух пунктов получается работоспособный код, который можно вызвать из основной программы без потери работоспособности обоих. Поправьте если не прав

Сообщение отредактировал der Spomer - Dec 18 2007, 10:08
Go to the top of the page
 
+Quote Post
Shuuura
сообщение Dec 18 2007, 10:22
Сообщение #15


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

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



Цитата(der Spomer @ Dec 18 2007, 13:04) *
Мои соображения.

Если я всё правильно понимаю(в чём я сильно сомневаюсь) то стандартный исполняемый файл с пустым main, сгенерённый ewarm, имеет след. структуру:
------------------------------------
таблица векторов прерываний
сstartup
cmain
cexit
------------------------------------
Если структура верна, то меня, видимо, при отключении первых двух пунктов получается работоспособный код, который можно вызвать из основной программы без потери работоспособности обоих. Поправьте если не прав

еще есть секция инициализации переменных, стека и т.д.
также надо разделить области ОЗУ ядра и приложения при использовании глобальных переменных
Более правильный путь - компиляция obj. Она позволит отключить все ненужные в данном случае секции и получить код с заданного адреса.

Надо проверить идею: разбираем map файл ядра, генерим из него файлик с указанием адресов всех использованных функций. Подключая полученый файл к новому проекту имеем все нужные адреса. Еслм функции в ядре нет, указываем линкеру, что ее надо подключать в пользовательскую область. Вызов пользовательских функций делаем через функцию-транслятор( если их много) или по жестким адресам (если мало). Функция -транслятор включается в пользовательский проект. По идее должно работать
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 12:16
Рейтинг@Mail.ru


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