Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Как в Си организовать косвенный переход?

Непрочитано 24.08.2011, 00:14  
_Слон_
Прописка
 
Аватар для _Слон_
 
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
_Слон_ на пути к лучшему
По умолчанию Как в Си организовать косвенный переход?

Задача для AVR. В программе нужно осуществить переход по адресу, который хранится в епроме. В ассемблере для этого есть команда IJMP.
А как сделать на Си? Подскажите, пожалуйста!
Реклама:
_Слон_ вне форума  
Сказали "Спасибо" _Слон_
warel (28.06.2019)
Непрочитано 24.08.2011, 01:40  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Например так:
Код:
unsigned int FuncAddr;

...
{
    FuncAddr = eeprom_read(...);
    ...
   ((void(*)(void))FuncAddr)();  // Вызов функции

}
или так:
Код:
void (*ptrFunc)(void);
int FuncAddr;
...
{
    FuncAddr = eeprom_read(...);
    ...
   ptrFunc = (void(*)(void))FuncAddr;  
   ptrFunc(); // Вызов функции

}
testerplus вне форума  
Эти 3 пользователя(ей) сказали Спасибо testerplus за это сообщение:
nml (24.08.2011), warel (28.06.2019), _Слон_ (24.08.2011)
Непрочитано 24.08.2011, 14:52  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Просто беда, если пытаются писать ASM программу средствами языка Си.
Зачем обязательно адрес хранить. Храните номер вызываемой ф-ции и вызов согласно номеру. Если при этом вы поименуете выши номера ф-ций, то программа станет более понятной и наглядной.
Нет ну конечно, если стоит задача чтобы в вашей программе никто не разобрался, то тогда можно хранить указатель на указатель на адрес вызова со смещением написанном в отдельном поле 24c512... Тогда уж гарантировано ...
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
warel (28.06.2019)
Непрочитано 24.08.2011, 16:13  
_Слон_
Прописка
 
Аватар для _Слон_
 
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
_Слон_ на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Спасибо. А как задать нужный адрес? Немного поясню. У меня в программе много небольших менюшек. Нужно, чтобы при попадании в меню его адрес сохранялся в епроме, а потом при включении устройства сразу выбиралось нужное меню.
Вот так я вызываю функцию по адресу FuncAddr:

eerpom unsigned int FuncAddr; // объявляем переменную FuncAddr
........

((void(*)(void))FuncAddr)(); /* Вызов функции по адресу,
содержащемуся в переменной FuncAddr */

Правильно?

А вот, например, сама функция:
void menu1 (void)
{
...
}
Как вычислить ее адрес?
FuncAddr=&menu1; // так не получается
_Слон_ вне форума  
Сказали "Спасибо" _Слон_
warel (28.06.2019)
Непрочитано 24.08.2011, 16:31  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Объявите меню-переменную, и сохраняйте её, а все меню пронумеруйте... По включению считываете её значение и переходите на меню с считаным номером...
st_1 вне форума  
Эти 2 пользователя(ей) сказали Спасибо st_1 за это сообщение:
warel (28.06.2019), _Слон_ (24.08.2011)
Непрочитано 24.08.2011, 16:32  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Код:
void Menu1(void)
{
    ...
}    

void Menu2(void)
{
    ...
}

void Menu3(void)
{
    ...
}

void Menu4(void)
{
    ...
}

const void (*pMenu[4])() = {&Menu1,&Menu2,&Menu3,&Menu4};

void ddd(void)
{
    BYTE Number = eeprom_read(...);;
    (pMenu[Number])();
}
realid вне форума  
Эти 2 пользователя(ей) сказали Спасибо realid за это сообщение:
warel (28.06.2019), _Слон_ (24.08.2011)
Непрочитано 24.08.2011, 16:34  
_Слон_
Прописка
 
Аватар для _Слон_
 
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
_Слон_ на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Сообщение от SasaVitebsk Посмотреть сообщение
Просто беда, если пытаются писать ASM программу средствами языка Си.
Зачем обязательно адрес хранить. Храните номер вызываемой ф-ции и вызов согласно номеру. Если при этом вы поименуете выши номера ф-ций, то программа станет более понятной и наглядной.
Нет ну конечно, если стоит задача чтобы в вашей программе никто не разобрался, то тогда можно хранить указатель на указатель на адрес вызова со смещением написанном в отдельном поле 24c512... Тогда уж гарантировано ...

