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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 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,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
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,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 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.RU
 
Регистрация: 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,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 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, время: 12:28.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot