Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Как да направя биос?
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=16797
Страница 1 от 1

Автор:  Н'бабане Гт'муан'га [ Съб Окт 05, 2019 11:49 am ]
Заглавие:  Как да направя биос?

Значи занимавам се с моя 8-битов компютър. Вече съм на привършване със системния му софтуер обаче само едно нещо ме мъчи от няколко дена и не мога да го измисля. Искам да направя така че външни програми да могат да се възползват от функциите дето са във флаша. Примерно функциите за работа с паметта или пък за файловата система. Очевидно винаги мога да ги викам по адрес обаче не е сигурно че ще са на същия адрес в бъдеще при нова версия на фърмуера. Рапър функция също е не е възможно понеже са много и най-различни.
Някакви други идеи да подхвърлите?

Автор:  ps66 [ Съб Окт 05, 2019 12:12 pm ]
Заглавие:  Re: Как да направя биос?

jump func1
jump func2
jump func3
...

Автор:  TheWizard [ Съб Окт 05, 2019 12:17 pm ]
Заглавие:  Re: Как да направя биос?

Външните програми какво са
нови узер апликации?
как се компилират
има ли flash ресурс

Автор:  palavrov [ Съб Окт 05, 2019 12:37 pm ]
Заглавие:  Re: Как да направя биос?

Ако процесорът има инструкции за прекъсвания можеш да ги използваш за унификация - както е примерно при х86.
Ако няма тогава е вариант както по горе ПС66 е написал на фиксирани адреси да имаш едни jmp таблици или пък направо адреси с които да унифицираш системната функционалност.
Трети вариант е да имаш само една входна точка и да предаваш в някой регисър коя точно системна функция искаш да се изпълни + необходимите и параметри в други регистри.
Четвърти вариант за да се спести малко код при условие, че номера на системната функция общо взето е константа да не хабиш инструкция и регистър за него ами да го вкараш в кода непосредствено след съответният int/call и да си се взима от там пък адреса за връщане да се модифицира така за да го прескочи, абе като, че ли малко код ще е по ясен:

Код:
    OPEN equ 1
    CLOSE equ 2
    ....
    call sysrequest
    db OPEN
    call sysrequest
    db CLOSE


Та това безумие, ще спести някой друг байт но прави много тегаво интегрирането със C/C++ компилатор - но все пак е доста често срещан подход при 8 битови ОС

Автор:  Н'бабане Гт'муан'га [ Съб Окт 05, 2019 2:30 pm ]
Заглавие:  Re: Как да направя биос?

Мда... супер. Това с таблицата ще се окаже решение. Мерси!

Автор:  TheWizard [ Съб Окт 05, 2019 2:37 pm ]
Заглавие:  Re: Как да направя биос?

firmware независимо апи baremetal

CORE SIDE
Код:
core_api[] // сортирано по hash, за бързо намиране с последователно приближение
{
  hash_string_memset, core_function_memset,
  hash_string_strlen, core_function_strlen,
  hash_string_strstr, core_function_strstr,
  ...
}

void * get_api(const char * str)
{
    return find_hash( calc_hash( str ) ); // търси core_function_XXX от таблицата core_api[] с последователно приближение
}

init_execute_app( app_address )
...


USER SIDE
Код:
{
    първoначално инициализиране на user application init_execute_app()
    clr bss
    set variables
    m_get_api = core get_api()
   
    // инит VA
    printf = core printf()
    sprintf = core sprintf()
}

void * memset ( void * ptr, int value, size_t n )
{
    static void * m_memset = NULL;
    if ( m_memset )
    {
        return m_memset(p, v, n);
    } else {
        if (( m_memset = m_get_api( "memset" ) ))
            return m_memset(p, v, n);       
    }
    abort();
}

strlen()...
strstr()...


Автор:  palavrov [ Съб Окт 05, 2019 6:51 pm ]
Заглавие:  Re: Как да направя биос?

Да не забравиш да сложиш някъде версия на АПИ-то за да може за в бъдеще да има някаква защита ако се пуска програма на стар БИОС който не поддържа необходимата функционалност.

