Си для МК

Другие микроконтроллеры и микропроцессоры, не попавшие в предыдущие разделы

Moderator: Shaos

Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Приятно был удивлен что Си делает такое:

Code: Select all

#define F (*(void(*)(int,int,int)) 0x10000)
F(1,2,3);
тоесть вызывается функция с тремя параметрами, возвращающая ничего по адресу 0x10000

а как сделать переход на си по определённому адресу? :wink:
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:Приятно был удивлен что Си делает такое:

Code: Select all

#define F (*(void(*)(int,int,int)) 0x10000)
F(1,2,3);
тоесть вызывается функция с тремя параметрами, возвращающая ничего по адресу 0x10000

а как сделать переход на си по определённому адресу? :wink:
Тебя интересует 16-битный или 32-битный режим? Если речь идёт о ваткомовской флат-модели, то тебе надо перейти внутри 4-гигабайтного сегмента программы или наружу? Наружу сильно сложнее как я понимаю, но в крайнем случае можно на встроенном асме что-то воткнуть...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: Тебя интересует 16-битный или 32-битный режим? Если речь идёт о ваткомовской флат-модели, то тебе надо перейти внутри 4-гигабайтного сегмента программы или наружу? Наружу сильно сложнее как я понимаю, но в крайнем случае можно на встроенном асме что-то воткнуть...
Нет, тут речь идёт о физическом адресе:) Как на сях организовать переход? (без асм-вставок)
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Ну допустим мне надо осуществить переход внутри сегмента 4Гб
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:Ну допустим мне надо осуществить переход внутри сегмента 4Гб
Хм, в ваткоме goto требует только имя и такая метка может быть только в пределах видимости... А зачем тебе такие проивзольные переходы? Допустим в микроконтроллерах их можно себе представить, а в PC зачем?
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: А зачем тебе такие проивзольные переходы? Допустим в микроконтроллерах их можно себе представить, а в PC зачем?
Для написания загрузчиков в контроллерах!
Известен начальный адрес загрузчика, адрес приложения выбирается.
Загрузчик должен с UART'а считать код и записать его в память микроллера. И передать коду управление. Поставщик кода - Вин32 прога :)
У меня пока всё работает с вызовом функции кода, в идеале нужен переход на фрагмент кода - тоесть возврата не будет(да и стек экономится ;)
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:
Shaos wrote: А зачем тебе такие проивзольные переходы? Допустим в микроконтроллерах их можно себе представить, а в PC зачем?
Для написания загрузчиков в контроллерах!
Известен начальный адрес загрузчика, адрес приложения выбирается.
Загрузчик должен с UART'а считать код и записать его в память микроллера. И передать коду управление. Поставщик кода - Вин32 прога :)
У меня пока всё работает с вызовом функции кода, в идеале нужен переход на фрагмент кода - тоесть возврата не будет(да и стек экономится ;)
Ну вызови функцию и не делай return - делов то ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: Ну вызови функцию и не делай return - делов то ;)
при вызове функции без праметров в стек заносится адрес возврата. Меня жаба давит, что стек незначительно, но расходуется. Даже если перетру его настройкой сегментов - грязно это!
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:
Shaos wrote: Ну вызови функцию и не делай return - делов то ;)
при вызове функции без праметров в стек заносится адрес возврата. Меня жаба давит, что стек незначительно, но расходуется. Даже если перетру его настройкой сегментов - грязно это!
Если у тебя PC, то 4 байта - фигня
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: Если у тебя PC, то 4 байта - фигня
Либо я хреново объясняю, либо меня читают невнимательно ;)
Ну конечно же такие трюки мне восстребованы в контроллере!!!
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:
Shaos wrote: Если у тебя PC, то 4 байта - фигня
Либо я хреново объясняю, либо меня читают невнимательно ;)
Ну конечно же такие трюки мне восстребованы в контроллере!!!
Тогда при чём здесь C для DOS (см. название темы)? ;)

В Си для контроллера должна быть возможность задавать непостредственно адрес
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: Тогда при чём здесь C для DOS (см. название темы)? ;)
ну не заводить же тему "Си для МК" :)
Форум и так пухнет от избытка тем, поэтому и загружается плохо
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:
Shaos wrote: Тогда при чём здесь C для DOS (см. название темы)? ;)
ну не заводить же тему "Си для МК" :)
Форум и так пухнет от избытка тем, поэтому и загружается плохо
А почему бы и не завести? ;)

У меня всё грузится быстро
Я тут за главного - если что шлите мыло на me собака shaos точка net
bar
Senior
Posts: 185
Joined: 07 Aug 2006 10:18

Post by bar »

Romanich wrote: а как сделать переход на си по определённому адресу? :wink:
читай внимательно документацию на компилятор. в стандарте, по-моему, такого нету. а вот в компиляторе -- может и есть. по-крайней мере, gcc умеет адреса меток в указатели складывать, и наверное это значит, что можно адрес в goto использовать.
SfS
Doomed
Posts: 491
Joined: 16 Apr 2005 22:35
Location: Томск

Post by SfS »

Romanich wrote:
Shaos wrote: Ну вызови функцию и не делай return - делов то ;)
при вызове функции без праметров в стек заносится адрес возврата. Меня жаба давит, что стек незначительно, но расходуется. Даже если перетру его настройкой сегментов - грязно это!
Берёшь gcc (avr-gcc или arm-elf-gcc).

1. Как на С перейти по произвольному адресу :

((void (*)())(0x1000))(); - переходит по адресу 0x1000.

2. Насчёт стека
void dummy() __attribute__ ((naked));
void dummy()
{
/* тело процедуры */
}

Атрибут naked говорит компилятору, что процедура "голая", то есть при входе в неё НИЧЕГО на стек не кладётся, а при возврате - не берётся...