Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24.08.2011, 00:14
|
|
Прописка
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
|
Как в Си организовать косвенный переход?
Задача для AVR. В программе нужно осуществить переход по адресу, который хранится в епроме. В ассемблере для этого есть команда IJMP.
А как сделать на Си? Подскажите, пожалуйста!
|
|
|
|
24.08.2011, 01:40
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
Например так:
Код:
|
unsigned int FuncAddr;
...
{
FuncAddr = eeprom_read(...);
...
((void(*)(void))FuncAddr)(); // Вызов функции
} |
или так:
Код:
|
void (*ptrFunc)(void);
int FuncAddr;
...
{
FuncAddr = eeprom_read(...);
...
ptrFunc = (void(*)(void))FuncAddr;
ptrFunc(); // Вызов функции
} |
|
|
|
Эти 3 пользователя(ей) сказали Спасибо testerplus за это сообщение:
|
|
|
24.08.2011, 14:52
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
Просто беда, если пытаются писать ASM программу средствами языка Си.
Зачем обязательно адрес хранить. Храните номер вызываемой ф-ции и вызов согласно номеру. Если при этом вы поименуете выши номера ф-ций, то программа станет более понятной и наглядной.
Нет ну конечно, если стоит задача чтобы в вашей программе никто не разобрался, то тогда можно хранить указатель на указатель на адрес вызова со смещением написанном в отдельном поле 24c512... Тогда уж гарантировано ...
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
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; // так не получается
|
|
|
|
24.08.2011, 16:31
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
Объявите меню-переменную, и сохраняйте её, а все меню пронумеруйте... По включению считываете её значение и переходите на меню с считаным номером...
|
|
|
Эти 2 пользователя(ей) сказали Спасибо st_1 за это сообщение:
|
|
|
24.08.2011, 16:32
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
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])();
} |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо realid за это сообщение:
|
|
|
24.08.2011, 16:34
|
|
Прописка
Регистрация: 25.02.2011
Сообщений: 122
Сказал спасибо: 61
Сказали Спасибо 23 раз(а) в 19 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
|
|
|
|
24.08.2011, 18:00
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
Посмотрите эту ветку ...
http://electronix.ru/forum/index.php...%F5%E8%FF&st=0
Там есть и готовые решения и примеры... На основе этого можно написать своё меню с иерархией и функционалом, удобным для вас.
Можно также поискать "микроменю".
Я делал своё с иерархической структурой и графикой. Естественно некоторые пункты меню обслуживаются уникальными п/п, а некоторые стандартными (например листание, подменю, редактирование полей). Я всё это увязал. Всё равно ведь пункт меню и обработчик увязаны на этапе компиляции. Поэтому нет смысла хранить адрес обработчика. Достаточно стек вызывов (историю вложений) - то бишь номера пунктов меню которые нажимались и текущий номер меню (для отображения курсора) ....
Не делайте сложно ... сложно не значит правильно ... Чем стройнее алгоритм и проще, тем надёжнее работа программы ...
Я бы наказывал программистов (вне зависимости от того на чём они пишут ASM или Си) за применение прямых ссылок с передачей их из внешних источников. Имейте ввиду EEPROM - это внешнее к процессору устройство ... Здесь один профессионал разрешает модификацию памяти однокристалки по модбасу ...
|
|
|
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
|
|
|
24.08.2011, 18:22
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Как в Си организовать косвенный переход?
Сообщение от SasaVitebsk
|
Я всё это увязал.
|
Не может быть!
|
|
|
|
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 - это внешнее к процессору устройство ... Здесь один профессионал разрешает модификацию памяти однокристалки по модбасу ...
|
Согласен. Умение написать грамотный и компактный код-это целое искусство, и этому нужно учиться.
Всем спасибо, я разобрался.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:28.
|
|