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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Таблица вызова функций. Как?, Реализация "BIOS"
EXeGLuMATOR
сообщение Sep 7 2011, 08:54
Сообщение #1


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



День добрый.
Имеется желание и необходимость сделать что-то типа BIOS для LPC23хх. Мысль в следующем - загружается что-то типа лоадера, который управляет камнем, также в нем есть базовый код для работы с периферией. Он един для всех проектов. Софт верхнего уровня делается отдельно и грузится выше адресами. Как сделать, чтобы из него можно было обращаться к базовым функциям?
Мысль одна - сделать табличку с адресами соотв. функций и буферов и верхним софтом ее юзать. Только как ее заполнять? Поскольку после каждой компиляции может меняться и размер и, как следствие, "раскладка" функций в памяти.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 7 2011, 11:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(EXeGLuMATOR @ Sep 7 2011, 12:54) *
Мысль одна - сделать табличку с адресами соотв.

Вообще-то можно придумать множество способов входа в BIOS. Тот же SWI, например.
Интересно было бы посмотреть, как сделано StellarisWare. У них некая библиотека зашита в ПЗУ.

Цитата(EXeGLuMATOR @ Sep 7 2011, 12:54) *
Только как ее заполнять? Поскольку после каждой компиляции может меняться и размер и, как следствие, "раскладка" функций в памяти.

Можно сделать массив с таблицей указателей на функции и разместить её по фиксированному адресу.
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Sep 8 2011, 04:14
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929



Достаточно одного фиксированного адреса, по нему делается вызов, который возвращает указатель на массив указателей на все функции BIOS, если состав функций может быть разным, можно предусмотреть какой-либо заголовок с дескрипторами из которого клиентское приложение может достать всю информацию для работы с BIOS.
Дальше эти указатели можно присвоить некой структуре и пользовать вызовы например типа BIOS.UartInit();
Запрос и присвоение структуры можно вынести в отдельную функцию типа BIOS_Init(Struct TBIOS* BIOS), т.е. прикладной программист включает эту функцию в свой код, а дальше работает с вызовами из структуры.


Тут пример написания обработчика SWI

http://www.microchip.su/showthread.php?t=4860

Программное прерывание SWI - тоже фиксированная точка входа. При этом еще происходит повышение уровня с пользовательского до системного.

Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 8 2011, 05:27
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(EXeGLuMATOR @ Sep 7 2011, 11:54) *
Имеется желание и необходимость сделать что-то типа BIOS для LPC23хх.


Зачем в в таком примитивном микроконтроллере BIOS?
BIOS создавался чтобы изолировать юзера от меняющегося хардваре.
Здесь же хардваре жестко задано. В пределах семейства различия мизерные.
Т.е. подражание BIOS приведет к квадратному колесу.
Способ изоляции юзера от сложностей хардваре удачно придуман в проекте Arduino. Его и следует копировать, ИМХО.
Go to the top of the page
 
+Quote Post
e-serg
сообщение Sep 8 2011, 06:22
Сообщение #5


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

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(EXeGLuMATOR @ Sep 7 2011, 17:54) *
Мысль одна - сделать табличку с адресами соотв. функций и буферов и верхним софтом ее юзать. Только как ее заполнять?

Допустим так сделать примерно так
Код
uint8_t data[4096];
int flash_write(uint32_t addr, uint8_t *data, int size); //некая функция
typedef struct{
    uint8_t VER_ID;
    int (*flash_write)(uint32_t, uint8_t*, int);
}FS; // в этой структуре перечислим
const FS __attribute__((section(".boot_func"))) fs = {0, &flash_write}; // разместим например по адресу 0x100UL с помощью линкера
const FS *fs2 = (FS *)0x100UL; // 0x100UL - адрес куда разместили структуру.

    fs.flash_write(250, data, 196); // варианты вызова одной функции.
    fs2->flash_write(250, data, 196);
    flash_write(250, data, 196);


Цитата(AlexandrY @ Sep 8 2011, 14:27) *
Зачем в в таком примитивном микроконтроллере BIOS?