Наверное, со-стороны это действительно смешно. Я на Си только недавно начал писать, до этого на ассемблере больше...
_Слон_ вне форума  
Сказали "Спасибо" _Слон_
warel (28.06.2019)
Непрочитано 24.08.2011, 18:00  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Посмотрите эту ветку ...
http://electronix.ru/forum/index.php...%F5%E8%FF&st=0
Там есть и готовые решения и примеры... На основе этого можно написать своё меню с иерархией и функционалом, удобным для вас.
Можно также поискать "микроменю".
Я делал своё с иерархической структурой и графикой. Естественно некоторые пункты меню обслуживаются уникальными п/п, а некоторые стандартными (например листание, подменю, редактирование полей). Я всё это увязал. Всё равно ведь пункт меню и обработчик увязаны на этапе компиляции. Поэтому нет смысла хранить адрес обработчика. Достаточно стек вызывов (историю вложений) - то бишь номера пунктов меню которые нажимались и текущий номер меню (для отображения курсора) ....
Не делайте сложно ... сложно не значит правильно ... Чем стройнее алгоритм и проще, тем надёжнее работа программы ...
Я бы наказывал программистов (вне зависимости от того на чём они пишут ASM или Си) за применение прямых ссылок с передачей их из внешних источников. Имейте ввиду EEPROM - это внешнее к процессору устройство ... Здесь один профессионал разрешает модификацию памяти однокристалки по модбасу ...
SasaVitebsk вне форума  
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
warel (28.06.2019), _Слон_ (24.08.2011)
Непрочитано 24.08.2011, 18:22  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Сообщение от SasaVitebsk Посмотреть сообщение
Я всё это увязал.
Не может быть!
realid вне форума  
Сказали "Спасибо" realid
warel (28.06.2019)
Непрочитано 24.08.2011, 19:21  
_Слон_
Прописка
 
Аватар для _Слон_
 
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
_Слон_ на пути к лучшему
По умолчанию Re: Как в Си организовать косвенный переход?

Сообщение от SasaVitebsk Посмотреть сообщение
Посмотрите эту ветку ...
http://electronix.ru/forum/index.php...%F5%E8%FF&st=0
Там есть и готовые решения и примеры... На основе этого можно написать своё меню с иерархией и функционалом, удобным для вас.
Можно также поискать "микроменю".
Я делал своё с иерархической структурой и графикой. Естественно некоторые пункты меню обслуживаются уникальными п/п, а некоторые стандартными (например листание, подменю, редактирование полей). Я всё это увязал. Всё равно ведь пункт меню и обработчик увязаны на этапе компиляции. Поэтому нет смысла хранить адрес обработчика. Достаточно стек вызывов (историю вложений) - то бишь номера пунктов меню которые нажимались и текущий номер меню (для отображения курсора) ....
Не делайте сложно ... сложно не значит правильно ... Чем стройнее алгоритм и проще, тем надёжнее работа программы ...
Я бы наказывал программистов (вне зависимости от того на чём они пишут ASM или Си) за применение прямых ссылок с передачей их из внешних источников. Имейте ввиду EEPROM - это внешнее к процессору устройство ... Здесь один профессионал разрешает модификацию памяти однокристалки по модбасу ...
Согласен. Умение написать грамотный и компактный код-это целое искусство, и этому нужно учиться.
Всем спасибо, я разобрался.
_Слон_ вне форума  
Сказали "Спасибо" _Слон_
warel (28.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Как организовать усиление аналоговых сигналов с нескольких тензодатчиков и передачу их на USB? Saurgan Измерительное оборудование 8 08.10.2010 01:11
Особенности звучания УМЗЧ с полевыми транзисторами falkonist Аудиотехника 42 22.01.2009 02:05
Как организовать тип String в GCC? IgorAVR2 Микроконтроллеры, АЦП, память и т.д 2 17.03.2008 23:57


Часовой пояс GMT +4, время: 11:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.