Автор:  Реконструктор [ Вто Окт 15, 2019 5:41 pm ]
Заглавие:  Re: Как да направя биос?

Правиш 1 ф-я с константен адрес, който не променяш никога. Ф-я от вида:

Код:
int biosCall(int func, void* in, void *out);


пример:

Код:
struct DATETIME dt;

biosCall(GET_CURRENT_TIME, NULL, &dt);

int temp;
int which_core = 0;

biosCall(GET_CORE_TEMPERATURE, &which_core, &temp);


Автор:  Н'бабане Гт'муан'га [ Пон Окт 21, 2019 4:44 pm ]
Заглавие:  Re: Как да направя биос?

Дааа... това се оказа интересен проблем. Значи таблицата с входни точки на всички функции и важни променливи ми е в рома на фърмуера. Сега искам да напиша едно "Ollo World!" и за целта трябва да я импортна в юзърската ми програма. Хедър файла съм го подготвил, обаче тук възникна интересния проблем - как да обявя функциите така че адресите им да са според таблицата?? XC8 има параметър __at(address), обаче това ще насочи функцията към съответния адрес в таблицата, а всъщност там е нейния адрес. Демек на мен ми трябва __at(__at(address)) обаче това не минава за съжаление...
Някакви идеи/предложения? (по възможност без да правя таблица в рама)

Автор:  ps66 [ Пон Окт 21, 2019 5:52 pm ]
Заглавие:  Re: Как да направя биос?

Н'бабане Гт'муан'га написа:
Дааа... това се оказа интересен проблем. Значи таблицата с входни точки на всички функции и важни променливи ми е в рома на фърмуера. Сега искам да напиша едно "Ollo World!" и за целта трябва да я импортна в юзърската ми програма. Хедър файла съм го подготвил, обаче тук възникна интересния проблем - как да обявя функциите така че адресите им да са според таблицата?? XC8 има параметър __at(address), обаче това ще насочи функцията към съответния адрес в таблицата, а всъщност там е нейния адрес. Демек на мен ми трябва __at(__at(address)) обаче това не минава за съжаление...
Някакви идеи/предложения? (по възможност без да правя таблица в рама)

ако беше го направил, както ти показах - нямаше да имаш проблем (jump adr1, вместо само адр1)

Автор:  Н'бабане Гт'муан'га [ Пон Окт 21, 2019 6:24 pm ]
Заглавие:  Re: Как да направя биос?

ps66 написа:
ако беше го направил, както ти показах - нямаше да имаш проблем (jump adr1, вместо само адр1)


Не ми пречи да го променя в рома... Аз да си призная чак сега се усетих какво си имал предвид

Автор:  palavrov [ Пон Окт 21, 2019 11:27 pm ]
Заглавие:  Re: Как да направя биос?

Това което ти трябва е да извикаш функция през указател - което може и да не е особенно ефективно като асемблерски инструкции според архитектурата, та затова виж дизасм и променяй докато не започне да те кефи резултата.


Съвсем примерен вариант, без претенции за коректност и дали въобще ще се компилира:
Код:

sruct syscalls {
   void (*print)(const char * msg),
   char (*getc)(void),
   ...
} syscalls __at(address);

syscalls.print("Hello, world!");

Автор:  Н'бабане Гт'муан'га [ Вто Окт 22, 2019 12:32 pm ]
Заглавие:  Re: Как да направя биос?

palavrov написа:
Това което ти трябва е да извикаш функция през указател - което може и да не е особенно ефективно като асемблерски инструкции според архитектурата, та затова виж дизасм и променяй докато не започне да те кефи резултата.


Съвсем примерен вариант, без претенции за коректност и дали въобще ще се компилира:
Код:

sruct syscalls {
   void (*print)(const char * msg),
   char (*getc)(void),
   ...
} syscalls __at(address);

syscalls.print("Hello, world!");



Това е супер идея! Ще го пробвам. Малко ме притеснява дали така ще минат и системните променливи, но ще пробвам...

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/