например одни и те же функции обработки данных в загрузчике и приложении.
тоже шифрование, зачем по два экземпляра кода.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 8 2011, 08:17
Сообщение #6


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(e-serg @ Sep 8 2011, 10:22) *
например одни и те же функции обработки данных в загрузчике и приложении.
тоже шифрование, зачем по два экземпляра кода.

Именно для мелких камней это и применимо. Тот-же ЮСБ и в загрузчике и в приложении - нет лишнего кода в приложении. Просто заполнил буфер, скомандовал на передачу. В этом и идея - все железо живет своей жизнью. Если оно нужно - его стартуем пользовательским софтом, если нет - то нет.

Спасибо. Вроде осознал по таблице. Т.е. как заполнить более или менее ясно, будем пробовать.
Теперь следующий вопрос, по этой же теме.
Лоадер работает, функции известны, периферия запущена (предполагается операционка, от Кейла). Т.е. лоадер - программа сама в себе. Верхнее приложение лежит во флэш с какого-то фиксированного адреса.
Стартовая функция (задача) приложения лежит по известному адресу и стартовать его не проблема. Каким образом компилировать пользовательскую программу, чтобы избежать появления лишнего кода? Т.е. чтобы был голый код приложения, после запуска которого он живет своей жизнью? Ну, насколько ему дает лоадер.
Тут скорее наоборот - лоадер выполняет функции ядра операционки, грубо говоря. А основной код может быть загружен в принципе любой, заточенный под такое применение, естественно. Т.е., например, идет обмен по ЮСБ - его сначала ловит лоадер и, если то что там ходит не относится к его работе (например обновление пользовательского софта и т.п.) - то пакет передается в пользовательское приложение. Как-то так.
Опять-же вопрос отладки. Ладно, лоадер и пользовательский софт во время отладки можно компилить как единое целое, а нужное потом как-то вырезать. Опять-же, как?
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 8 2011, 08:35
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Похоже на изобретение велосипеда а-ля полновесная ось с запуском приложений.
Откладываем в сторону большой вопрос "нафиг?" и вообще вопрос о целесообразности такого подхода в микроконтроллерных приложениях.
Ось надо сначала спроектировать, в потом уже реализовывать. Надо описать ABI, под которым будет исполняться пользовательское приложение. Надо расписать функциональность и сферы ответственности ядра и приложения. И т.д. А вы занимаете свою голову второстепенными вопросами типа "Каким образом компилировать пользовательскую программу, чтобы избежать появления лишнего кода?"
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 8 2011, 08:54
Сообщение #8


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(scifi @ Sep 8 2011, 12:35) *
Похоже на изобретение велосипеда а-ля полновесная ось с запуском приложений.
Откладываем в сторону большой вопрос "нафиг?" и вообще вопрос о целесообразности такого подхода в микроконтроллерных приложениях.
Ось надо сначала спроектировать, в потом уже реализовывать. Надо описать ABI, под которым будет исполняться пользовательское приложение. Надо расписать функциональность и сферы ответственности ядра и приложения. И т.д. А вы занимаете свою голову второстепенными вопросами типа "Каким образом компилировать пользовательскую программу, чтобы избежать появления лишнего кода?"


В чем-то может и велосипед. А смысл прост. Есть устройство, нужно обеспечить запуск этих самых приложений. Ресурсы ограничены. Т.е. код лоадера + еще точно такой-же код в основном приложении - как-то расточительно, хоть и просто в реализации. И просто не лезет в камень. Еще очень большой блок данных во флэш лежит. Лоадер не меняется, только алгоритм обработки этих данных в зависимости от внешних воздействий. Вот и хочется максимальной скорости и простоты смены этого алгоритма пользователем на установленном изделии.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 8 2011, 09:00
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(EXeGLuMATOR @ Sep 8 2011, 12:54) *
Лоадер не меняется, только алгоритм обработки этих данных в зависимости от внешних воздействий. Вот и хочется максимальной скорости и простоты смены этого алгоритма пользователем на установленном изделии.

Возможно, подойдёт подход с интерпретатором скриптового языка. Он как раз обеспечивает простоту загрузки нового скрипта. Но если нужно быстродействие, то интерпретатор может не подойти.
Я использовал Pawn. Отличная вещь.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 8 2011, 10:17
Сообщение #10


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(scifi @ Sep 8 2011, 13:00) *
Возможно, подойдёт подход с интерпретатором скриптового языка. Он как раз обеспечивает простоту загрузки нового скрипта. Но если нужно быстродействие, то интерпретатор может не подойти.
Я использовал Pawn. Отличная вещь.


Спасибо. Интересная вещь. Но что-то насчет простоты - не совсем понятно (точнее совсем непонятно) как его в камень вкорячить и соотв заставить работать с периферией типа Ethernet и USB.
Да и скорость тоже очень немаловажно - релтайм обработка сигналов таки. Пусть не навороченная но тем не менее - много ее.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 8 2011, 13:20
Сообщение #11


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(EXeGLuMATOR @ Sep 8 2011, 11:54) *
В чем-то может и велосипед. А смысл прост. Есть устройство, нужно обеспечить запуск этих самых приложений. Ресурсы ограничены. Т.е. код лоадера + еще точно такой-же код в основном приложении - как-то расточительно, хоть и просто в реализации. И просто не лезет в камень. Еще очень большой блок данных во флэш лежит. Лоадер не меняется, только алгоритм обработки этих данных в зависимости от внешних воздействий. Вот и хочется максимальной скорости и простоты смены этого алгоритма пользователем на установленном изделии.


Здесь годятся только либы. Отдаете пользователю скомпилированные либы со средством линковки, и он сам их прилинкует когда надо.

Либо загрузчик объектного кода пользователя реализуете сами на своей платформе. Но это гораздо сложнее.
Go to the top of the page
 
+Quote Post
psL
сообщение Sep 9 2011, 16:54
Сообщение #12


Знающий
****

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



Вещь полезная. Удобно при обновлении ПО, когда меняется только пользовательская логика, а bsp остается прежним. Особенно когда bsp существенно больше пользовательского кода. Либо когда объем пользовательского кода+bsp больше объема памяти системы.
Динамически при загрузке связывать со всеми функциями BSP может быть затруднительно ввиду большого количества этих функций. Нужно как-то линковать статически с библиотекой BSP, чтобы адреса функций либы BSP оставались неизменными, и чтобы фирмварь от версии к версии вызывала их по одним и тем же адресам.
В свое время пробовал настроить линкер кейла - не получилось( Интересно как это реализовано у Тексас на его кортексах?
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 14 2011, 06:17
Сообщение #13


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Да, видимо так. Осталось разобраться как это сделать, по уму.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 14 2011, 07:19
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(psL @ Sep 9 2011, 22:54) *
Вещь полезная. Удобно при обновлении ПО, когда меняется только пользовательская логика, а bsp остается прежним. Особенно когда bsp существенно больше пользовательского кода. Либо когда объем пользовательского кода+bsp больше объема памяти системы.

Бред насчет полезной вещи.
Для загрузчика BSP, как правило, весьма мало. А вот пользовательскому приложению по мере увеличения функционала может потребоваться новое BSP. Или исправление ошбок в существующем.
Так что обновление BSP тоже надо предусматривать. То есть линковка функций BSP по статическим адресам отпадает.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Sep 14 2011, 10:04
Сообщение #15


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

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(Alechek @ Sep 14 2011, 11:19) *
Бред насчет полезной вещи.
Для загрузчика BSP, как правило, весьма мало. А вот пользовательскому приложению по мере увеличения функционала может потребоваться новое BSP. Или исправление ошбок в существующем.
Так что обновление BSP тоже надо предусматривать. То есть линковка функций BSP по статическим адресам отпадает.


Ну, это называется эволюцией. Соотв, как правило к этому времени назревает и изменение аппаратной части. И получается новая версия аппаратной платформы. Местами sm.gif совместимая со старой.
Кстати, ничего не мешает в пользовательском модуле реализовывать и новые функции, отлаживать, а потом, по мере развития переносить в BSP
Go to the top of the page
 
+Quote Post

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

 


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


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